1.Java面向对象三大特性
1.1 继承
- Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。
- 子类如果对父类的方法不满意可以自己编写继承的方法,即方法重写。
- 重载与重写的区别:
- 继承的初始化顺序:
- 初始化父类再初始化子类;先执行初始化对象中属性,再执行构造方法的初始化
- 实例化一个子类:父类对象属性初始化–>父类对象构造方法–>子类对象属性初始化–>子类对象构造方法
- final关键字:
- final 修饰类,则该类不允许被继承。
- final 修饰方法,则该方法不允许被覆盖(重写)。
- final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在**构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),**且初始化之后就不能改了,只能赋值一次。final属性没有set方法。
- final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
- final 修饰类,则该类不允许被继承。
- super关键字
- 子类的构造的过程当中必须调用父类的构造方法
- 如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。
- 没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。若此时父类没有无参的构造方法,则编译出错。
1.2 多态
-
引用多态
- 父类的引用可以指向本类的对象;Father f1=new Father();
- 父类的引用可以指向子类的对象;Father f2=new Son();
- 子类的引用不能用来指向父类的对象;Son s=new Father();x
-
方法多态
- 本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。
- 创建本类对象时,调用的方法为本类方法;f1.run()调用Father的方法
- 创建子类对象时,调用的方法为子类重写的方法或者继承的方法;f2.run()调用Son的方法
-
引用类型转换
-
向上类型转换(隐式/自动类型转换):父类的引用可以指向子类的对象
-
向下类型转换(强制类型转换):
Dog dog=new Dog(); Animal animal=dog; Dog dog2=animal;//错误 Dog dog2=(Dog)animal;//正确 //如果父类引用没有指向该子类的对象,则不能向下类型转换 //父类的引用指向其他子类的对象,则不能通过强制转为该子类的对象
-
instanceof运算符,来解决引用对象的类型
-
-
重写和重载
- 从jvm实现的角度来看,重写又叫运行时多态,编译时看不出子类调用的是哪个方法,但是运行时操作数栈会先根据子类的引用去子类的类信息中查找方法,找不到的话再到父类的类信息中查找方法。 而重载则是编译时多态,因为编译期就可以确定传入的参数组合,决定调用的具体方法是哪一个了。