Java学习 -- 抽象类和接口

    xiaoxiao2023-10-20  151

    抽象类

    -抽象类的由来: 利用抽象类是为了更好的对类加以分类,就如同人类不但给各种具体植物取了名字还发明了“植物”这个抽象的词,对所有具体植物进行归类一样

    Java用类模拟现实世界,所以也存在抽象类抽象类通常用来作为一个类族的最顶层的父类,用最底层的类表示现实中的具体事物,用最顶层的类表示该类族所有事物的共性。

    抽象类与抽象方法

    抽象方法 在定义Java方法时可以只给出方法头,而不给出方法内部实现代码,这样的方法称为抽象方法凡是没有方法体的方法必须得使用关键字abstract修饰为抽象方法凡是含有抽象方法的类都必须得声明为抽象类 抽象类 用abstract关键字来修饰一个类时,该类叫做抽象类包含抽象方法的类必须声明为抽象类但是一个抽象类中却可以不包含任何抽象方法,尽管比较少见抽象类不一定有抽象方法有抽象方法的一定是抽象类 abstract class A { // 有抽象方法的类一定是抽象类 public abstract void f(); // 没有方法体的方法叫抽象方法 } abstract class B {// 抽象类不一定有抽象方法 public void g() {} }

    抽象类的多肽实现

    abstract class A { abstract public void f(); } class B extends A { public void f() { System.out.printf("BBBB\n"); } } public class TestAbsPoly { public static void main(String[] args) { // A aa = new A(); //error B bb = new B(); bb.f(); // => BBBB A aa; // 可以定义一个抽象类的引用,但是不可以定义一个抽象类的对象,所以 本行可以 aa = bb aa.f(); // => BBBB } }

    final关键字

    final可以修饰 整个类类中的若干个属性类中的若干个方法
    Final 修饰整个类
    表示该类不能被继承如果认为一个类已经很完美且不需要定义子类定义子类来继承它时,可以使用它格式:public final class A { } public 和 final可以互换
    Final修饰类中的若干属性
    Final修饰类中的若干属性表示该属性必须被赋值并且只能被赋值一次初始化方式有两种:(只能选择其中一种)默认值不算真正的赋值 在定义成员变量的同时初始化在类中所有的构造函数中初始化 注意:一个类的所有普通方法内部都不可以修改final修饰过的成员变量的值
    Final修饰类中的若干方法
    表示该方法可以被子类继承,但不可以被子类重写

    接口

    接口的定义:就是抽象方法和常量值的集合。从本质上讲,接口是一种特殊的抽象类接口的格式: [public] interface interfaceName [extends SuperInterfaceList] { // 常量定义和方法 } interface It { public static final int i = 20; public abstract void f(); } interface It2 { int i = 20;// 前面省略了public abstract static public abstract void f(); } class A implements It2 { // implements 不能改为 extends因为类可以继承类,但类不能继承接口逻辑意义不通,类可以实现接口 public void f() { // i = 30; // error 接口定义的属性,在实现中不能被重改 System.out.printf("i = %d\n", i); // => 20 } } class B { public static void main(String[] args) { } } interface It1 {} interface It2 {} interface It3 extends It1, It2 { // 接口可以实现多继承 } interface It4 { int i = 20; } class A {} class T extends A implements It4, It3 { // 一个类可以在继承一个父类的同时实现一个或多个接口,但extends必须在implements前面 } public class C { public static void main(String[] args) { } } interface It { void f(); } class A implements It { public void f { // 重写方法时记得前面要加public System.out.printf("AAAA\n"); } public void g() { } } class D { public static void main(String[] args) { It it; it = new A(); it.f(); // => AAAA // it.g(); // error // It it2 = new It(); // error 不能new一个接口 } }

    接口语法

    接口中定义的属性必须是 public static final的,而接口中定义的方法则必须是 public abstract的,因此这些修饰符可以部分或全部省略接口中定义的属性的值在实现类中不能被更改一个类只能实现某个接口,不能继承某个接口但接口可以继承接口接口不但可以继承接口,而且可以继承多个接口,即接口允许多继承如果一个类只实现了一个接口的部分方法,则该类必须的声明为抽象类一个类可以在继承一个父类的同时实现一个或多个接口,但extends关键字必须的在implements之前不可以new接口对象,但可以定义一个接口引用类型的变量并将其指向实现接口的对象,达到多肽的目的!

    接口的作用

    通过接口可以实现不相关类的相同行为 如:Java规定所有可以完成自我赋值功能的类都必须得实现java.lang.Colneable接口,但该接口却是空的,该接口中没有任何内容,目的只是为了起个标志作用 接口提供了不同对象进行协作的平台 如事件处理 接口可以实现多继承,从一定程度上弥补了类只能单继承的缺陷接口是我们了解一个类功能的重要途径 如:Java整个容器框架就是以接口的方式建立起来的,实现不同接口的类完成的是不同的功能,接口使我们了解一个类功能的重要途径

    接口与抽象类的区别

    接口中的方法不允许有方法体,但抽象类却允许Java类不允许多继承,接口却允许多继承 接口可以实现多继承,即一个接口可以有多个父接口但java类只允许单继承,即一个类只能有一个父类
    最新回复(0)