当前位置:编程学习 > JAVA >>

***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 ; --------------------编程问答--------------------
引用 2 楼  的回复:
protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;

作用域           当前类       同一package    子孙类       其他package
public             √              √                   √                 √
protected        √              √                  √                  ×
friendly           √              √                   ×                 ×
private            √              ×                   ×                 ×

你说的不对吧 --------------------编程问答--------------------
引用 3 楼  的回复:
引用 2 楼 的回复:

protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;

作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √……


那个protected 不是不能在其他包里访问的嘛  有什么不对的? --------------------编程问答-------------------- 不对啊,protected是可以被继承的
引用 4 楼  的回复:
引用 3 楼  的回复:
引用 2 楼 的回复:

protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;

作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
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;
这不叫被子类所用 --------------------编程问答-------------------- 哪说错了,无语。。。

引用 3 楼  的回复:
引用 2 楼  的回复:

protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;

作用域           当前类       同一package    子孙类       其他package
public             √……
--------------------编程问答--------------------
引用 9 楼  的回复:
Demo41 demo = new Demo41();
String name2 = demo.name;
这不叫被子类所用

子类访问父类的属性 --------------------编程问答-------------------- 如果想访问name,那就提供一个get方法吧
public String getName(){
  return this.name;
} --------------------编程问答--------------------
引用 8 楼  的回复:
protected按照资料上的说法是:继承访问权限,或者是包访问权限,关于继承访问权限这个我虽然明白,但是讲不明白,直接上代码吧,你看看它的含义应该可以明白:

Java code

package A;
public class ProtectedDemo01 {
    protected String str = "helloworld";
}
-------------------……


这位说的比较详细Demo2继承了Demo1,所以Demo2里面访问的其实是Demo2自己继承来的protected name而不是Demo1的name。 protected权限只说可以被其他包的类继承,没有说可以被其他包的类访问 --------------------编程问答--------------------
引用 10 楼  的回复:
哪说错了,无语。。。

引用 3 楼  的回复:

引用 2 楼  的回复:

protected定义的变量只能在同一个包内访问,
而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
需要改为
public String name ;

作用域           当前类       同一package    子孙类       其……


那表格里不是说可以被子孙类访问吗 --------------------编程问答--------------------
引用 13 楼  的回复:
引用 8 楼  的回复:

protected按照资料上的说法是:继承访问权限,或者是包访问权限,关于继承访问权限这个我虽然明白,但是讲不明白,直接上代码吧,你看看它的含义应该可以明白:

Java code

package A;
public class ProtectedDemo01 {
protected String str = "helloworld";
}
--……

是这样吗?不是说访问修饰符吗 --------------------编程问答-------------------- 在Class Demo42里面
Demo41 demo = new Demo41();
String name2 = demo.name;

这么说吧

这里的demo是Demo41的实例(你就把它看成是Demo41算了),而这里的访问name其实默认是Demo42的name,这个name是它继承来的,是Demo42自己的不是Demo41的,Demo41无权访问。

--------------------编程问答--------------------
引用 8 楼  的回复:
protected按照资料上的说法是:继承访问权限,或者是包访问权限,关于继承访问权限这个我虽然明白,但是讲不明白,直接上代码吧,你看看它的含义应该可以明白:


Java code

package A;
public class ProtectedDemo01 {
    protected String str = "helloworld";
}
-------------……


补充一下:在相同的package之中
此类的对象是可以在任何地方都访问类中的protected属性的。
这个就是它的包访问权限

--------------------编程问答--------------------
引用 15 楼  的回复:
引用 13 楼 的回复:

引用 8 楼 的回复:

protected按照资料上的说法是:继承访问权限,或者是包访问权限,关于继承访问权限这个我虽然明白,但是讲不明白,直接上代码吧,你看看它的含义应该可以明白:

Java code

package A;
public class ProtectedDemo01 {
protected String str = "hello……


protected 的最准确的形容是:包访问权限+继承访问权限 --------------------编程问答-------------------- 当父类与子类位于同一包中时:
不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问权限!


当父类与子类位于不同包中时:protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问。 --------------------编程问答-------------------- 正解
引用 19 楼  的回复:
当父类与子类位于同一包中时:
不管是子类对象还是父类对象都可以访问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
////////////////////////////////////
--------------------编程问答-------------------- 你这个根本没有用到那个继承的嘛,只是在其他包的类里面调用了new Demo41()而已如果
你把第二个类写成

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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,