1:自动类型提升:
byte,char ,short --> int --> long --> float --> double
特别说明:byte,short,char三种类型变量做运算时结果为 int 类型
2:整形常量默认为 int 类型
浮点型常量默认为double类型
例如:
float f1 = 12.3;
编译报错,因为类型不匹配
3:对象内存讲解
3.1:概念
3.2图例
4:变量
- 局部变量不能够使用权限修饰符
- 全局变量可以使用权限修饰符
- 局部变量没有默认初始化值,所以局部变量在使用前一定需要先赋值。
5:Java的权限修饰符
修饰符 | 内部类 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | yes | |||
缺省 | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
6:java关键字
-
this关键字:
当调用方法或属性时代表当前对象。
当调用构造器的时
1:在类的构造器中,可以显示的使用“this(形参列表)”方式,调用本类中的其他构造器。
2:构造器中不能通过“this(形参列表)”方式调用自己,否则或出现死循环。
3:不能两个构造器通过“this(形参列表)”方式互相调用 -
final关键字
1):被此关键字修饰的变量为常量。不能修改。所以也无set方法。
2):修饰一个类,则此类不能被其他类继承
3):修饰方法,则此方法不能被重写。
4) :修饰属性:可以考虑复制的位置有:显示初始化,代码块中初始化,构造器中初始化。 -
super关键字:可以调用父类中的方法或属性。
注意:
1:super不是一个对象的引用,不能将其赋给另一个对象变量,他只是一个指示编译器调用超类方法的特殊关键字。
2:super关键字也可如this一般调用父类的构造器。例如"super(形参)",可用于给父类中的私有变量赋值。使用super调用构造器的语句必须是子类构造器的第一条语句。
3:如果子类的构造器没有显示的调用父类的构造器,则将自动的调用超类默认的无参构造器。如果超类没有无参的构造器,并且在子类中的构造器又没有显示的调用超类的其他构造器,那么程序在编译的时候将报错。
4:在类的构造器里面,针对"this(形参列表)"或"super(形参)"只能二选一。
5:在构造器的首行,没有显示的声明"this(形参列表)“或"super(形参)”,则默认调用的是父类中的空参构造器:super()。
6: 在类的多个构造器中,至少有一个类的构造器中使用了"super(形参)",调用了父类的构造器。
7:面向对象的三大特征
7.1:封装性
7.2:继承性
好处:提高代码的复用性,减少代码的代码冗余
便于功能扩展
为之后的多态使用做铺垫
体现:
- 子类继承父类后,便获得了父类中声明的结构:属性,方法。
- 在子类中可以增加域,增加方法或覆盖超类中的方法,但是绝对不能删除继承的任何域和方法。
- 特别的:父类中声明为private的方法或属性,子类继承父类以后仍然认为获得了父类的私有结构。只是因为封装性的影响,使得子类不能直接调用父类的结构。但是可以借助共有接口来访问私有部分。
- 对于父类中的方法不能满足需求,可以提供新的方法覆盖父类中的方法。
- 一个子类只能继承一个父类,但一个父类可以派生出多个子类。
子类对象实例化的全过程
子类继承了父类,在声明子类的对象之后,会默认的调用父类的构造器将父类的属性或者方法加载进子类中。如果子类的构造器没有显示的调用父类的构造器,则将自动的调用超类默认的无参构造器。倘若子类没有显示的声明构造方法,则会默认的为子类添加上一个无参的构造方法。
7.3:多态性
重点:为什么要使用多态性
1:何为多态性:父类的引用指向子类的对象。
2:多态的使用:虚拟方法调用
有了对象的多态后,我们在编译期间只能调用父类中声明过的方法,但在运行期间,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边(只适应方法不适应属性。属性不存在覆盖一说。属性是编译运行都看左边)
3:多态的使用前提:1)类的继承关系。2)方法的重写(不重写的话,多态实现也没有意义)
4:虚拟方法调用
5:向下转型
上面说过的,有了对象的多态后,在编译其期间 我们只能调用父类声明过的方法。但是如果我们想要调用子类特有的方法,那么就需要使用向下类型转换。
例如:
Animal animal = new Cat();
((animal ) p1).play();
//play是Cat类的特有方法。类似于强制类型转换
8:方法重载与重写
-
重载的概念:方法名相同,但是参数不同或者参数的个数不同。
-
意义:重载是有好的,它不要求你在调用一个方法之前转换数据类型,它会自动地寻找匹配的方法。方法的重载是在编译时刻就决定调用哪个方法了,和重写不同。最最常用的地方就是构造器的重载。重载对于编写结构清晰而简洁的类有很大的作用。
1:重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
2: Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。 -
方法重写:重写即是覆盖(override或overwrite)。
用途:父类的方法不满足需求或需要对父类的方法进行扩展。
规则:
1:子类重写的方法名和参数列表与父类被重写的方法名和参数列表相同。
2:子类重写的方法的权限修饰符不小于父类的被重写的方法的权限修饰符。
特殊情况:子类不能重写父类中被修饰为private的方法。
3:返回值类型:- 父类被重写的返回值类型是void类型,则子类重写的方法返回值类型也只能是void类型。
- 父类被重写的返回值类型是Object类型,则子类重写的方法的返回值类型可以是object类型或其他的String或int等类型
- 父类被重写的方法返回值类型是基本数据类型(double),则子类重写的方法返回值类型必须是相同的类型。
- 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
- 静态方法不能被重写。
面试题:区分方法的重写和重载
答题点:
- 二者概念
- 重载和重写的具体规则
- 重载:不表现为多态性
- 重写:表现为多态性