文章目录:
  1. Question 1: Package
  2. Question 2: 方法重写
  3. Question3: super VS this
  4. Question4:final
  5. Question5:权限
  6. Question6:Shape
  7. Question7:车车

Question 1: Package

在每个文件里加上对应的配package和import语句即可。(代码修改可见附录)

// Main.java 前加入
import com.oo.cc.C;

// A.java 前加入
package com.oo.aa;

//B.java 前加入
package com.oo.bb;
import com.oo.aa.A;

//C.java 前加入
package com.oo.cc;
import com.oo.bb.B;

//BTest.java 前加入
package test;
import com.oo.bb.B;

Question 2: 方法重写

(代码修改可见附录)

  1. 不正确。因为Worker下面的eat方法比父类Peopleeat方法多了一个int参数,不是重写,而是重载。重写是子类重写父类相同名称、参数列表和返回类型的方法,所以这里不是。

    修改就可以把int something删除(方法体也没有用到);或把@Override删掉。

    public void eat(){
        System.out.println("worker "+getAge()+" "+getName()+" is eating.");
    }
  2. 不可以(如果上一问删除的是int something)。因为重写方法的访问权限不能比父类低。
  3. 不正确。因为Teacher里的work重写了父类的work方法,而返回类型不能匹配,这是不可以的。将Teacher里面的work返回类型修改为Worker(与父类方法一致),并且把方法体里面的返回修改为return new Worker(),和返回类型匹配。

    public Worker work(){
        System.out.println(getAge()+" "+getName()+" is working.");
        return new Worker();
    }
  4. 不正确。因为Teacher里的salary重写了父类的salary方法,返回类型一个是int,一个是long,二者不匹配。应该把Teacher里的salary返回类型修改为int,并把返回的my_salary强制类型转换为int

    public int salary(){
        return (int)my_salary;
    }
  5. 属性和静态方法都不可以被覆盖,都可以被隐藏;非静态方法可以被覆盖,也可以被隐藏。

Question3: super VS this

区别点thissuper
引用(代表什么)自身的类父类
使用方式通过this.访问当前类的成员变量、方法,调用当前类构造方法。通过super.访问父类的成员变量、方法,调用父类构造方法。
调用构造方法(调用谁的构造方法,放在第几条语句)调用本类构造方法,必须放在构造方法的第一条语句。调用父类构造方法,必须放在构造方法的第一条语句。
查找范围(查找顺序)先从当前类开始查找成员变量和方法。直接访问父类成员变量和方法。

Question4:final

  1. final修饰的类不可以被继承,可以继承其他类。
  2. final修饰的方法不可以被重写。
  3. final修饰的变量相当于常量,变量一旦被赋值后,就不能再被重新赋值。
  4. final修饰的引用类型变量不可以改变其引用地址吗,但是可以通过引用改变对象内部属性的值。

Question5:权限

(代码修改可见附录)

Lab 2 中的单例模式,或者说所有构造方法都是 private 时,可能有子类吗?

不可能,因为Java中的子类在构造时,会隐式或显式调用父类的构造方法。如果父类的构造方法都是 private,那么子类根本无法调用它们,不可以构造,所以无法继承父类。

final 类可以视为所有构造方法都是 private 的类吗?

不可以。是因为final类虽然有也不能被继承,但是其可以被实例化,其构造方法可能是public之类的,外部类可以对其进行实例化。而都是 private 的类为单例模式,不可以被实例化。所以两者是不同的。

Question6:Shape

(代码可见附录)

代码结构:

/Question06
-/src
--/ss
---Elipse.java
---Rectangle.java
---Rhombus.java
---Shape.java
---Test.java

测试类运行结果:

image-20251030204309036

我们知道属性不设置为 public 是为了保护数据,如果 a 和 b 在 Shape 中的访问权限被设置为 private,在不添加新的属性的情况下,子类想要实现自己的 calcArea()该怎么办?

在父类里面添加getter方法,子类中调用父类的getter方法获得ab,以实现calcArea()

Question7:车车

(代码可见附录)

代码结构:

/Question07
-/src
--/a
---Car.java
---Motorbike.java
---Person.java
---Tank.java
---Test.java
---Vehicle.java

测试类运行结果:

image-20251030212216872