原书代码:package mypack1;public class ClassA {
public int v1;
protected int v2;
int v3;
private int v4;
}
package mypack2;import mypack1.ClassA;class ClassC extends ClassA {
public void method() {
v1 = 1;
v2 = 2;// OK
ClassA a = new ClassA();
a.v1 = 1;
a.v2 = 2;// err
a.v3 = 3;
a.v4 = 4;
}
}
为什么 v2 = 2;// OK
而 a.v2 = 2;// errprotected不是子类及同包 可以访问吗?
ClassC虽然与ClassA不同包,但却是ClassA的子类啊高手来解答啊?

解决方案 »

  1.   

    public的类、类属变量及方法,包内及包外的任何类均可以访问; 
    protected的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问; 
    private的类、类属变量及方法,包内包外的任何类均不能访问; 
    如果一个类、类属变量及方法不以这三种修饰符来修饰,它就是默认类型的,那么包内的任何类都可以访问它,而包外的任何类都不能访问它(包括包外继承了此类的子类),
      

  2.   

    这位同学 可知道 这个世界上 有一个叫做 super 的关键字?最近在读JAVA核心思想 里面的作者疯狂的怂恿我将所有的对象属性都设置为private 并且需要提供外部访问的属性 提供访问器..(貌似吧 术语太多 看不明白鸟..)
      

  3.   

    确实好怪异啊
    楼主 你后边的 a.v3 = 3   和  a.v4 = 4 ;  出错么 
      

  4.   

    protected 好几年都没用了,到底为什么也给忘记了。应该是安全的原因,上传一个普通的a.class继承一个已知的类就能获悉info,完全可以影响网络安全。这对于一个黑客来说太容易了,class字节码很容易就被识破了。该回答你的问题了,你创建了两个完全不同的访问对象。 ClassC extends ClassA --这是级联体--可以认为是一个对象【包含父类数据,自然能访问受保护属性】 ClassA a = new ClassA();---这是一个完全独立的对象,跟C类没有任何关系,它在堆空间只是在C类空间区段中。
      

  5.   

    ClassA a = new ClassA();---这是一个完全独立的对象,跟C类没有任何关系,它在堆空间只是在C类空间区段中。
      

  6.   

    你是copy党?
    仔细看过问题吗?
      

  7.   


    package mypack2;import mypack1.ClassA;public class ClassC extends ClassA { public void method() {
            v1 = 1;
            v2 = 2;// OK
            ClassA a = new ClassA();
            a.v1 = 1;
            a.v2 = 2;// err
            a.v3 = 3;//err
            a.v4 = 4;//err
        }}
      

  8.   

    它们不在一个包下。所以。protected 和 private 和默认的都不能访问。
      

  9.   

     v2 = 2;// OK
     是继承关系所以可以访问。
      

  10.   


    LZ实际上可能对某些知识误解了 如:
    public class TestPrivate {
    private int i;

    public void setTestPrivate(TestPrivate testPrivate) {
    this.i = testPrivate.i; //LZ想要的这个样子吧?
    }
    }
      

  11.   

    说的对
    主要你重新NEW一下的话并是用NEW的来调用V2的,并不是用ClassC 来调用,而在不同的包中用protected修饰的属性是不能够调用的
      

  12.   

    package com.basic;public class Producted {
    public int v1;
    protected int v2;
    int v3;
    private int v4;
    }
    package net.com.protect;import com.basic.Producted;public class ProtectedB extends Producted {
    public void method(){
    v1=1;
    v2=2;//继承 可以访问protected 限制的成员
    v3=3;//err 
    v4=4;//err
    Producted p=new Producted();
    p.v1=12;
    p.v2// err 新对象的引用,不能访问受保护的成员变量
    p.v3=13;// err 同上
    p.v4=14;//这个是p引用的私有成员变量,当然可以访问

    }
    }
      

  13.   

    class ClassC extends ClassA {
        public void method() {
            v1 = 1;
            v2 = 2;// OK     子类访问父类数据成员 
            ClassA a = new ClassA();
            a.v1 = 1;
            a.v2 = 2;// err       已经不是子类访问父类了,是子类对象访问了
            a.v3 = 3;// err       v3在父类中是default的,只能在同一个包下才能访问
            a.v4 = 4;// err       父类的私有成员,不可访问
        }
    }