zoukankan      html  css  js  c++  java
  • 继承与多态

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

  • 相关阅读:
    rem是如何实现自适应中的?
    meta基础知识
    JqueryMobile动态生成listView并实现刷新的两种方法
    javascript中for/in循环及使用技巧
    JavaScript中this详解
    使用css实现全兼容tooltip提示框
    如何使用CSS3画出一个叮当猫
    jQuery实现的Div窗口震动效果实例
    jQuery实现动态添加和删除一个div
    js对文章内容进行分页示例代码
  • 原文地址:https://www.cnblogs.com/zengcongcong/p/10772106.html
Copyright © 2011-2022 走看看