JavaSE--抽象类和接口

发布时间 2023-08-15 10:43:23作者: 洛小依ovo

一、抽象类

1、抽象类

  1)抽象类无法实例化,无法创建对象

  2)抽象类:是类和类之间的共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类,由于类本身是不存在的,所以抽象类无法创建对象,抽象类与抽象类之间也还有共同特征,还可以再一步抽象

  3)抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的,final和abstract是不能一起用的,是对立的

  4)抽象类的子类可以是抽象类

  5)抽象类虽然无法实例化,但是有构造方法,这个构造方法是供子类使用的

2、抽象类属于什么类型

  抽象类属于引用数据类型

3、抽象类的定义

[修饰符列表] abstract class 类名{
    类体;
}

4、抽象方法

  抽象方法:表示没有实现的方法,没有方法体的方法,没有方法体,以分号结尾,修饰符列表中有abstract关键字

  抽象类中不一定有抽象方法。但抽象方法必须在抽象类中

  重点::一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了

public abstract void doSome();

 

public class AbstractTest02{
	public static void main(String[] args){
		Animal a = new Bird();
		// 这就是面向抽象编程。
		a.move();
		Animal x = new Cat();
		x.move();
	}
}

// 动物类(抽象类)
abstract class Animal{

	// 抽象方法
	public abstract void move();
}

// 子类(非抽象的)
// 错误: Bird不是抽象的, 并且未覆盖Animal中的抽象方法move()
/*
class Bird extends Animal{
}
*/

class Bird extends Animal{
	// 必须把抽象的方法实现了。
	public void move(){
		System.out.println("鸟儿在飞翔!");
	}
}

class Cat extends Animal{
	public void move(){
		System.out.println("猫在走猫步!");
	}
}

// 如果Bird是抽象类的话,那么这个Animal中继承过来的抽象方法也可以不去重写/覆盖/实现。
/*
abstract class Bird extends Animal{
}
*/

 

二、接口

1、接口

  1.1接口也是一种引用数据类型,编译之后也是class字节码文件

  1.2接口是完全抽象的,(抽象类是半抽象的),或者说是接口是特殊的抽象类

  1.3接口的语法

[修饰符列表] interface 接口名{
}

  1.4、接口支持多继承,一个接口可以继承多个接口

    类和类之间叫继承,类和接口之间叫做实现。可以将“实现”看作“继承”

  1.5、接口中只包含两部分内容,一部分:常量,一部分:抽象方法

  1.6、接口中所有的元素都是public修饰(都是公开的

  1.7、接口中的抽象方法public abstract可以省略,当然方法是抽象的,不能有方法体

  1.8、接口中常量的public static final可以省略

  1.9、实现使用implements关键字完成,继承使用extends关键字完成

  1.10、当一个非抽象的类实现接口的话,必须把接口中所有的抽象方法全部实现

2、接口的基础语法

public class Test01{
    public static void main(String[] args){
        
    }
}

interface A{
    
}

interface B{
    
}
// 一个接口可以继承多个接口,多继承
interface C extends A,B{
    
}

interface MyMath{
    // public static final double PI = 3.14;
    double PI = 3.1415926;
    int sum(int a,int b);
    int sub(int a,int b);
}

 1.11、一个类可是实现多个接口

public class Test02{
    public static void main(String[] args){
        // 多态
        MyMath mm = new MyMathImp1();
        int result = mm.sum(10,20);
    }
}
interface MyMath{
    double PI = 3.1415926;
    int sum(int a,int b);
    int sub(int a,int b);
}
class MyMathImp1 implements MyMath{
    // 实现接口中的方法
    public int sum(int a,int b){
        return a + b;
    }
    public int sub(int a,int b){
        return a - b;
    }
    /*错误:正在尝试分配更低的访问权限,之前为public
    int sub(int a,int b){
        return a - b;
    }
    */
}

  1.12、接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转

    但是一定注意,运行时可能会出现ClassCastException异常,类转换异常

public class Test03{
    public static void main(String[] args){
        A a = new D();
        B b = new D();
        C c = new D();
        // B b2 = (B)a;// 这样是可以的
        if (a instanceof B){
            B b2 = (B)a;
        }
    }
}

interface A{
    void m1();
}
interface B{
    void m2();
}
interface C{
    void m3();
}
class D implements A,B,C{
    // 实现A接口中的方法
    public void m1(){
    
    }
    // 实现B接口中的方法
    public void m2(){
    
    }
    // 实现C接口中的方法
    public void m3(){
    
    }
}

 

3、继承和实现一起使用

  extends关键字在前,implements关键字在后

class Animal{

}
// 接口通常提取的是行为动作
interface Flyable{
    void fly();
}

class Cat extends Animal implements Flyable{
    public void fly(){
        System.out.println("猫猫zai飞翔");
    }
}
// 蛇类,不想让他飞,不实现Flyable接口就可以
class Snake extends Animal{
    
}

 

三、抽象类和接口的区别

只说一下抽象类和接口在语法上的区别
 
  • 抽象类是半抽象的
  • 接口是完全抽象的
 
  • 抽象类中有构造方法
  • 接口中没有构造方法

 

  • 接口和接口之间支持多继承
  • 类和类之间只能单继承
 
  • 一个类可以同时实现多个接口
  • 一个抽象类只能继承一个类(单继承)

 

  • 接口中只允许出现常量和抽象方法