lxshllmlxk3
2021-05-25 15:59
采纳率: 57.1%
浏览 108

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

// 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

 

急求,五点之前请作答,感激不尽

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • 清枫cc 2021-05-25 16:47
    已采纳

    第一题:

    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同一类,所以这样可以。

     

     

     

    已采纳该答案
    打赏 评论
  • CSDN专家-link 2021-05-25 16:25

    别为什么会发生错误啊,把具体出现哪些错误贴一下啊,时间紧,能定位快一点哈

    打赏 评论
  • CSDN专家-link 2021-05-25 16:26

    (1).1会错误吧,A缺少默认构造函数,只有带参数构造函数

    打赏 评论
  • 一剑荒芜 2021-05-25 16:26

    1,

         第一小问: A类中没有无参构造,所以D类继承A类需要在自己的构造函数中调用, method1方法上面要加@Override

         第二小问: E类没重写父类method1方法

    2,

          选项1错误,原因:A类没有无参构造所以new对象时不传参数报错;

          选项2错误,原因:没有指定b2类型

          选项3错误,原因:b3是父类,c3是子类,不能将父类赋值给子类

    打赏 评论
  • 年轻的狼 2021-05-25 16:29

    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);
        
        }
        
    }
    打赏 评论
  • 年轻的狼 2021-05-25 16:31

    编辑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
    
        }
        
    }
    打赏 评论
  • 年轻的狼 2021-05-25 16:35

    2.(1)会报错 `Cannot instantiate the type A` A 类是 抽象类 无法直接实例化

    打赏 评论
  • 年轻的狼 2021-05-25 16:40
    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)报错

    打赏 评论
  • 年轻的狼 2021-05-25 16:43

    (3)// 2会报错 父类无法赋值子类 `Type mismatch: cannot convert from B to C`

    打赏 评论
  • 年轻的狼 2021-05-25 16:45

    小兄弟是不考试呢,手机没被没收记得点个赞哈

    打赏 评论
  • qfl_sdu 2021-05-25 16:50

    答案参考如下:

    1.D的构造函数与A的构造函数参数相同,在创建实例时会出现二义性。A没有无参构造函数,D必须显式调用A的构造函数
    E没有添加method1()方法的实现。
    2.
    (1)第1行出错,A没有无参构造函数
    (2)第1行出错,b2没有声明类型
    (3)第2行出错,B是C的父类,B转C需要进行强制类型转换

    打赏 评论

相关推荐 更多相似问题