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());
}
}
运行结果:
从运行结果看出:子类对象在进行实例化前首先调用父类构造方法,再调用子类构造方法实例化子类对象。
为什么要学接口?
因为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();
}
}
运行结果: