继承与多态

最近刷了些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的多态性

原文地址:https://www.cnblogs.com/zengcongcong/p/10772106.html