JAVA interface & abstract

摘要:JAVA interface & abstract


界面 & 抽象类
抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来。
ex: 狼和狗共性都是犬科,犬科就是抽象出来的概念。鸟跟飞机都会飞,但飞的内容不同

抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

abstract class Action{
       abstract void fly();
}
抽象类特点:
1.          抽象方法一定在抽象类中
2.          抽象方法和抽象类必须被abstract关键字修饰
3.          抽象类不可以用new创建物,因为使用抽象方法没意义
4.          抽象类中的方法要被使用,必须由子类覆写所有抽象方法后,建立子类对象调用。如果子类只覆写了部分抽象方法,那该子类还是一个抽象类

抽象类和抽象方法必须用abstract关键字来修饰。
抽象方法只有方法声明,没有方法体,定义在抽象类中。格式:修饰符abstract 返回数值类型函数名(参数清单) ;抽象类不可以被产生实例,也就是不可以用new创建对象。原因如下:抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。而且抽象类即使创建了对象,调用抽象方法也没有意义。抽象类通过其子类产生实例,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。


特殊说明:
抽象类中也可以不用包含抽象方法,其代表的是该抽象类只是不想被实例化


界面:
interface {},界面中的成员修饰符是固定的。
成员常量:public static final
成员函数:public abstract

界面的出现将“多继承”通过另一种形式体现出来,即“多实现”。
界面是对外暴露的规则。
界面是程序的功能扩展。
界面可以用来多实现。
类与界面之间是实现关系,而且类可以继承一个类且同时实现多个界面。
界面与界面之间可以有继承关系。
定义:某一类事物的多种存在形态。

interface Person{
       public static final int age;
       public abstract void say();
}

子类需实践界面所有方法后才可以实例化,否则子类会成为抽象类

多态:
多态的存在提高了程序的扩展性和后期可维护性
前提:需要存在继承或者实现关系,即要有覆写操作

abstract class Animal{
    abstract void eat();
}
class Cat extends Animal{
    public void eat(){
        System.out.println("吃鱼");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("吃肉");
    }
}
class Hello{
    public static void main(String[] args){
        show(new Cat());
        show(new Dog());
    }
    public static void show(Animal a){
        a.eat();
    }
}


Animal a = new Cat();  向上转型
a.eat();
若要使用Cat类独特的方法时,再使用向下转型
Cat b = (Cat)a;
向下转型后就可使用其特有的方法,即Animal类不具有的方法。而向下转型必须先要有向上转型的前提下才可以使用。

instanceof:
instanceof用来判断是否属于某一个类,可以用在向上转型后,在向下转型时是否正常

ex:
if(a instance Cat)

多态的引用:
成员方法:是看右边的类,前提是子类有覆写父类方法
成员变量:是看左边的类。
在静态方法中,是看左边的类。
ex:
class A{
    int num = 1;
    void show(){
        System.out.print("Function: A");
    }
}
class B extends A{
    int num = 2;
    void show(){
        System.out.print("Function: B");
    }
}

class Hello{
    public static void main(String[] args){
        A a = new B();
        System.out.println(a.num);   //输出 1
        a.show();  //输出 Function: B
       
    }
}


内部类:

  • 将一个类定义在另一个类的里面,对里面那个类就称为内部类,内部类可以直接访问外部类中的成员,包括私有成员。
  • 而外部类要访问内部类中的成员必须要建立内部类的对象。
  • 内部类定义在成员位置上可以被private static成员修饰符修饰。被static修饰的内部类只能访问外部类中的静态成员。

内部类定义在局部位置上也可以直接访问外部类中的成员。
同时可以访问所在局部中的区域变量,但必须是被final修饰的。
内部类可以继承或实现一个外部类或者界面。

格式为:
new 外部类名或者界面名(){覆盖类或者界面中的代码,(也可以自订内容)}
简单理解:就是建立一个建立一个带内容的外部类或者界面的子类匿名对象。
class A{
    int num = 1;
    class B{
        int num = 2;
    }
}
class Hello{
    public static void main(String[] args){
        A.B a = new A().new B();
        System.out.println(a.num);  //输出 2
    }
}