java继承

定义

子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。(共性抽取,提高了代码的复用性;使类与类之间产生了关系,是多态的前提)

Java只支持单继承。

继承后的几种情况

  • 子类和父类没有重名属性和方法时

    class Fu {
        int a = 1;
        
        void showFu () {
            System.out.println("Fu");
        }
    }
    
    class Zi extends Fu{
        int b = 3;
        
        void showZi () {
            System.out.println("Zi");
        }
    }
    
    class Test {
        public static void main(String [] args) {
            Zi z = new Zi();
            // 子类继承父类非私有的方法属性
            System.out.println(z.a); // 1
            z.showFu(); // Fu
            System.out.println(z.b); // 3
            z.showZi(); // Zi
        }
    }
    
  • 子类和父类属性重名时

    class Fu {
        int a = 1;
    }
    
    class Zi extends Fu{
        int a = 3;
        
        void show () {
            // 当父类和子类的属性名相同时,可以通过 super 访问父类的属性,super 指向父类
            System.out.println(super.a);
            System.out.println(this.a);
        }
    }
    
    class Test {
        public static void main(String [] args) {
            Zi z = new Zi();
            z.show(); // 1  3
        }
    }
    
  • 子类和父类方法重名时,就发生了方法重写

    方法重写:子类中出现与父类出现方法签名和返回值一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。

    方法签名

    由方法名称和方法的形参列表(形参类型和形参顺序)共同组成 ;不包括返回类型和访问修饰符

    class Fu {
        void show() {
            System.out.println("Fu");
        }
    }
    
    class Zi {
        // @Override 注解 检查是否是方法重写,不是将会报错
        @Override
        void show() {
            // 也可通过 super 掉用父类的非私有方法
            System.out.println("Zi");
        }
    }
    
    class Test {
        public static void main(String [] args) {
            Zi z = new Zi();
            z.show(); // Zi
        }
    }
    

    注意

    1. 子类重写父类方法时,必须要保证子类方法权限大于等于父类方法权限
    2. 子类方法和父类方法具有相同的方法名字、相同的参数列表、相同的返回类型
  • 子类和父类的构造方法

    1. 子类不会继承父类的构造方法

    2. 构造方法的作用是初始化成员属性(初始化对象是通过new关键字实现的),所以子类实例化时必须先实例化父类。子类的构造方法中默认有一个 super(),表示掉用父类的构造方法。

    class Fu {
        public Fu(){
    		System.out.println("Fu");
    	}
    }
    
    class Zi extends Fu{
        public Zi() {
    		// 默认掉用了 super() 父类构造方法
    		System.out.println("Zi");
    	}
    }
    
    class H {
        public static void main(String [] args) {
            Zi z = new Zi(); // Fu  Zi
        }
    }
    

super 和 this

  • super :代表当前对象的父类

  • this:代表当前对象(谁掉用就是谁)

    super.a; // 父类的成员变量
    this.a; // 本类的成员变量
        
    super.show(); // 父类的成员方法
    this.show(); // 本类的成员方法
    
    super(); // 父类的构造方法
    this(); // 本类的构造方法
    

    子类构造方法中默认掉用super(),手动掉用super()会覆盖默认的super()super()this() 都必须是在构造方法的第一行,所以不能同时出现。

posted @ 2020-10-27 18:05  遥远的相似性  阅读(61)  评论(0)    收藏  举报