1、Java中的名称命名规范
- 包名:多单词组成时所有字母都小写:xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词都用下划线连接:XXX_YYY_ZZZ
2、基本数据类型之间的运算规则
前提:这里讨论只是7种基本数据类型变量间的运算,不包含boolean类型的。
自动类型提升:
结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
byte、char、short –> int –> long –> float –> double
特别的:当byte、char、short三种类型的变量做运算时,结果为int型强制类型转换:自动类型提升运算的逆运算
需要使用强转符:()
注意点:强制类型转换,可能导致精度损失。
说明:此时的容量大小指的是,表示数的范围的大和小。比如float容量要大于long的容量
3、比较运算符:开发中推荐使用 && 和 ||
区分& 与 &&
- & 与 && 的远算结果相同
- 当符号左边是true时,二者都会执行符合右边的运算
- 当符号左边是false时,& 会继续执行符号右边的运算。&& 不再执行符号右边的运算。
- | 与 || 的远算结果相同
- 当符号左边是false时,二者都会执行符合右边的运算
- 当符号左边是true时,| 会继续执行符号右边的运算。|| 不再执行符号右边的运算。
4、面向对象内存解析
堆(heap):凡是new出来的结构(对象的实体、数组实体)都放在堆空间中。包括对象中的属性
栈(stack):方法内定义的变量,存放在栈中。
方法区(method area):存放类的模板。比如:Person类的模板
- 属性和局部变量的不同点
- 类中声明的位置的不同:
属性:声明在类内,方法外的变量
局部变量:声明在方法、构造器内部的变量 - 在内存中分配的位置不同:
属性:随着对象的创建,存储在堆空间中
局部变量:存储在栈空间 - 生命周期不同:
属性:随着对象的创建而创建,随着对象的消亡而消亡
局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡 - 作用域:
属性:在整个类的内部都是有效的
局部变量:仅限于声明局部变量所在的方法(或构造器、代码块)内 - 是否可以有权限修饰符(public、protected、private)进行修饰:
属性:可以
局部变量:不能 - 是否有默认值:
属性:都有默认初始化值,意味着,如果没有给属性进行显式初始化赋值,则会有默认初始化值。
局部变量:都没有默认初始化值,意味着,在使用局部变量之前,必须要显式赋值。
- 类中声明的位置的不同:
5、面向对象方法
- 方法的重载
两同:同一个类、相同的方法名
一不同:参数列表不同。(1)参数个数不同(2)参数类型不同
注意:方法的重载与形参的名、权限修饰符、返回值类型都没有关系
举例:public void add(int m, int n){} 与 public int add(int i, int j){}是同一个函数,不是方法的重载。因为对于编译器来说,方法名相同且形参列表相同(相同的形参个数和类型),则这些方法是相同的 - 方法的值传递机制
对于方法内声明的局部变量来说,如果出现赋值操作- 如果是基本数据类型的变量,则将此变量保存的数据值传递出去。
- 如果是引用数据类型的变量,则将此变量保存的地址值传递出去。
形参:在定义方法时,方法名后面括号()中声明的变量称为形式参数,简称形参。
实参:在调用方法时,方法名后面括号()中的使用的值/变量/表达式称为实际参数,简称实参。
实参给形参赋值的过程: - 如果形参是基本数据类型的变量,则将实参保存的数据值赋值给形参
- 如果形参是引用数据类型的变量,则将实参保存的地址值赋值给形参
6、方法重写应遵循的规则
- 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同
- 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
- 子类不能重写父类中声明为private权限修饰符的方法
- 关于返回值类型
- 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void
- 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的返回值类型相同
- 父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被重写的方法的返回值类型相同 或 是被重写方法的返回值类型的子类
- 子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类父类被重写的方法抛出的异常类型的子类
7、super调用构造器
① 子类继承父类时,不会继承父类的构造器。只能通过”super(形参列表)”的方式调用父类指定的构造器。
② 规定:”super(形参列表)”,必须声明在构造器的首行。
③ 我们前面讲过,在构造器的首行可以使用”this(形参列表)”,调用本类中重载的构造器, 结合②,结论:
在构造器的首行,”this(形参列表)” 和 “super(形参列表)”只能二选一。
④ 如果在子类构造器的首行既没有显示调用”this(形参列表)”,也没有显式调用”super(形参列表)”, 则子类此
构造器默认调用”super()”,即调用父类中空参的构造器。
⑤ 由③和④得到结论:子类的任何一个构造器中,要么会调用本类中重载的构造器,要么会调用父类的构造
器。 只能是这两种情况之一。
⑥ 由⑤得到:一个类中声明有n个构造器,最多有n-1个构造器中使用了”this(形参列表)”,则剩下的那个一定
使用”super(形参列表)”。
我们在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接的调用到父类的构造器。也正因为调用过父类的构造器,我们才会将父类中声明的属性或方法加载到内存中,供子类对象使用。