-40度冰天雪地跪求大神帮看下java继承的问题

yangpan2015 2016-10-18 10:02:23

class A{
int a;
void fun1(){

}
class AInner{

}
}
class B extends A{

}


1、成员变量a会被继承吗,就想知道B类创建的对象里面本身就有个a还是说没有(访问a的时候仅仅是从父类找的a)。直接访问a和super.a有区别吗

2、同样的fun1()和内部类AInner{}也是想问类似的问题。
...全文
314 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rumlee 2016-10-19
  • 打赏
  • 举报
回复
1、a会被继承,B类的对象就有a,直接访问a和super.a没有区别 2、方法与内部类也一样,都会被继承
  • 打赏
  • 举报
回复
只是从规范分析上讲啊。 这三个都是不继承的。 因为它们没有声明为protected及以上作用域,无声明的情况下默认为(default),高于private低于protected,仅能同包访问 虽然不继承,但是在你的这种写法里面,A和B两个class是在同一个包下,所以B对于A的属性、方法都具有访问的权限 但这仅仅规范逻辑,实际上取决于编译器的实现方式 我猜测(瞎猜)在写new B().fun1()的时候,实际上是构造了Object又构造了A又构造了B,然后把这三个玩意用栈的形式堆叠起来。 B是最后构建的,最后入栈所以最先出栈。 访问的时候,先访问B,发现B里面没这个玩意,那就访问B下面的A,发现居然找到了!虽然原则上不应该,但它就是找到了,于是它抛弃原则,访问了这个玩意。 但是……方法存于栈中,属性却不是…… 总之属性更麻烦一些,像你的这种情况,由于a是default的,所以它应该不能被继承,但是访问器能访问到 见如下代码:

public class TestA {

	public static void main(String[] args) throws Exception {
		AA a = new AAA();
		System.out.println(AA.class.getField("a").get(a));
		System.out.println(AAA.class.getField("a").get(a));
	}

}


class AA {
	public int a = 0;
}

class AAA extends AA {
	
	public int a = 1;
}

// 0
// 1
这两个都是public的属性,通过AA.class和通过AAA.class去访问同一个对象,得到的却是两个值 这说明,属性天生就是不适用于继承关系的,即使是public的属性,也不能继承和覆盖,仅仅是子类能够通过作用域被访问到父类而已 综上,继承原则是设计上的原则,实际上编译器只是遵守public、protected、(default)、private四个作用域。 属性和方法在存储方式上的不同决定了,子类的属性不能覆盖父类的属性,子类的方法可以覆盖父类的方法。 所以为了安全,继承的时候,用方法而不是属性。
Romanceling 2016-10-19
  • 打赏
  • 举报
回复
我做的测试
public class Test extends A{
	public void test(){
		this.a = "Test的a。。。";
		super.a = "父类A的a。。。";
		System.out.println(this.a);
		
		A.Inner in = new A().new Inner();
		System.out.println(in.b);
		Test.Inner testIn = new Test().new Inner();
		System.out.println(testIn.b);
		testIn.b = "----";
		System.out.println(testIn.b);
		System.out.println(in.b);
	}
	
	public static void main(String[] args) {
		Test t = new Test();
		t.test();
	}
}
class A{
	String a;
	class Inner{
		String b = "==";
	}
}
结果: 父类A的a。。。 == == ---- ==

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧