// A.java
public abstract class A { //class A
private int x = 0;
public A(int xx) {
x = xx;
}
public int getX() {
return x;
}
public void addX(int dx) {
x = x + dx;
}
public abstract void method1();
}
// B.java
public class B extends A { //Class B
private int y = 0;
public B(int xx, int yy) {
super(xx);
y = yy;
}
public int getY() {
return y;
}
public void addY(int dy) {
y = y + dy;
}
public void method1() {
addX(y);
}
public void method2() {
addY(getX());
}
}
// C.java
public class C extends B { //Class C
private int w = 0;
public C(int xx, int yy, int ww) {
super(xx, yy);
w = ww;
}
public int getW() {
return w;
}
public void addW(int dw) {
w = w + dw;
}
public void method1() {
addX(w);
}
}
// D.java
public class D extends A { //Class D
private int z;
public D(int zz) {
z = zz;
}
public int getZ() {
return z;
}
public void addZ(int dz) {
z = z + dz;
}
public void method1() {
addX(z);
}
}
// E.java
public class E extends A { //Class E
private int z;
public E(int xx, int zz) {
super(xx);
z = zz;
}
public int getZ() {
return z;
}
public void addZ(int dz) {
z = z + dz;
}
public void method2() {
addX(z);
}
}
1.请问编辑D,E时为什么会发生错误?稍微具体一点
2.编辑以下3段代码时候会发生错误,请问是哪一行错了为什么?
(1)
A a1 = new A(); //1
a1.addX(50);//2
System.out.println(a1.getX()); //3
(2)
b2 = new B(1, 2); //1
A a2 = b2;//2
a2.method2(); //3
System.out.println(a2.getX()); //4
(3)
B b3 = new B(3, 4);//1
C c3 = b3;//2
c3.method1();//3
System.out.println(c3.getX()); //4
急求,五点之前请作答,感激不尽
第一题:
D类的构造函数没有调用父类的构造方法。子类必须调用父类构造方法,不写则赠送super(),写了则用写了指定的super调用。super只能是一个,还必须是第一个。这里父类构造函数不是无参构造。
E类没有重写抽象父类中的所有抽象方法,缺少method1方法。
第二题:
(1)
A a1 = new A(); //1 这行出错,原因是A类是抽象类,不能new创建
(2)
b2 = new B(1, 2); //1 这行出错,这个没有指定变量的类型
(3)
C c3 = b3;//2 #这行出错
因为这个B b3 = new B(3, 4);//1这个new的是一个B类对象并且是B类引用。在向下转型时C c3 = b3; 报错,因为本质不是同一个类。
可以将其改为B b3 = new C(3, 4, 5); 这样是C类对象并且是B类引用,在向下转型是其本质是和C同一类,所以这样可以。
别为什么会发生错误啊,把具体出现哪些错误贴一下啊,时间紧,能定位快一点哈
(1).1会错误吧,A缺少默认构造函数,只有带参数构造函数
1,
第一小问: A类中没有无参构造,所以D类继承A类需要在自己的构造函数中调用, method1方法上面要加@Override
第二小问: E类没重写父类method1方法
2,
选项1错误,原因:A类没有无参构造所以new对象时不传参数报错;
选项2错误,原因:没有指定b2类型
选项3错误,原因:b3是父类,c3是子类,不能将父类赋值给子类
1.编辑D时
`Implicit super constructor A() is undefined. Must explicitly invoke another constructor` 父类有声明构造函数时子类必须要super进行调用
public class D extends A { //Class D
private int z;
public D(int zz) {
super(zz); //这里
z = zz;
}
public int getZ() {
return z;
}
public void addZ(int dz) {
z = z + dz;
}
public void method1() {
addX(z);
}
}
编辑E时
`The type E must implement the inherited abstract method A.method1()` 必须要实现抽象类的所有方法
public class E extends A { //Class E
private int z;
public E(int xx, int zz) {
super(xx);
z = zz;
}
public int getZ() {
return z;
}
public void addZ(int dz) {
z = z + dz;
}
public void method2() {
addX(z);
}
@Override
public void method1() {
// TODO Auto-generated method stub
}
}
2.(1)会报错 `Cannot instantiate the type A` A 类是 抽象类 无法直接实例化
public class TestCode {
public static void main(String[] args) {
B b2 = new B(1, 2); //1 报错 因为没声明类型 b2 cannot be resolved to a variable 应为 B b2 = new B(1, 2);
A a2 = b2;//2
a2.method2(); //3 报错 因为 a2 没构造 method2 这个方法 The method method2() is undefined for the type A
System.out.println(a2.getX()); //4
}
}
(2)报错
(3)// 2会报错 父类无法赋值子类 `Type mismatch: cannot convert from B to C`
小兄弟是不考试呢,手机没被没收记得点个赞哈
答案参考如下:
1.D的构造函数与A的构造函数参数相同,在创建实例时会出现二义性。A没有无参构造函数,D必须显式调用A的构造函数
E没有添加method1()方法的实现。
2.
(1)第1行出错,A没有无参构造函数
(2)第1行出错,b2没有声明类型
(3)第2行出错,B是C的父类,B转C需要进行强制类型转换