权限修饰protected关键字

本文详细探讨了Java中的protected访问修饰符的使用情况,包括父类和子类在不同包下的访问权限。总结了当父类、子类、使用者位于同一包或不同包时,protected成员的可见性,强调了protected修饰的变量和方法的使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 父类、子类、使用者同包

// 父类
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类1
package com.example.ioc.aop0;
public class Cat extends Animal {

}

// 父类本身、子类继承自父类的protected的方法,在使用者同父类、子类同包时都可用
package com.example.ioc.aop0;
public class Test {

    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.run();

        Animal animal = new Animal();
        animal.run();
    }
}

2. 父类、使用者同包,子类不同包

// 父类
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类 -- 不同包
package com.example.ioc.aop1;
public class Cat extends Animal {

}

// 父类本身、子类继承自父类的protected的方法,在使用者同父类同包时都可用
package com.example.ioc.aop0;
public class Test {

    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.run();

        Animal animal = new Animal();
        animal.run();
    }
}

3. 父类、子类同包,使用者不同包

父类及子类继承自父类的protected的方法,在使用者不同包时都不可用

// 父类
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类
package com.example.ioc.aop0;
public class Cat extends Animal {

}


// 使用者不同包
package com.example.ioc.aop1;
import com.example.ioc.aop0.Animal;
import com.example.ioc.aop0.Cat;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        // 方法编译报错
        animal.run();
        
        Cat cat = new Cat();
        // 方法编译报错
        cat.run();
    }
}

4. 子类、使用者同包,父类不同包

父类及子类继承自父类的protected的方法,在父类不同包时都不可用

// 父类不同包
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类
package com.example.ioc.aop1;
public class Cat extends Animal {

}


// 使用者
package com.example.ioc.aop1;
import com.example.ioc.aop0.Animal;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        // 方法编译报错
        animal.run();
        
        Cat cat = new Cat();
        // 方法编译报错
        cat.run();
    }
}

5. 父类、子类、使用者三者都不同包

父类及子类继承自父类的protected的方法,三者不同包时都不可用

// 父类
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类
package com.example.ioc.aop1;
public class Cat extends Animal {

}


// 使用者
package com.example.ioc.aop2;
import com.example.ioc.aop0.Animal;
import com.example.ioc.aop1.Cat;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        // 方法编译报错
        animal.run();
        
        Cat cat = new Cat();
        // 方法编译报错
        cat.run();
    }
}

6. 父类、子类不同包

父类的protected方法不可用,子类继承自父类的protected的方法可用

// 父类
package com.example.ioc.aop0;
public class Animal {

    protected void run() {
        System.out.println("Animal");
    }
}

// 子类
package com.example.ioc.aop1;
import com.example.ioc.aop0.Animal;
public class Cat extends Animal {
	
    public static void main(String[] args) {
        Animal animal = new Animal();
        // 方法编译报错
        animal.run();
        
        Cat cat = new Cat();
        cat.run();
    }
}

7. 总结

protected修饰的变量、方法使用时:

  • 父类的变量、方法只能在和父类同包下使用,无论该使用者是子类还是其他类
  • 子类继承的变量、方法只能在本子类中,或者父类,或者和其父类同包的其他类中使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值