***name怎么访问不到
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;
}
} --------------------编程问答-------------------- name的属性是protected 是因为这个不?
--------------------编程问答-------------------- protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ; --------------------编程问答--------------------
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
你说的不对吧 --------------------编程问答--------------------
那个protected 不是不能在其他包里访问的嘛 有什么不对的? --------------------编程问答-------------------- 不对啊,protected是可以被继承的
--------------------编程问答-------------------- 我知道了,第二个demo因为依然是Demo41的实例,而Demo42的name是protected的无法让非本包非继承关系的类访问~~~ 没错吧~~~ --------------------编程问答-------------------- name,你这个属性是private的吧,改为public --------------------编程问答-------------------- 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);
}
}
--------------------编程问答-------------------- Demo41 demo = new Demo41();
String name2 = demo.name;
这不叫被子类所用 --------------------编程问答-------------------- 哪说错了,无语。。。
--------------------编程问答--------------------
子类访问父类的属性 --------------------编程问答-------------------- 如果想访问name,那就提供一个get方法吧
public String getName(){
return this.name;
} --------------------编程问答--------------------
这位说的比较详细Demo2继承了Demo1,所以Demo2里面访问的其实是Demo2自己继承来的protected name而不是Demo1的name。 protected权限只说可以被其他包的类继承,没有说可以被其他包的类访问 --------------------编程问答--------------------
那表格里不是说可以被子孙类访问吗 --------------------编程问答--------------------
是这样吗?不是说访问修饰符吗 --------------------编程问答-------------------- 在Class Demo42里面
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对于子类是可见的),而父类对象不再可以访问。 --------------------编程问答-------------------- 正解 --------------------编程问答--------------------
--------------------编程问答-------------------- 你这个根本没有用到那个继承的嘛,只是在其他包的类里面调用了new Demo41()而已如果
////////////////////////////////////
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字段。
补充:Java , Java EE