从零开始的Java编程之抽象与接口

一、抽象类:

定义抽象方法:

  • [修饰符] abstract 返回值类型 方法名([参数列表]); //抽象方法
  1. 概念:

    抽象类和具体类是相对概念,抽象是一种存在思想逻辑中的概念,而具体是一种可见可触摸的现实对象。比如说,男人抽象一点,生物更抽象。

    抽象的概念是由具体概念依其共性而产生的,把具体概念的诸多个性排除,集中的描述其共性,就会产生一个抽象的概念。

    抽象高于具体,但是需要具体来实现抽象。

    抽象的外延伸大,内涵小,而具体的外延小,内涵大。

  2. 抽象类与普通类:

    普通类可以实例化调用;抽象类不能被实例化。因为它是一种概念而不是具体。

    普通类和抽象类都可以被继承,但抽象类被继承后,需要子类重写继承的方法。除非子类也是抽象类。

    演示:

    public class pet{
     public void play(){} // Pet类,普通父类,方法里是空的
    }
    ----------------------
    public class Cat extends Pet{ // 猫类子类,重写父类方法
     public void play(){
         System.out.println("1、猫爬树");
     }
    }
    ----------------------
    public class Dog extends Pet {    //这是子类,是一个狗类,重写了父类方法
    	public void play(){
    	System.out.println("2、狗啃骨头");
    	}
    }
    ----------------------
    public class Test {
    public static void main(String[] args) {  //这是测试类,分别调用了子类的不同方法
    
    Pet p1=new Cat();  //多典型的多态表现     
    Pet p2=new Dog();
    
    p1.play();
    p2.play();
    }
    }
    ----------------------
    输出结果:
    1、猫爬树
    2、狗啃骨头
    ----------------------
     
    //抽象方法
    public abstract class Pet{
     
     //抽象方法
     public abstract void run();//没有方法体,没有大括号
    }
    

    上述代码若改成抽象父类,其子类的写法依旧不变,那么抽象类的存在意义是什么?

    抽象类就是为了强制不能实例化,定义一种规则。

  3. 抽象类的特点:

    • 抽象类,抽象方法有 abstract 修饰
    • 抽象方法没有方法体
    • 抽象方法不能执行
    • 抽象方法不能用private修饰
    • 抽象类中可以有普通方法
    • 如果一个类继承了抽象类,那这个类必须重写它的抽象方法或者将类声明为抽象类
    • 抽象类是有构造方法的,但是不能被实例化
    • 构造方法,类方法(static)不能声明为抽象方法
    • 一个类中只要含有抽象方法,这个类就必须是抽象类;抽象类不一定含有抽象方法

    若抽象类中有非抽象方法,继承这个抽象类中的子类可以直接使用此非抽象方法(前提是能访问到)

二、接口

定义接口

[修饰符] interface 接口名{}

public interfacae USB{
public static final name = ""; //静态常量

	public void service();
}

接口中的方法默认是抽象方法,所以省略abstract修饰符

接口中的方法默认都是public,所以可以省略public

接口中的变量只能是静态常量(static final),所以可以省略 static final,静态常量在定义时就需要赋值,且不可变

接口使用和抽象类一样,都是通过子类

一个类可以实现多个接口,接口之间使用 , 隔开

接口的实现类中,可以有普通方法

实现的方法必须是 public 的

java 中继承是单继承,使用 extends 关键字;但是一个类可以实现多个接口,使用 implements ,多个 接口之间用 , 隔开。

一个类可以同时继承和实现接口, extends 要在 implements 之前

public class LenovoComputer extends Computer implements USBInterface, ChargeInterface{
}

接口与接口之间是继承关系,使用 extends 关键字。多个接口使用 , 隔开

public interface USBC extends USBInterface,ChargeInterface{
}
  • jdk8接口新特性

    静态方法必须写方法体,jdk1.8新增,default修饰符修饰的方法要加方法体,不写修饰符默认是public,所以要写方法体的话必须加static

    public interface USBInterface {
        public static void test1() {
            System.out.println("test1");
            }
    }
    
  
  

三、抽象类与接口

  1. 概念:

    接口是对动作的抽象,抽象类是对本质的抽象

    抽象类表示的是,这个对象是什么,接口表示的是,这个对象能做什么。比如男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质上的区别。吃东西是一个动作,你可以把吃东西定义为一个接口,然后让两个类去实现他。

    所以,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等

  2. 使用情况

    • 抽象类 和 接口 都是用来抽象具体对象,但是接口的抽象级别最高。
    • 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量(final)。
    • 抽象类主要用来抽象类别,接口主要用来抽象功能。
    • 抽象类中不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的(static修饰的除外,可以有方法体)。
    • 抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。
    • 当你关注一个事物的本质的时候,用抽象类。
    • 当你关注一个操作的时候,用接口。

四、总结:

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值