Java面向对象编程——接口
一、抽象类(Abstract Class)
在讲接口之前,我们得看看抽象类。如果一个类包含了没有实现的方法(抽象方法),那么这个类不能实例化,只能通过继承,在子类中实现其抽象方法,然后就可以实例化子类。有个问题,包含了抽象方法的类一定是抽象类,那么是不是抽象类就一定会含有抽象方法呢?未必。
下面我们还是通过案例来了解和掌握抽象类的用法。
1、创建Car抽象类
package net.wek11接口;
/**
* Car抽象类
* 作者:谯婷
* 日期:2019.5.7
*/
public abstract class Car {
protected String brand;
protected String manufactuer;
protected double price;
protected String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getManufactuer() {
return manufactuer;
}
public void setManufactuer(String manufactuer) {
this.manufactuer = manufactuer;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public abstract void start();
public abstract void stop();
}
在Car这个抽象类里,包含着两个抽象方法:start()和stop()。
2、创建测试类TestCar
package net.wek11接口;
/**
* 功能:测试抽象能否呗实例化
* 作者:谯婷
* 日期:2019.5.7
*/
public class TestCar {
public static void main(String[] args) {
//利用匿名子类来实例化
Car car = new Car() {
@Override
public void start() {
System.out.println(getBrand()+"启动了。");
}
@Override
public void stop() {
System.out.println(getBrand()+"停止了。");
}
};
car.setBrand("奥迪");
car.setManufactuer("德国大众汽车");
car.setPrice(500000);
car.setType("自动档");
car.start();
car.stop();
}
}
3、继承Car抽象类,创建子类BMWCar,实现两个抽象方法
package net.wek11接口;
/**
* 功能:继承Car类,创建AWMCar类
* 作者:谯婷
* 日期:2019.5.7
*/
public class AWMCar extends Car{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void start() {
if(getType().equals("自动档")){
System.out.println("宝马车["+name +"]以自动档的方式启动了!");
}else{
System.out.println("宝马车["+name +"]以自动档的方式启动了!");
}
}
@Override
public void stop() {
if(getType().equals("自动档")){
System.out.println("宝马车["+name +"]以自动档的方式停止了!");
}else{
System.out.println("宝马车["+name +"]以自动档的方式停止了!");
}
}
}
使用如下方法可直观的看出BMWCar是Car的子类:
Intellij IDEA 快捷键
Ctrl + Shift + 上下光标键:上下移动行
4、编写测试类TestBMWCar
package net.wek11接口;
/**
* 功能:测试
* 作者:谯婷
* 日期:2019.5.7
*/
public class TestAWMCar {
public static void main(String[] args) {
AWMCar awmCar = new AWMCar();
awmCar.setName("大神?");
awmCar.setBrand("宝马");
awmCar.setManufactuer("德国大众汽车公司");
awmCar.setPrice(52000);
awmCar.setType("手动档");
awmCar.start();
awmCar.stop();
}
}
运行结果如下:
Java只允许单根继承,
也就是说,一个类最多只能有一个父类。
在Java里,只有一个类Object是没有父类。
二、接口(nterface)
对于抽象类,我们把革命进行到底,如果一个类的全部方法都是抽象的,那么我们给它一个新的名称:接口。接口不能包含普通方法,只能包含抽象方法。接口其实是定义了一种标准或规范,既然如此,接口里不能包含一般的属性,只能包含常量。
问题:如何使用接口呢?我们通过案例来演示。
1、创建Shape接口
上述错误提示,表明接口里不允许有任何普通方法。
package net.wek11接口;
/**
* 功能:shape接口
* 作者:谯婷
* 日期:2019.5.9
*/
public interface shape {
double PI = 3.1415926;
double circumference();
double area();
}
2、创建一个Circle类,实现Shape接口
package net.wek11接口;
/**
* 功能:创建Circle类,实现Shape接口
* 作者:谯婷
* 日期:2019.5.9
*/
public class Circle implements shape {
private double r;
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
@Override
public double circumference() {
return 2 * PI * r;
}
@Override
public double area() {
return PI * r * r;
}
}
Circle类结构(属性与方法):
3、创建测试类TestCircle
package net.wek11接口;
import java.util.Scanner;
public class TestCircle {
public static void main(String[] args) {
//声明部分
double r,c,s;
Scanner sc = new Scanner(System.in);
Circle circle = new Circle();
//输入部分
System.out.println("r = ");
r = sc.nextDouble();
//处理部分
circle.setR(r);
c= circle.circumference();
s = circle.area();
//输出部分
System.out.println("c = " + String.format("%.2f",c));
System.out.println("s = " + String.format("%.2f",s));
}
}