java继承和接口

Java 继承 接口

为什么要学继承?

由于Java语言一般不允许大量重复的代码出现,这个时候想要消除结构定义上的重复,就要用到继承。

在Java中,继承用extends关键字来实现,

语法:

class 子类 extends 父类{}

在继承结构中,通常会把子类称为派生类,父类称为超类

注意:

类只能单继承,不允许多重继承,允许多层继承

错误的写法:多重继承

class A{}
class B{}
class C extends A,B{}

正确的的写法:多层继承

class A{}
class B extends A{}
class C extends B{}

也就是说一个类只能有一个父类,这是因为如果一个子类A继承了父类B和父类C,当父类B和父类C中有一个名字相同并且参数列表相同的方法时,类A就会产生混淆,所以只能单继承,单继承有时候会限制类的扩展性;

继承的限制

package com.zsq;

import lombok.Getter;
import lombok.Setter;
//使用了注解省略了set和get方法
@Setter
@Getter
class Person {
    private String name;
    private int age;
    //构造方法
    public Person()
    {
        System.out.println("父类的构造方法");
    }
}

@Setter
@Getter
class Student extends Person{
    private String schoolName;
    //构造方法
    public Student()
    {
        System.out.println("子类的构造方法");
    }
}
public class Test {
    public static void main(String[] args)
    {
        //实例化子对象
        Student student=new Student();
        student.setName("花花");
        student.setAge(18);
        student.setSchoolName("励志中学");
        System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

运行结果:

image-20210415193151880

从运行结果看出:子类对象在进行实例化前首先调用父类构造方法,再调用子类构造方法实例化子类对象。

为什么要学接口?

因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限

接口可以理解为一种特殊的类,里面全部是由全局常量公共的抽象方法所组成,JDK1.8开始,还可以使用default定义普通方法或者使用static定义静态方法。接口是解决Java无法使用多继承的一种手段,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

语法:

interface 名称{全局常量;抽象方法(public,default,static修饰)}

interface IMessage{													//定义接口
    public static final String INFO="哈哈";						  //全局常量
    public abstract String getInfo();							   //抽象方法
    public default boolean connect(){
         System.out.println("嘻嘻");								 //普通方法,可以被子类继承或覆写
    }
}

抽象方法的特点:

(1)抽象方法是一个不完整的方法,没有方法体。

(2) 抽象方法一定是抽象类,抽象的类里不一定有抽象方法 (接口中的方法一定是抽象方法!)

(3)抽象方法和类都要由abstract 修饰

(4)抽象类不能通过new 来实例化,抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调 用如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

接口的特点

只包含常量和方法的定义,而没有变量和方法的实现但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体

Java 方法体

public void test()

{

}

大括号里就是方法体。如果没有{}就没有方法体,有{} 但是里面没内容说明方法体为空,但是有方法体。test是方法名。方法体就是方法的内容

USB 接口:

package com.zsq;
public  interface USB {
    void read();
    void write();
}

USBFlashDisk类:

package com.zsq;
public class USBFlashDisk implements USB{
    @Override
    public void read() {
        System.out.println("U盘正在通过USB功能读取数据");
    }

    @Override
    public void write() {
        System.out.println("U盘正在通过USB功能写入数据");
    }
}

keyboard类:

package com.zsq;
public class keyboard implements USB{
    @Override
    public void read() {
        System.out.println("键盘正在通过USB功能读取数据");
    }

    @Override
    public void write() {
        System.out.println("键盘正在通过USB功能写入数据");
    }
}

Main类:

package com.zsq;
public class Main {
    public static void main(String[] args) {
        USBFlashDisk usbFlashDisk=new USBFlashDisk();
        usbFlashDisk.read();
        usbFlashDisk.write();
        keyboard key=new keyboard();
        key.read();
        key.write();
    }
}

运行结果:

image-20210415203114440

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值