0
本文总结了:
父类(superclass) 子类(subclass)
abstract(class, method),
interface(class method )
父类和子类
(该部分总结+重复)
A subclass extends a superclass. 在父类和子类的inherit and override relation中(主要就是instance variables 和methods),记住三句话:
- A subclass inherits all public instance variables and methods of the superclass. (not inherit the private instance variables and methods of the superclass.)
子类继承父类的所有public/protected instance variables and methods。
- Inherited methods CAN be overridden.(其实你也可以啥都不写,自动调用父类。)
instance variable CANNOT be overridden(though can be redefined in the subclass, but it might cause problems.)
子类可以override父类的method,但是最好不要动instance variable
- Inheritance hierarchy validation: IS-A 父子类关系
通常在subclass中 ,我们通过override method来给这个子类一个更加具体(specific)method。定义的方式同父类;而对于其他未被override的父类方法,一切照旧。
package list;
public class LockDListNode extends DListNode{
protected boolean lockornot; // 加入了一个新的boolean变量
// constructor
LockDListNode(Object i, DListNode p, DListNode n) {
super(i,p,n);
// 构造函数照旧(DListNode的),但是建成的node是LockDListNode类型的了,并且多了一个属性 - lockornot
// lockornot = false; // default类型就是false
}
}
比如在lockListNode例子中,lockListNode是ListNode的子类。(见上⬆️)
我们重新写了LockListNode中的remove method,在call remove method使首先判断:
-如果“locked”(lockornot = true),调用LockListNode中的新的remove method(not remove);
-如果“unlocked”(lockornot = false),调用super.remove() - DListNode中的remove method把它移走。
此处,在子类中如果希望调用父类中的原方法(未被override的版本),使用“super.方法名()”的方式调用。
http://www.runoob.com/java/java-override-overload.html Java 重写(Override)与重载(Overload)
上面这个教程讲得比较清楚。
问题
- 可不可以在subclass(Dog)里面不写Superclass(Animal)的 move method,但是调用move呢?
答:不写你就没得用呗。
假如你都是建立的Animal reference,那是可以的。但是如果你用Dog遥控器,上面没有move按键,无法调用。
例子1
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestSuperSub{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
输出结果是
动物可以移动
狗可以跑和走
虽然两个遥控器都是Animal的,但是b是狗类型&&override了move method——所以按下Animal上的遥控器执行b.move()时,调用的是 狗对象 里面的 method。
例子2
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
// 啥也没有,压根没提move method
}
public class TestSuperSub{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
输出结果是
动物可以移动
动物可以移动
狗对象里面没有override move method,压根提都没提。但是由于父类Animal里面有move method,所以按下Animal上的遥控器执行b.move()时,调用的是 父类 里面的 method。
使用super.method可以实现相同功能,如下:
class Dog extends Animal{
public void move(){
super.move();
}
}
输出结果是
动物可以移动
动物可以移动
但是,但是,如果你 狗类里面没有写move method && 用的狗类遥控器(不是父类)——狗类遥控器上没有move按键,因此没有move输出。(什么提示也没有。)
Abstract
(p229)
When you don't want to make a new Object of one Class type (you don't want to instantiate a class) - Mark this class Abstract!!
如果你不想制造某Class的Object,可以把这个class标记成Abstract。
Abstract class的性质
- abstract class可以有abstract method和non-abstract method;
但是你一旦有一个abstract method了,你就必须标记为abstract class了!!! - All abstract method MUST be implemented in the first concrete subclass in the inheritance tree.抽象方法必须被第一个实体子类执行!!
补充:Object Type
(待续)
Interface
Interface绝壁是Abstract Class, 更过分的是它只有Abstract Method!!
Interface里面的method有两属性:public && abstract
- 解答存疑1:INTERFACE
- A class that
Implements an Interface MUST implement
ALL its method(Interface method全都是abstract).
就好像一个合同一样:
interface Dog extends Canien implements Pet{
public abstract void play();
}
public class Dog extends Canine implements Pet{
public void play(){你想说的内容}
public void eat(){其他普通override内容}
//【也可以不override, 这样就是直接调用父类method,但是前提是你遥控器也是父类的】
}
Dog implements Pet,狗狗签订了宠物合同——有“宠物”属性,必须要宠物要做的事(method)。
- 问:必须implement所签合同interface的所有的method,是因为abstract method的缘故?
答:不全是。
(All abstract method must be implemented in the first concrete subclass in the inheritance tree.)
但是 签合同 不是 inheritance tree的关系呀。
- ALL interface method自带属性:
- Public and Abstract (implicitly)
-因为是abstract 所以 MUST :
- end in ";"
- no body 没有波浪括号
Example:
interface Nose{ // interface Nose - public && abstract (implicitly)【?】 public int iMethod(); // iMethod 是定义在interface里面的method,所以他也是public && abstract } 记住,所有**abstract** class/interface里面的method - abstract,下面遇见的第一个concrete class 一定要declare 这些abstract method
另外,一个class可以签多个合同(implements multiple interfaces)
网友评论