英语,是由26个英文字母组成的.不同的字符排雷组合成单词,不同的单词用各种语法知识,组成一句话让人理解.
编程就是在用编程语言去描述这个世界的事物,包括状态,属性,行为逻辑.
当事物本身很复杂,依赖很多,就需要很多很多的代码来描述.
最终构成一个完整的程序来完成开发者的需求.
常见的软件中,比如记录账户信息, 下单买东西,支付等.
类是一个模板,描述一类对象的行为和状态. 现实世界中就是各种事物的定义.比如定义人,那么应该包括名字,昵称,性别,年龄.
成员变量就是类中定义的现实世界的各种属性(名字,昵称,性别等).
方法就是类中的行为. 行为的最终目的都是增加,删除,修改,查询成员变量的值. 从而将结果传递给调用者.结果不一定有值,也可能只是方法行为的结束.
对象是类的一个实例,有属性状态和行为. 使用关键字new创建对象.现实中, 比如你是人这个定义的实例.你的某品牌的手机是手机这个定义的实例.里面手机的颜色,名字,尺寸就是状态. 打电话,发短信,上网就是行为.
所有的Java程序的运行都需要起始点入口,都是从 public static void main(String[] args) {…} 方法开始的.
当我们编写好以上的内容,就会产生一个个文件(.java后缀),源文件名必须和主类名相同.最终源文件被编译成字节码(.class后缀).就可以运行这些字节码.
代码请自行下载Github项目. 项目下载地址在下方小程序中获得.
如上图,
第1步: 先定义了package(包名), 右键java文件夹 --> New --> Pacakage.
包就是文件夹目录,这是为了方便分类管理越来越多的类. 包只从 src/main/java以后开始.属于相对路径的概念.
package github.brad.easy.a005; //包名以关键字 package 开始.位置放在最上面.
然后新建类 A01_Person. 这里的"A01_"前缀是为了便于文章便于区分,开发中不需要.
public class 类的名称 {
//花括号里面添加成员变量和方法.
}
第2步: 添加成员变量和方法
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量的定义,需要根据项目需求,决定.不是一层不变的.不同的产品,业务,对于用户信息的要求也不同.有些需要实名制,有些需要有照片,有些需要有手机号等.
public class A01_Person {
String myName;
String nickName;
String sex;
int age;
}
**第3步:**类中的方法行为
printName()打印了一下类中的成员变量.
getAge() , 返回年龄.
public class A01_Person {
String myName;
String nickName;
String sex;
int age;
public void printName(){
System.out.println(myName);
System.out.println(nickName);
}
public int getAge(){
return age;
}
}
第4步: main函数, 程序的入口.是固定的格式,名字是不可以修改的.
public static void main(String[] args) {}
即使一个最简单的类,也可以当作程序运行的.
第5步: 创建对象
使用关键字new ,调用构造方法A01_Person() ,当没有任何构造方法的时候,会有一个同名的默认构造方法.构造方法和方法还是有一些区别的,后面详细介绍它们的概念就会知道.
创建对象,自然是要有仪式的. new就是仪式的开端, 构造方法就是仪式的过程.
创建好对象后,我们需要复制给一个叫做A01_Person类的引用变量hello. 这个hello名字是随便起的.合理起名应该是person或者a01_Person. 这也说明起一个好名字的重要性,不然让人难以理解.
如果不起名字,你在下面就没办法赋值.
public static void main(String[] args) {
A01_Person hello = new A01_Person(); //使用关键字new,创建对象.
new A01_Person();//孤魂
new A01_Person();//野鬼
}
第6步: 给对象赋值
public static void main(String[] args) {
A01_Person hello = new A01_Person(); //使用关键字new,创建对象.
new A01_Person();//孤魂
new A01_Person();//野鬼
hello.age = 100; //给对象中的成员变量赋值.这些值可以从各种数据存储方式中查找获取,以下类似的都是赋值行为.开始.
hello.sex = "男";
hello.myName = "柳五苏世";
hello.nickName = "Brad"; //给对象中的成员变量赋值.结束.
}
第7步: 调用方法-对象的行为
public static void main(String[] args) {
A01_Person hello = new A01_Person(); //使用关键字new,创建对象.
hello.printName(); //调用对象的方法,行为.
int age = hello.getAge(); //调用对象的方法, 获取值.
System.out.println("age:" + age); // print 打印出来.
}
第8步: 右键A01_Person类, run运行.
第9步: 编译好.class为后缀的字节码,并运行打印输出.
到这里你就看到一个很简单的Java程序从创建到运行,到结束.
注释就是对代码的解释。有时候也用来不执行某段代码。有如下两种注释方式。按情况使用。
快捷键: (下面的Ctrl是window系统的按键,Command是mac电脑的)
多行注释: (Ctrl/Command + Shift + /)
单行注释: (Ctrl/Command + /)
public class A08_Comment {
/*这是一个多行注释.
*打印Hello world的示例
*/
public static void main(String[] args) {
/*打印内容,多行注释.*/
//打印内容,单行注释.
System.out.println("Hello world, Mr/Ms.");
//System.out.println("注释掉这一行代码,不执行这行代码。");
/*System.out.println("注释掉多行代码,不执行这行代码1。");
code1...
code2...
code3...
System.out.println("注释掉多行代码,不执行这行代码2。");
*/
}
}
空格和Tab键只是为了让代码看起来好看些,舒服些。
代码风格一般就跟人的形象,不要太邋遢。整洁干净才让人喜欢,看了舒服。
public class A09_CodeStyle {
public static void main(String[] args) {System.out.println("看了舒服吗?");
System.out.println("看了舒服吗?");String c= "舒服吗?";
String a= "舒服吗?";String b= "舒服吗?";
System.out.println("这样才舒服。");
String d = "舒服,一行一句代码。";
String e = "舒服,变量和关键字等,用空格隔开。";
String f = "舒服,用缩进,像文章段落一样。";
String g = "当不知道如何排版的时候: IDEA -> Code -> Reformat code (快捷键:Ctrl + Alt + L)";
System.out.println("舒服完了。" + g);
}
}
有关开发中IDEA的基本用法,在学完本篇后,参见idea分类的文章**《IDEA的基本用法》**。
代码中的各种组成部分都需要名字. 比如类名,变量名,方法名.接口名,这些都称作标识符.
标识符的命名规则需要注意:
所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始.(一般不用美元符)
首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合(一般不用美元符)
关键字不能用作标识符
标识符是大小写敏感的
合法的标识符:
name,_name,$name,name1_,Name
非法的标识符:
123name, *name
类名:一般首字母大写.如果是多个单词组成,每个单词首字母大写,即驼峰法.例如: UserInformationClass
方法名: 所有的方法名都应该以小写字母开头。剩余部分遵循驼峰法。例如: getUserInformationMethod
成员变量和局部变量一般和方法名一样命名.
静态变量: 也叫类变量,一般大写,如果多个字母,使用下划线’_'分开.
之前我们提到过成员变量.实际上一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量,也叫静态变量,也声明在类中,方法体之外,但必须声明为 static 类型。
这几种变量的用途不太一样,从名字和定义也可以看出来.
几种变量的示例:
代码如下. 运行代码之后得到打印内容.
按照上图步骤,解释:
第1步: 可以看出来类变量是不需要创建对象就可以被访问的.
第2,3,4步: 创建对象时,先执行代码块,打印age. 然后再执行构造方法.打印name,age. 此时age在代码块中被赋值为1.
第5步:局部变量,也可以理解成临时变量.将对象中的age取出赋值给局部变量,然后再修改局部变量的值后,对象的值没有发生变化.
package github.brad.easy.a005;
public class A02_Person {
static int HEAD_NUMBER = 1; //头的个数
static int EYE_NUMBER = 2; //眼睛的个数
String name; //成员变量
int age; //成员变量
public A02_Person(){ //构造方法,没有使用默认的空构造方法.
System.out.println("构造方法开始.");
System.out.println("name:"+name);
System.out.println("age:"+age); //成员变量可以被类中的构造方法访问.
System.out.println("构造方法结束.");
}
{
System.out.println("代码块开始.");
System.out.println("age:"+age); //成员变量可以被类的语句块访问.
age = 1;
System.out.println("代码块结束.");
}
public int getAge(){
return age; //成员变量可以被类中的方法访问.
}
public static void main(String[] args) {
System.out.println("head number:" + A02_Person.HEAD_NUMBER); //此处请注意获取该静态变量的方式. 没有使用person.HEAD_NUMBER
System.out.println("eye number:" + A02_Person.EYE_NUMBER);
A02_Person person = new A02_Person(); //注意:代码块是在构造函数之前调用的.
person.age = 100;
int localVariable = person.getAge(); //局部变量,main也是方法.所有person,和localVariable 都是局部变量.
System.out.println("now age:"+localVariable);
localVariable = 10;
System.out.println("person age:" + person.age);
}
}
方法是语句的集合,多条语句放在一起完成一个功能.功能越复杂,方法语句越多.
方法也有对象方法和类方法.和变量相似,有成员变量和类变量.
方法主要是为了重用,就是写好特定功能,被其它地方可以重复调用,调用者不需要知道该功能的具体业务逻辑.
方法的定义:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
下面是一个代码例子,我们以银行中的用户信息为例,用户有账户余额,资产值,信用卡账单等数据:
第1步: 从数据库等地方获取到用户的数据信息,这里我们忽略获取过程,实例化用户,并赋值.有没有发现这一步用了很多行,比较繁琐.下面我们会介绍构造方法,来简化一下.
第2步: 如果直接用几个参数计算,也是可以的. 也可以调用方法去计算. 好处就是调用者不需要知道具体的计算净资产的逻辑.直接调用方法返回数据就可以.
第3步: 假设每个用户的信用卡总额度, 然后通过计算得到用户信用卡剩余额度.
再来一个相对抽象的方法示例:
第1步:创建对象的时候,使用了自定义的构造方法,下面会讲.
第2,3步: 注意它们的方法名是一样的,因为参数不同,从而使得它们不冲突,是唯一的.
第4步: 被注释掉的部分,和上面一样比较,返回值是不同的,但是同样会报错.
运行代码查看输出打印结果如下.
第1步: 使用无参构造方法,创建对象,直接打印可以看到,String类型的成员变量,初始化值都为null. int类型变量初始化值都为0.
这里说明一下,如果没有任何构造方法, 编译器会产生默认的无参构造方法. 如果有构造方法,将不再做这个事情.
也就是说如果你注释掉(Ctrl/Command + Shift + /)无参构造方法,那么第一步肯定会报错的.
第2步: 赋值后,打印.
第3步: 使用自定义的有参构造方法,创建对象,可以看到打印结果.传参进去的值都正确赋值了.参数个数和方法一样,按需要设置.
这里出现的this,意思是对象自己的意思.区别于传进来的参数名.你会发现参数名是和成员变量一样的.
为啥这样呢? 因为写构造方法时,就是为了给成员变量赋值,如果每个参数都从新命名,会很乱,你试一下就知道了.
当没有this的时候,获取的是最近的局部变量值. 有this表明是对象的成员变量值.
构造方法和方法是不一样的概念. 构造方法就是工厂制作产品汽车的过程行为. 而方法呢,是汽车的行为,开车,转弯,油门等.
在写法上有细微区别,要注意区分.
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
我们可以通过以下表来说明访问权限:
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N (见下面解释) | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
protected 需要从以下两个点来分析说明:
分别运行三个类的代码: A05_Person_Modifier_1_Public, A05_Person_Modifier_2_Default, A05_Person_Modifier_3_Test
运行可知基本用法.主要注意的就是私有变量不是谁都可以访问的. 不同包的可以自己试试.权限如上面的表格所写.
访问控制符的作用
为了防止别人调用你过度暴露提供的方法,造成不必要的数据问题.不该更改的数据,不提供方法和变量给外部直接访问.
一般成员变量都会设置为私有的.通过get/set方法提供给外部调用.
快捷生成这类代码的方式: 在类定义体中,右键鼠标 -> Generate…
可以选择生成Getter/Setter, Constructor(构造方法),还有一些其它的代码toString,equals/hashCode.
另外有些数据调用者并不关心,你暴露出来,会对调用者造成混淆,导致不知道使用哪个方法好.
static 修饰符,可以用来修饰类方法和类变量,也可以修饰类。
静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
static修饰符在访问控制修饰符的代码中,已有演示.运行代码即可.
下面这些保留字不能用于常量、变量等任何标识符的名称。有个印象就好.以后会学到.
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
default | 默认 | |
类、方法和变量修饰符 | abstract | 表明类或者成员方法具有抽象属性 |
class | 类 | |
extends | 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口 | |
final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变 | |
implements | 表明一个类实现了给定的接口 | |
interface | 接口 | |
native | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 | |
new | 用来创建新实例对象 | |
static | 表明具有静态属性 | |
strictfp | 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范 | |
synchronized | 表明一段代码需要同步执行 | |
transient | 声明不用序列化的成员域 | |
volatile | 表明两个或者多个变量必须同步地发生变化 | |
程序控制语句 | break | 提前跳出一个块 |
case | 用在switch语句之中,表示其中的一个分支 | |
continue | 回到一个块的开始处 | |
default | 默认,例如,用在switch语句中,表明一个默认的分支 | |
do | 用在do-while循环结构中 | |
for | 一种循环结构的引导词 | |
if | 条件语句的引导词 | |
else | 用在条件语句中,表明当条件不成立时的分支 | |
instanceof | 用来测试一个对象是否是指定类型的实例对象 | |
return | 从成员方法中返回数据 | |
switch | 分支语句结构的引导词 | |
while | 用在循环结构中 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 用在异常处理中,用来捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 | |
try | 尝试一个可能抛出异常的程序块 | |
包相关 | import | 表明要访问指定的类或包 |
package | 包 | |
基本数据类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 表明当前对象的父类型的引用或者父类型的构造方法 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 保留关键字,没有具体含义 |
const | 保留关键字,没有具体含义 | |
null | 空 |
运行BaseKnowledgeApplication类.
端口被占用
如果遇到如下错误:
Web server failed to start. Port 8080 was already in use.
标记1和3,表明在运行窗口中的程序.(Base Knowledge Application和 What Java Can Do Application)
标记2表明1的程序端口被占用了.
点击标记3,会发现标记4的位置为红色按钮, 点击关闭这个程序,就会释放端口.偶尔全部都关闭还不行,就重启开发工具,甚至重启电脑.
另外4标记上面的绿色按钮,是启动对应代码程序的快捷键.
访问后端获得数据
http://localhost:8080/a005/user //此处访问用户信息,不再是之前接口中手工写的字符串,而是直接返回了对象.
http://localhost:8080/a005/netAsset //前端调用后端,获取用户的净资产.
http://localhost:8080/a005/leftCredit //调用后端,获取用户剩余信用额度.
几个接口,模拟真实环境,将本篇学的内容,开发常用部分全部应用了一下.
扫码关注小程序,进群讨论提问,获取源代码.获得最新更新,关注下方公众号.
本文版权归作者所有,欢迎转载,但未经作者同意, 必须保留小程序和二维码,且在文章首行位置标注如下转载说明:
文章转载自 “原文链接URL”, 作者: 柳五苏世_Brad