抽象类与接口

本文介绍了Java中抽象类和接口的概念,包括抽象类的使用场景、特点(如不能实例化、抽象方法等),以及接口的定义、特点(如接口的规范、实现方式、成员变量和方法等)。此外,还讨论了Java8和Java9中接口的更新,如默认方法、静态方法和私有方法的应用。
摘要由CSDN通过智能技术生成

抽象类

        一、抽象类的概述

                当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了。

                在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

        二、抽象类的特点

                ①抽象类和抽象方法必须使用 abstract 关键字修饰

                ②抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

                ③抽象类不能实例化

                ④抽象类可以有构造方法

                ⑤抽象类的子类

                        要么重写抽象类中的所有抽象方法,要么是抽象类

//抽象类的定义
public abstract class 类名 {}

//抽象方法的定义
public abstract void eat();
        三、 抽象类的案例

                案例需求:

                        定义猫类(Cat)和狗类(Dog)

                        猫类成员方法:eat(猫吃鱼)drink(喝水…)

                        狗类成员方法:eat(狗吃肉)drink(喝水…)

//动物类:猫、狗共有的属性
abstract class Animal {
    public void drink(){
        System.out.println("喝水");
    }

    public Animal(){

    }

    public abstract void eat();
}

//猫类
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

//狗类
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

//测试方法
public class Demo{
	public static void main(String[] args) {
        Dog d = new Dog();
        d.eat();    //输出:狗吃肉
        d.drink();  //输出:喝水

        Cat c = new Cat();
        c.eat();    //输出:猫吃鱼
        c.drink();  //输出:喝水

        //Animal a = new Animal();
        //a.eat();
    }
}

接口

        一、接口的概述

                接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。

                Java中接口存在的两个意义:

                        ①用来定义规范

                        ②用来做功能的拓展

        二、接口的特点

                ①接口用关键字interface修饰

public interface 接口名 {} 

                ②接口和类是实现关系,类实现接口用implements表示

public class 类名 implements 接口名 {}

                ③接口不能实例化

                        我们可以创建接口的实现类对象使用

                ④接口的子类

                        要么重写接口中的所有抽象方法,要么子类也是抽象类

        三、接口的成员变量与成员方法的特点

                ①成员变量

                        只能是常量,默认修饰符:public static final

                ②成员方法

                        只能是抽象方法,默认修饰符:public abstract

                ③构造方法

                        没有,因为接口主要是扩展功能的,而没有具体存在

//接口
interface Inter {
    public static final int NUM = 10;

    public abstract void show();
}

//实现类
class InterImpl implements Inter{

    public void method(){
        //NUM = 20;//编译时报错
        System.out.println(NUM);
    }

    public void show(){}
}

//测试类
public class Demo{
    public static void main(String[] args) {
		InterImpl in=new InterImpl();
		in.method();	//输出:10
		
        System.out.println(Inter.NUM);	//输出:10
    }
  
}
        四、类与接口的关系

                ①类与类的关系

                        继承关系,只能单继承,但是可以多层继承。

                ②类与接口的关系

                        实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

                ③接口与接口的关系

                        继承关系,可以单继承,也可以多继承。

        五、拓展知识:接口组成更新

                ①接口组成更新概述

                        1、常量:public static final

                        2、抽象方法:public abstract

                        3、默认方法(Java 8)

                        4、静态方法(Java 8)

                        5、私有方法(Java 9)

                ②接口中的默认方法

                        格式:public default 返回值类型 方法名(参数列表) { }

                        作用:解决接口升级的问题

                        注意事项:

                                1、默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字

                                2、public可以省略,default不能省略

                                3、如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写

                ③接口中的静态方法

                        格式:public static 返回值类型 方法名(参数列表) { }

                         注意事项:

                                1、静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

                                2、public可以省略,static不能省略

                ④接口中的私有方法

                        私有方法产生原因:Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性。

                          格式1:private 返回值类型 方法名(参数列表) { }

                          格式2:private static 返回值类型 方法名(参数列表) { }

                          注意事项:

                                1、默认方法可以调用私有的静态方法和非静态方法

                                2、静态方法只能调用私有的静态方法

public interface Inter{
    //抽象方法
    public abstract void test();

    //接口中的默认方法
    public default void show1(){
        System.out.println("show1.....")
    }

    //接口中的静态方法
    public static void show2(){
        System.out.println("show2.....")
    }

    //接口中的私有方法(Java9)
    private void show3(){
        System.out.println("show3.....")
    }
}

                         

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值