最近刷了些java的面试题目,发现继承与多态这块知识点面的多些,总结整理一下
java面向对象的三大特性封装继承多态都是为了提高代码的复用率,使开发人员少写代码
1.掌握什么是继承与继承的特征
继承是指子类继承父类的非私有成员变量与方法,在子类中可以使用。
特征:特征有很多简述一些
1.Java是单继承多实现。一个子类最多继承一个父类,但可以实现多个接口
2.继承具有传递性(多重或多极继承)。如果C继承了B,B又继承了A,那么C也就继承了A的所有非私有成员变量与方法
3.基类派生出的子类具有可拓展性
2.掌握无参构造与有参构造
每一个类都有构造方法,如果不显示写的话,默认的是无参构造方法。为养成良好的编码习惯,我们应该在父类中写上无参构造方法
子类不能继承父类的构造方法
3.掌握类的加载顺序
首先找main函数入口,加载对应的类与static修饰的静态代码块至JVM的方法区中去(顺序父类至子类),接着去加载构造器(加载的同时会实例化对象,顺序父类至子类)。
总之父类的构造器加载与初始化都优于子类
public class Cat extends Animal { static{ System.out.println("子类的静态代码块加载了..."); } public Cat() { // 显式调用super() super("小狗"); System.out.println("子类的无参构造方法执行了..."); } public Cat(String name) { // 隐式调用super() System.out.println("子类的有参构造方法执行了..."); } public static void main(String[] args) { //首先加载父类与其静态代码块,在加载子类及其静态代码块。接着去加载构造器顺序由父类至子类 Animal cat = new Cat(); //同理可得 Animal cat2 = new Cat("小貓"); } } class Animal { private int num; private String name = "小猪"; public Animal(String name) { this.name = name; System.out.println("父类的有参构造方法执行了..." + this.name); } public Animal() { System.out.println("父类的无参构造方法执行了...."); } public static void say() { System.out.println("父类的静态方法hello!"); } static { say(); System.out.println("父类的静态代码块hi"); } }
PS:以上代码为自己原创,将上述代码能够理清楚,相信对类的加载顺序有一定的认知了,输出结果如下:
4.正确理解多态
首先多态有三要素:1.要有继承关系 2.要有子类重写父类成员方法 3.要有父类数据类型引用至子类
首先要清楚多态中的重写是不能够重写成员变量及satic修饰的成员变量或方法,它只能重写方法(多态是运行时动态绑定的,static是在编译时随类一起被静态绑定的)
public class Cat extends Animal { static void say(){ System.out.println("hi!"); } public void speak(){ System.out.println("你好,我是小猫"); } protected String name = "小猫"; static int num = 20; public static void main(String[] args) { Animal cat = new Cat(); Cat cat2 = new Cat(); System.out.println(cat.name+":"+cat.num); System.out.println(cat2.name+":"+cat2.num); cat.say(); cat.speak(); } } class Animal { protected String name = "小狗"; static int num = 10; static void say(){ System.out.println("hello"); } public void speak(){ System.out.println("你好啊"); } }
输出结果如下:
以上代码参考自知乎,此外,知乎的那个花木兰从军解释多态的例子讲的不错:https://www.zhihu.com/question/30082151
多态的弊端:不能使用子类特有的成员变量或方法,只能向下转型
5.正确理解重写与重载
重写(覆盖,Overrding)是子类重写父类的方法,相同的方法名,参数类型与返回类型
重载(OverLoad)发生在一个类中,方法名相同,参数列表不同,返回类型可以不同,重载发生在编译时
6.正确理解static关键字
首先static修饰的部分会随着类的加载而一起被加载到JVM内存中的方法区中去。 如果某个成员变量或方法是被所有对象所共享的,那么应该定义成静态的
静态成员只能访问static修饰的成员变量或方法。非静态成员可以访问静态成员或方法。
static修饰的部分不能使用this,super关键字
static破坏了Java的多态性