class A{
int name = 12;
}
class B extends A{}这时B继承了A的name作为自己的成员变量,在B类里对父类的name和自己的name操作都是一样的结果。那是否A和B共用同一个成员变量呢。
int name = 12;
}
class B extends A{}这时B继承了A的name作为自己的成员变量,在B类里对父类的name和自己的name操作都是一样的结果。那是否A和B共用同一个成员变量呢。
这么些不知道可不可以
protect static int name = 12;
这样有意义吗?
int name;
}class B extends A{
void display(){
System.out.println(name);
System.out.println(super.name);
}
}我是说name和super.name 是不是同一个变量。
int name;
}class B extends A{
void display(){
System.out.println(name);
System.out.println(super.name);
}
}如上这么写的话 name 就是 super.name!
1.为了方便测试,我把name改为String类型了,并且为类B添加了setN和getN两个方法,通过下面的程序,我们可以看见,对象b的name没变,而对象c的name变了。所以,两个对象所引用的变量不是同一个变量。class B
{
private String name = "我没变!";
public void setN(String name)
{
this.name = name;
}
public String getN()
{
return name;
}
}public class C extends B
{
public static void main(String [] args)
{
C c = new C();
B b = new B();
c.setN("我变了!");
System.out.println(b.getN() + "" + c.getN());
}
}2.在这一段代码中,我把name设置成了静态的。class B
{
static String name = "我没变!";
public void setN(String name)
{
this.name = name;
}
}public class C extends B
{
public static void main(String [] args)
{
System.out.println(name);//输出一次没改变以前的成员变量name;
C c = new C();
B b = new B();
b.setN("我变了!");//因为name是静态的,所以在类中所有的对象共享同一个name,改变其中一个,所有对象的name都被改变。这样的话,name变是引用的同一个变量。
System.out.println(b.name + "" + c.name);
}
}结论:当name被设置为静态的时候,类C和类B的对象引用的是同一个变量,当name不是静态的时候,类C和类B的对象引用的是不同的name变量。按楼主的情况,他们应该不是引用的同一个变量。(汗一个,我是新人,没想到写这么多,错了大家别丢砖头啊。)
*************************************************************
package a;
public class A{
protected final String AA="test";
}
**************************************************************
package b;
public class B extends A{
public static void main(String arg[]){
System.out.println(new B().AA);//这句可以
System.out.println(new a.A().AA);//这一句是不能通过编译的
}
}
***************************************************************
所以这两个AA应该不是一个东西。
那么,A就是B的父亲,他们自然有关系,那么,孩子B在很多的外在表现上都拥有父亲A的眼睛,皮肤颜色等属性,就算表示曾不一样,也只代表A父亲类与B儿子类之间的基因传递发生了变化,就是JAVA所谓的多态,这个基因也就是属性的改变可能是由父亲的父亲决定,或者是近亲或远亲中的某些属性或方法,比如SET,GET方法等决定的,但是,不要忽略他们共有的属性,那就是人类的基本属性,比如动做,思想等,这些是所有类都必须实现的方法,或者是属性,而我们程序员做的,是在这个儿子或父亲上做一些逻辑性的处理,比如吃饭怎么吃,跑步怎么跑,我们规划某个对象,以及其后代可能产生的(属性比如眼睛或方法比如看,吃,跑)变异,这个便宜可亿是比如,儿子的皮肤比父亲的黑,我们在基层设置颜色基调,比如儿子跑的比父亲快,程序员就设置这个动作的实现的时间缩短.
恩,大概就是这些简单的意思了
class A
{
public int name = 12;
}class B extends A
{
B()
{
name =13;
}
}public class Main
{
public static void main(String[]args)
{
A a = new A();
B b = new B();
System.out.println((a.name==b.name)?"共用变量":"不是共用变量");
}
}
输出结果是:不是共用变量
如果是共用变量的话,子类中修改了name成员的值,那么父类对象的成员的值也应该改变。但实际上,在内存中
A和B分配了不同的内存,所以不是共用。
两个类都不是静态的,所以在实例化一个对象时,分配内存空间,例:
B b=new B();
在b这个实例对象中的分配了named的内存空间。
再实例化一个对象a,
A a=new A();
在对象a对应的内存空间就会有a对象的成员变量name的空间,所以说它们不是共用一成员变量的。
如果name被定义为static的话,那在实例对象中它们就共用一内存了。
default 本类+同包可访问 同包子类可以继承,不同包子类不能继承
protected 本类+同包+不同包子类可访问 可以继承
public 公开 可以继承
我认为,如果子类如果继承父类,那么super.name 和 name 指的不是同一内存,而是两个不同的内存空间。
lz的问题我也想到过,不过很难解释,
lz自己静下心来好好思考一番应该能够
领悟的,祝lz好运