继承中的Protected、final关键字

一、Protected关键字

Protected是一个访问权限修饰限定符,被它修饰的属性和方法可以在子类中访问,即使是在不同的包下。

父类:

// 为了掩饰基类中不同访问权限在子类中的可见性,为了简单类B中就不设置成员方法了
// extend01包中
class B {
    private int a;
    protected int b; // 被protected修饰
    public int c;
    int d;
}
}

 同一个包中的子类,可以访问被protected修饰的属性/方法

// extend01包中
// 同一个包中的子类
class D extends B{
    public void method(){
// super.a = 10; // 编译报错,父类private成员在相同包子类中不可见
        super.b = 20; // 父类中protected成员在相同包子类中可以直接访问
        super.c = 30; // 父类中public成员在相同包子类中可以直接访问
        super.d = 40; // 父类中默认访问权限修饰的成员在相同包子类中可以直接访问
    }
}

 不同包中的子类,可以访问被protected修饰的属性/方法

// extend02包中
// 不同包中的子类
class C extends B {
    public void method(){
// super.a = 10; // 编译报错,父类中private成员在不同包子类中不可见
        super.b = 20; // 父类中protected修饰的成员在不同包子类中可以直接访问
        super.c = 30; // 父类中public修饰的成员在不同包子类中可以直接访问
//super.d = 40; // 父类中默认访问权限修饰的成员在不同包子类中不能直接访问
    }
}

不同包中的普通类,不能访问被protected修饰的属性/方法

// extend02包中
// 不同包中的类
class TestC {
    public static void main(String[] args) {
        C c = new C();
        c.method();
// System.out.println(c.a); // 编译报错,父类中private成员在不同包其他类中不可见
// System.out.println(c.b); // 父类中protected成员在不同包其他类中不能直接访问
        System.out.println(c.c); // 父类中public成员在不同包其他类中可以直接访问
// System.out.println(c.d); // 父类中默认访问权限修饰的成员在不同包其他类中不能直接访问
    }
}

二、final关键字

1、被final修饰的属性,不能被修改

final int a = 20;
a = 100;//编译出错

2、被final修饰的方法,不能被重写

在多态中会介绍

2、被final修饰的类,不能被继承(密封类)

final class A {
    int a;
}
class B extends A{ //编译出错
    
}

猜你喜欢

转载自blog.csdn.net/benxiangsj/article/details/129542955