2 回答
TA贡献2051条经验 获得超10个赞
假设有一个 Animal 类:
public class Animal {
private String _name;
public Animal(String name) { _name = name;}
public String getName() {return _name;}
}
现在有一个 Dog 类:
public class Dog extends Animal {
public Dog() {
super("Dog");
}
}
现在,如果你这样做:
Animal dog = new Dog();
System.out.println(dog.getName());
这就是您如何使变量名从Dog类到Animal.
TA贡献1934条经验 获得超2个赞
Java继承是超级内容复制?
我真的很想了解继承是如何工作的,
假设我们有类 A 和 B,B 扩展了 A,A 包含一些在公共和方法上设置的属性(引用类型和原始类型)
这些属性和方法是否复制到 B 类中?
公共属性和方法由子类继承B。考虑类A及其子类B:
public class A {
public int aNumber = 99;
public StringBuilder aString = new StringBuilder("sb");
private String privateVar = "private stuff";
public A() {
}
public A(int i, StringBuilder s) {
aNumber = i;
aString = s;
}
public int getMyNumber() {
return aNumber*2;
}
public StringBuilder getMyString() {
return aString.append("!!");
}
@Override
public String toString() {
return aNumber + " : " + aString;
}
}
public class B extends A {
public B() {
}
public B(int i, StringBuilder s) {
super(i, s);
}
}
下面的类有一些代码来测试上面两个类的行为,在继承方面:
public class TestingInheritance {
public static void main(String [] args) {
A a = new A(3, new StringBuilder("test1"));
System.out.println("A: " + a);
B b = new B();
System.out.println("b: " + b);
System.out.println("b.aNumber: " + b.aNumber);
System.out.println("b.getMyNumber: " + b.getMyNumber());
System.out.println("");
B b2 = new B(2, new StringBuilder("xx"));
System.out.println("b2: " + b2);
System.out.println("b2.aString: " + b2.aString);
System.out.println("b2.getMyString: " + b2.getMyString());
//System.out.println("Private: " + b.privateVar);
}
}
输出:
A: 3 : test1
b: 99 : sb
b.aNumber: 99
b.getMyNumber: 198
b2: 2 : xx
b2.aString: xx
b2.getMyString: xx!!
讨论:
有两个类A和B。该类B扩展A. A是超类,B是它的子类。这两个类各有两个构造函数——一个是默认的无参数构造函数和一个带参数的构造函数。
该类A具有原始类型和引用类型的公共属性:int aNumber和java.lang.StringBuilder aString。有公共的方法getMyNumber,getMyString以及java.lang.Object类的重写toString。注意还有一个私有变量privateVar。
代码详情来自TestingInheritance:
(我认为:
B b = new B();
这构造了 的一个实例B。这继承了其超类的属性和方法A。
System.out.println("b: " + b); // b: 99 : sb
新创建的对象b具有从其超类继承的属性值A;因此它从其重写的toString方法打印属性默认值。请注意在类中A为属性定义的默认值是99和一个StringBuilder带有字符串值“sb”的对象。
下面A使用默认属性值打印来自继承的属性和方法结果。
System.out.println("b.aNumber: " + b.aNumber); // 99
System.out.println("b.getMyNumber: " + b.getMyNumber()); // 198
(ii) 考虑:
B b2 = new B(2, new StringBuilder("xx"));
这将B使用提供的参数构造一个实例:2和new StringBuilder("xx")。请注意类B的构造函数中的语句super(i, s);这是必需的。而且,如果未指定,则会出现编译时错误。
System.out.println("b2: " + b2); // 2 : xx
这将打印在所提供的参数值B类的构造函数,后者又传给A类的构造函数参数:super(i, s)。当B创建类的实例(使用构造函数)时,A类的构造函数运行,首先- 查看super(...)语句(它是构造函数代码中的第一个语句)。
下面打印继承的属性值和方法返回值。
System.out.println("b2.aString: " + b2.aString); // xx
System.out.println("b2.getMyString: " + b2.getMyString()); // xx!!
(iii) 最后,以下语句如果没有注释程序TestingInheritance将无法编译。会出现错误:TestingInheritance.java:18: error: privateVar has private access in A。
System.out.println("Private: " + b.privateVar);
但是,可以B通过 class 中定义的公共方法访问私有属性A。
添加回答
举报
