Java抽象类与接口的关系
1.抽象类:
Java可以创建一种类专门用来当做父类,这种类称为“抽象类”。
“抽象类”的作用类似“模板”,其目的是要设计者依据它的格式来修改并创建新的类。但是不能直接由抽象类创建对象,只能通过抽象类派生出新的类,再由它来创建对象。
抽象类的定义及使用规则:
<1>包含一个抽象方法的类必须是抽象类
<2>抽象类和抽象方法都要使用abstract关键字声明
<3>抽象方法只需声明而不需要实现
<4>抽象类必须被子继承、子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法
抽象类不能使用final关键字声明,因为使用final关键字声明的类不能被子类所继承
抽象方法不要使用private声明,因为使用private声明了就不能被子类覆写
一个抽象类中可以定义构造方法
abstract class A{ public static final String FLAG = "CHINA"; private String name = "张三"; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void print(); //定义一个抽象方法 } class B extends A{ //继承抽象类,覆写全部的抽象方法 public void print(){ System.out.println("FLAG="+FLAG); System.out.println("姓名="+super.getName()); } } public class abstract_demo { public static void main(String[] args) { // TODO 自动生成的方法存根 B b = new B(); b.print(); } }
假设人分为学生和工人,学生和工人可以说话,但是学生和工人说话的内容不一样,使用抽象类实现这样一个场景
abstract class People{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public People(String name, int age) { //构造函数 this.name = name; this.age = age; } public void say(){ System.out.println(this.getContent()); } public abstract String getContent(); //get方法,说话的内容由子类决定 } class Student extends People{ private float score; public Student(String name, int age,float score) { super(name, age); //调用父类的构造方法 // TODO 自动生成的构造函数存根 this.score = score; } @Override public String getContent() { //覆写父类中的get抽象方法 // TODO 自动生成的方法存根 return "学生信息-->姓名:"+super.getName()+"年龄:"+super.getAge()+"成绩:"+this.score; } } class Worker extends People{ private float salary; public Worker(String name, int age,float salary) { super(name, age); //调用父类的构造方法 // TODO 自动生成的构造函数存根 this.salary = salary; } @Override public String getContent() { //覆写父类中的get抽象方法 // TODO 自动生成的方法存根 return "工人信息-->姓名:"+super.getName()+"年龄:"+super.getAge()+"薪水:"+this.salary; } } public class abstract_demo2 { public static void main(String[] args) { // TODO 自动生成的方法存根 Student stu = new Student("张三",18,99.0f); Worker wor = new Worker("张三",18,1000.0f); stu.say(); wor.say(); } }
2.接口:
Java接口可以理解为一种特殊的类,是由全局常量和公共的抽象方法所组成,定义在接口中的方法默认是public的
接口如果不写public,则也是public访问权限,不是default
与抽象类一样,接口若要使用也必须通过子类,子类通过implements关键字实现接口。
一个子类可以同时实现多个接口,摆脱了Java的单继承局限
interface A_1{ //定义接口A_1 public String AUTHOR = "张三"; //定义全局常量,等价于:public static final String AUTHOR = "张三"; public void print(); //定义抽象方法,等价于:public abstract void print(); public String getInfo(); //定义抽象方法,等价于:public abstract String getInfo(); } interface B_1{ //定义接口B_1 public void say(); //定义抽象方法 } class X implements A_1,B_1{ //子类同时实现两个接口 @Override public void say() { //覆写B接口中的抽象方法 // TODO 自动生成的方法存根 System.out.println("Hello World!"); } @Override public void print() { //覆写A接口中的抽象方法 // TODO 自动生成的方法存根 System.out.println("作者:"+AUTHOR); } @Override public String getInfo() { //覆写A接口中的抽象方法 // TODO 自动生成的方法存根 return "HELLO"; } } public class interface_demo { public static void main(String[] args) { // TODO 自动生成的方法存根 X x = new X(); //实例化子类对象 x.say(); //调用被覆写过的方法 x.print(); //调用被覆写过的方法 } }
同时实现继承和接口
interface A_2{ //定义接口A_1 public String AUTHOR = "张三"; /定义全局常量 public void print(); //定义抽象方法 public String getInfo(); //定义抽象方法 } abstract class B_2{ //定义一个抽象类 public abstract void say(); //定义一个抽象方法 } abstract class B_3 implements A_2{ //定义一个抽象类,并实现接口 public abstract void say(); //定义一个抽象方法 } class X_2 extends B_2 implements A_2{ //同时实现继承和接口 @Override public String getInfo() { //覆写A_2接口中的抽象方法 // TODO 自动生成的方法存根 return "HELLO"; } @Override public void say() { //覆写B_2抽象类中的抽象方法 // TODO 自动生成的方法存根 System.out.println("Hello World!"); } @Override public void print() { //覆写A_2接口中的抽象方法 // TODO 自动生成的方法存根 System.out.println("作者:"+AUTHOR); } } class X_3 extends B_3{ //继承抽象类,覆写全部的抽象方法 @Override public void print() { //覆写B_3抽象类中的抽象方法 // TODO 自动生成的方法存根 System.out.println("作者:"+AUTHOR); } @Override public String getInfo() { //覆写B_3抽象类中的抽象方法 // TODO 自动生成的方法存根 return "HELLO"; } @Override public void say() { //覆写B_3抽象类中的抽象方法 // TODO 自动生成的方法存根 System.out.println("Hello World!"); } } public class extends_implements_demo { public static void main(String[] args) { // TODO 自动生成的方法存根 X_2 x = new X_2(); //实例化子类对象 x.say(); //调用被覆写过的方法 x.print(); //调用被覆写过的方法 X_3 x_1 = new X_3(); x_1.say(); x_1.print(); } }
接口的继承
interface C{ // 定义接口C public String AUTHOR = "张三"; //定义全局常量 public void printC(); //定义抽象方法 } interface D{ //定义接口D public void printD(); //定义抽象方法 } interface E extends C,D{ // 定义接口E,同时继承接口C和D public void printE(); //定义抽象方法 } class F implements E{ @Override public void printC() { // TODO 自动生成的方法存根 System.out.println("C--Hello World"); } @Override public void printD() { // TODO 自动生成的方法存根 System.out.println("D--Hello World"); } @Override public void printE() { // TODO 自动生成的方法存根 System.out.println("E--Hello World"); } } public class extends_implements_demo2 { public static void main(String[] args) { // TODO 自动生成的方法存根 F f = new F(); f.printC(); f.printD(); f.printE(); } }
接口的实际应用
接口在实际中更多的作用是用来制订标准,例子USB设备
interface USB{ public void start(); public void stop(); } class computer { public static void plugin(USB usb){ usb.start(); System.out.println("=====USB 设备工作====="); usb.stop(); } } class FLASH implements USB{ @Override public void start() { // TODO 自动生成的方法存根 System.out.println("U盘开始工作"); } @Override public void stop() { // TODO 自动生成的方法存根 System.out.println("U盘停止工作"); } } class Print implements USB{ @Override public void start() { // TODO 自动生成的方法存根 System.out.println("打印机开始工作"); } @Override public void stop() { // TODO 自动生成的方法存根 System.out.println("打印机停止工作"); } } public class implements_usb_demo { public static void main(String[] args) { // TODO 自动生成的方法存根 computer.plugin(new FLASH()); computer.plugin(new Print()); } }
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/5241472.html