面向对象程序设计的一段代码

// 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需要进行强制类型转换