大白糖奶兔的Blog
大白糖奶兔的Blog
Java学习-Day09隐藏和覆盖

属性的隐藏

  • 子类中定义了和超类中一样的变量名,从超类继承的变量就被隐藏了
  • 子类拥有了两个相同名字的变量,一个继承自超类,一个是由自己声明
package 第三章类的重用;

public class 隐藏和覆盖 {
    class Parents{
        Number aNumber;
    }

    class Child extends Parents {
//        Child类型将从Parends类继承过来的aNumber属性隐藏
        Float aNumber;
    }
}
  • 如果子类执行继承自超类的操作时,处理的是继承自超类的变量,而当子类执行它自己声明的方法时,所操作的就是他自己的声明的变量
  • 本类中声明的方法使用“super.属性”访问从超类继承的属性
package 第三章类的重用;

public class 访问隐藏属性 {
    static class A1{
        int x=2;
        public void setX(int i) {
            x = i;
        }
        void printa() {
            System.out.println(x);
        }
    }

    static class B1 extends A1 {
        int x=100;
        void printb(){
            super.x = super.x + 10;//对超类继承的数字操作+10
            System.out.println("Super.x=" + super.x + "x=" + x);
        }
    }

    public static void main(String[] args) {
        A1 a1 = new A1();
        a1.setX(4);
        a1.printa();//4

        B1 b1 = new B1();
        b1.printb();//超类方法Super.x=12,x=100;
        b1.printa();//超类方法12

        b1.setX(6);//超类方法,超类x为6
        b1.printb();//本类方法Super.x=16,x=100
        b1.printa();//超类方法16
        a1.printa();//本类方法4(第25条语句)
    }
}

子类对超类静态成员的访问

package 第三章类的重用;

public class 访问超类静态属性 {
    static class A1{
        static int x=2;
        public void setX(int i) { x = i; }
        void printa() { System.out.println(x); }
    }

    static class B1 extends A1 {
        int x=100;
        void printb(){
            super.x = super.x + 10;//对超类继承的数字操作+10
            System.out.println("Super.x=" + super.x + "x=" + x);
        }
    }

    public static void main(String[] args) {
        A1 a1 = new A1();
        a1.setX(4);//本类静态成员,每个对象都只有这一份x
        a1.printa();//4

        B1 b1 = new B1();
        b1.printb();//超类方法Super.x=14,x=100;
        b1.printa();//超类方法14

        b1.setX(6);//超类方法,超类x为6
        b1.printb();//本类方法Super.x=16,x=100
        b1.printa();//超类方法16
        a1.printa();//本类方法16(第28条语句),只对应一个x
    }
}

方法的覆盖

  • 如果子类不需使用从超类继承来的方法和功能,则可以声明自己的同名方法,称为方法覆盖
  • 覆盖方法的返回值类型、方法名称、参数的个数及类型必须和被覆盖的方法一模一样
  • 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法
  • 覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格

方法覆盖的适用情景

  • 子类中实现与超类相同的功能,但采用不同的算法或公式
  • 在名字相同的方法中,要做比超类更多的事情
  • 在子类中需要取消从超类继承的方法

方法覆盖的注意事项

必须覆盖的方法

  • 派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类

不能覆盖的方法

  • 基类中声明为final的终结方法
  • 基类中声明为static的静态方法

调用被覆盖的方法

  • super.overriddenMethodName()

发表评论

textsms
account_circle
email

大白糖奶兔的Blog

Java学习-Day09隐藏和覆盖
属性的隐藏 子类中定义了和超类中一样的变量名,从超类继承的变量就被隐藏了子类拥有了两个相同名字的变量,一个继承自超类,一个是由自己声明 package 第三章类的重用; public cl…
扫描二维码继续阅读
2020-03-07
Title - Artist
0:00