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修饰的变量、方法使用时:
- 父类的变量、方法只能在和父类同包下使用,无论该使用者是子类还是其他类
- 子类继承的变量、方法只能在本子类中,或者父类,或者和其父类同包的其他类中使用