美文网首页Coding
Class and Interface in Java

Class and Interface in Java

作者: 程序猪小羊 | 来源:发表于2018-01-17 08:51 被阅读2次

    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

        本文链接:https://www.haomeiwen.com/subject/kicwnxtx.html