Class and Interface in Java

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)
上面这个教程讲得比较清楚。

问题

  1. 可不可以在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
  1. 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的关系呀。
  1. 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)

你可能感兴趣的:(Class and Interface in Java)