文章目录:
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: 方法重写
(代码修改可见附录)
不正确。因为
Worker下面的eat方法比父类People的eat方法多了一个int参数,不是重写,而是重载。重写是子类重写父类相同名称、参数列表和返回类型的方法,所以这里不是。修改就可以把
int something删除(方法体也没有用到);或把@Override删掉。public void eat(){ System.out.println("worker "+getAge()+" "+getName()+" is eating."); }- 不可以(如果上一问删除的是
int something)。因为重写方法的访问权限不能比父类低。 不正确。因为
Teacher里的work重写了父类的work方法,而返回类型不能匹配,这是不可以的。将Teacher里面的work返回类型修改为Worker(与父类方法一致),并且把方法体里面的返回修改为return new Worker(),和返回类型匹配。public Worker work(){ System.out.println(getAge()+" "+getName()+" is working."); return new Worker(); }不正确。因为
Teacher里的salary重写了父类的salary方法,返回类型一个是int,一个是long,二者不匹配。应该把Teacher里的salary返回类型修改为int,并把返回的my_salary强制类型转换为int。public int salary(){ return (int)my_salary; }- 属性和静态方法都不可以被覆盖,都可以被隐藏;非静态方法可以被覆盖,也可以被隐藏。
Question3: super VS this
| 区别点 | this | super |
|---|---|---|
| 引用(代表什么) | 自身的类 | 父类 |
| 使用方式 | 通过this.访问当前类的成员变量、方法,调用当前类构造方法。 | 通过super.访问父类的成员变量、方法,调用父类构造方法。 |
| 调用构造方法(调用谁的构造方法,放在第几条语句) | 调用本类构造方法,必须放在构造方法的第一条语句。 | 调用父类构造方法,必须放在构造方法的第一条语句。 |
| 查找范围(查找顺序) | 先从当前类开始查找成员变量和方法。 | 直接访问父类成员变量和方法。 |
Question4:final
final修饰的类不可以被继承,可以继承其他类。final修饰的方法不可以被重写。final修饰的变量相当于常量,变量一旦被赋值后,就不能再被重新赋值。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测试类运行结果:

我们知道属性不设置为public是为了保护数据,如果 a 和 b 在Shape中的访问权限被设置为private,在不添加新的属性的情况下,子类想要实现自己的calcArea()该怎么办?
在父类里面添加getter方法,子类中调用父类的getter方法获得a和b,以实现calcArea()。
Question7:车车
(代码可见附录)
代码结构:
/Question07
-/src
--/a
---Car.java
---Motorbike.java
---Person.java
---Tank.java
---Test.java
---Vehicle.java测试类运行结果:
