package testOO;
public class Demo41 {
protected String name ;
public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
package testO1;import testOO.Demo41;
public class Demo42 extends Demo41{
public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
public class Demo41 {
protected String name ;
public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
package testO1;import testOO.Demo41;
public class Demo42 extends Demo41{
public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×你说的不对吧
那个protected 不是不能在其他包里访问的嘛 有什么不对的?
package A;
public class ProtectedDemo01 {
protected String str = "helloworld";
}
--------------------------------------------
package B;//不同的package
public class ProtectedDemo02 extends ProtectedDemo01{
public static void main(String args[]){
ProtectedDemo01 pro01 = new ProtectDemo01();//这样写是错误的,访问不到
System.out.println(pro01.str);
ProtectedDemo02 pro02 = new ProtectDemo02();//这样才可以访问的到
System.out.println(pro02.name);
}
}
String name2 = demo.name;
这不叫被子类所用
public String getName(){
return this.name;
}
这位说的比较详细Demo2继承了Demo1,所以Demo2里面访问的其实是Demo2自己继承来的protected name而不是Demo1的name。 protected权限只说可以被其他包的类继承,没有说可以被其他包的类访问
Demo41 demo = new Demo41();
String name2 = demo.name;这么说吧这里的demo是Demo41的实例(你就把它看成是Demo41算了),而这里的访问name其实默认是Demo42的name,这个name是它继承来的,是Demo42自己的不是Demo41的,Demo41无权访问。
补充一下:在相同的package之中
此类的对象是可以在任何地方都访问类中的protected属性的。
这个就是它的包访问权限
protected 的最准确的形容是:包访问权限+继承访问权限
不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问权限!
当父类与子类位于不同包中时:protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问。
package a;
public class Demo41 {
protected String name="hello World";
public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
////////////////////////////////////
package b;
import a.Demo41;
public class Demo42 extends Demo41 {
private String name = "hello";
public void TXT() {
String name2 = super.name;//能访问
System.out.println(name2);
System.out.println(name);
Demo41 demo = new Demo41();
// name2 = demo.name;报错,不能访问
//说明两者是有区别的。
}
public static void main(String[] args) {
new Demo42().TXT();
}
}
////////////////////////////////////
运行结果。
hello World
hello
////////////////////////////////////
你把第二个类写成import testOO.Demo41;
public class Demo42 extends Demo41{
public static void main(String[] args) {
Demo42 demo = new Demo42();
String name2 = demo.name;
}
}就行了,这样才是继承后调用protected字段。