Java大神、小妖,面试题又一枚?

专业打酱油 发布于 2013/07/24 16:39
阅读 490
收藏 0
static class A{
public int a = 1;
public void t(){
System.out.println("a");
}

static void tt(){
System.out.println("a");
}
}

static class B extends A{

public int a = 2;

@Override
public void t() {
System.out.println(super.a);
System.out.println("b");
}

static void tt(){
System.out.println("b");
}
}

A、B都是某类的内部类。

1、B继承A都继承了什么?变量?方法?类的继承都继承什么?

2、A a = new B(); 为什么a.a是A的a,a.t是B的t?

3、A的tt和B的tt有何关系?a.tt()结果如何?

加载中
0
loki_lan
loki_lan
这个东西,你只要记住,静态方法与变量都属于类本身,不需要继承,非静态类方法和变量都可以被继承,而A a = new B();是A的引用,B的实例,a被显式地声明了为A的引用,因此所有B的自有方法都不能调用,但B继承A的方法被重写之后,可以被a调用,自然a.t就是B的t了,而你说的两个tt就没有任何关系。
loki_lan
loki_lan
回复 @MorganJi : 第一,t方法被重写之后,A的t会被隐藏,这是继承的特性,第二,B的a变量不是A的a变量,已经阐述过了,引用指向哪个就是哪个的。
开源中国门卫大哥
开源中国门卫大哥
那为什么a.a是A的a,a.t是B的t? 非静态方法和变量不应该同等对待吗?
0
王瑞平
王瑞平
3AB带自己的tt
专业打酱油
专业打酱油
你发现了重点!
0
猎户座
猎户座
public class Test {
static class A {
public int a = 1;


public void t() {
System.out.println("A:t");
}


static void tt() {
System.out.println("A:tt");
}
}


static class B extends A {
public int a = 2;


@Override
public void t() {
System.out.println("B:t1:"+super.a);
System.out.println("B:t2");
}


static void tt() {
System.out.println("B:tt");
}
}


public static void main(String[] arg) {
A a = new B();
System.out.println(a.a + "///");
a.t();
System.out.println("///");
a.tt();
}
}

结果:

1///
B:t1:1
B:t2
///
A:tt

返回顶部
顶部