声明: 此笔记本人通过观看【尚学堂】+(赖小平主编)清华大学出版社的《Java程序设计》感悟整理得出, 若有任何相关问题,请注明来源联系作者!
7.1 抽象类与抽象方法
类的设计即为一个抽象的过程。在设计类的时候会出现这样的一种情况,希望某个类具有某些功能,但目前无法进行具体的实现。这是java提供了抽象类和抽象方法解决问题。
使用abstract定义抽象类,语法格式:
[访问修饰符] abstract class 类名{
类成员
}
使用abstract定义抽象方法,语法格式:
[访问修饰符] abstract 返回类型 方法名(参数列表);
抽象方法是指只有方法的声明,没有方法体的方法。抽象方法用来描述系统具有什么功能,但不提供功能的实现!
【实例 测试抽象类与抽象方法】
package study01;
/**
* 定义抽象类
* @懒惰的小黑
*
*/
abstract class Animal{
private String name;
private int age;
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public abstract void shout();
public abstract void eat();
public String toString() {
return "名字:" + name +" 年龄:" + age +"岁";
}
}
class Dog extends Animal{
public Dog(String name,int age) {
super(name,age);
}
public void shout() {
System.out.println("汪汪叫....");
}
public void eat() {
System.out.println("吃狗粮...");
}
}
public class AbstractTest01 {
public static void main(String[] args) {
Animal dog = new Dog("旺财",5);
System.out.println(dog.toString());
dog.shout();
dog.eat();
}
}
【执行结果】
说明:
- 1、有抽象方法的必须为抽象类(抽象类可以无抽象方法)
- 2、抽象类可以有具体属性和方法
- 3、构造方法不能声明为抽象方法
- 4、一个具体类继承抽象类必须继承抽象类的所有抽象方法(抽象类、具体类也可以有属于自己的方法)
- 5、不能用new关键字实例化抽象类的对象,但可以声明抽象类的引用指向子类的对象,实现多态性(父类对象变量引用子类对象,调用的方法是子类重写后的方法或父类没有被重写的方法。用多态性创建对象的好处是:竟可以调用父类私有的方法,也可以调用子类重写后的方法,但不能够调用子类自身定义(没有被重写)的方法。(具体可回看对象的多态性文章)
)
注意:
Final与abstract水火不容!!
final类不能被继承、final定义的方法不能被子类重写、final既可以存在final类中也可以不存在final类中。
7.2 接口
接口就是比抽象类还抽象的抽象类,接口就是标准、规范。例如设计电脑的usb接口,就是设计了一套规范,其中usb接口有4条通道,哪些用来传输数据,哪些用来供电,提供的电压多少,等等。所有的规范只规定了必须实现哪些功能,并没有规定如何实现。具体实现交给使用接口的产品(如u盘)来实现。
接口是作为一个标准存在的,一旦公布,就不应该被改变。
【图解 程序设计中的接口】
7.2.1 接口的定义与实现
Java接口只声明一套功能,没有具体的实现。
接口的声明:
语法格式:
[访问修饰符] interface 接口名{
[常量字段] [抽象方法]
}
说明:
- 1、访问修饰符:只能是public或默认
- 2、接口只能包含最终字段(final常量)和抽象方法两种成员。
- 3、常量:接口的属性只能是常量,public static final修饰,省略也是。
- 4、抽象方法:允许省略 public 和abstract,也只能是public abstract。
- 5、接口可实现多继承。
- 6、接口不能创建实例,但可用于声明引用变量类型。
- 7、一个类实现了接口,必须实现接口中的所有的抽象方法,并且这些方法只能是public。
- 8、通过类去实现接口
- 9、JDK1.7之前,接口只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。JDK8增加了默认方法和静态方法。JDK9还增加了私有方法。
接口的实现:
语法格式:
[访问修饰符] class 类名 implements 接口1[,接口2,接口3…]{
}
【实例 测试接口声明和实现】
【接口】
package study01;
/**
* 定义一个usb接口
* @author 卟淡
*
*/
public interface interfaceUsb {
double VOLTAGE = 10;
void transmit_Date();
void phone_Date();
}
【实现类】
package study01;
/**
* 实现接口的类
* @author 卟淡
*
*/
class Iphone implements interfaceUsb{
//必须实现接口的所有抽象方法
public void transmit_Date() {
System.out.println("请传输传输照片、视频....");
}
public void phone_Date() {
System.out.println("欢迎使用苹果手机!");
}
public void vlotoString() {
System.out.println("电压:" + VOLTAGE + "v");
}
}
public class iponeTest {
public static void main(String[] args) {
/*
* 接口也可用于声明引用变量类型
* interfaceUsb iphone = new Iphone();
*/
Iphone iphone = new Iphone();
iphone.phone_Date();
iphone.vlotoString();
iphone.transmit_Date();
}
}
【执行结果】
【实例 测试一个类实现多个接口与接口的多态】
package study01;
/**
* 测试一个类实现多个接口与接口的多态
* @author 卟淡
*
*/
interface Girl{
int GIRL_AGE = 18;
void study();
}
interface Boy{
int BOY_AGE = 30;
void work();
}
class YoungMan implements Girl,Boy{ //一个类可实现多个接口
public void study() {
System.out.println("实现了Girl的功能方法");
}
public void work() {
System.out.println("实现了Boy的功能方法");
}
}
public class OldManTest {
public static void main(String[] args) {
//接口也可用于声明引用变量类型
/*
*只能调用Girl的功能方法,不能调用Boy的方法,
*因为编译器认为 a就是Girl(实现多态性)
*/
Girl a = new YoungMan(); //接口变量引用实现类YoungMan的对象
a.study();
//a.work(); 编译出错,因为接口变量引用的是YoungMan的对象
YoungMan b = new YoungMan();
b.study();
b.work();
}
}
注:
接口的多态性与类的多态性类似,即接口变量引用的是实现了该接口的子类对象。
接口可以用来声明变量,但接口不是类,不能创建对象!
一个类只能有一个直接的基类,但是可以实现多个接口(解决多继承问题)。
注意:
JDK8增加了默认方法和静态方法。JDK9还增加了私有方法,用法在后面会继续学习!
一个类可以实现接口,同时继承抽象类,语法格式:
[访问修饰符] class 子类名 extends 抽象类名 implements 接口1[,接口2,接口3….]{ … }
7.2.2 接口的继承
在JAVA中,类只支持单继承,即一个类只能继承一个父类,但一个接口可以同时继承多个接口,再通过类去实现它,解决了多继承问题。
【实例 测试多继承】
package study01;
/**
* 接口的多继承
* @author 卟淡
*
*/
interface A{
void printlnA();
}
interface B{
void printlnB();
}
interface C{
void printlnC();
}
interface D extends A,B,C{ //一个接口可继承多个接口
void printlnD();
}
class F implements D{ //F类实现接口D时,必须实现D、A、B、C中的所有方法
public void printlnA() {
System.out.println("实现了A方法");
}
public void printlnB() {
System.out.println("实现了B方法");
}
public void printlnC() {
System.out.println("实现了C方法");
}
public void printlnD() {
System.out.println("实现了D方法");
}
}
public class InterfaceTest {
public static void main(String[] args) {
F test = new F();
test.printlnA();
test.printlnB();
test.printlnC();
test.printlnD();
}
}
总结:
- 掌握使用抽象类、使用系统接口的技术(本篇文章还未涉及到,后面会再加强学习)和自定义接口的方法。
- 在创建对象时,抽象类对象可以引用子类对象,接口也可以引用实现类对象。
- 了解应该在什么情况下需要使用抽象类,什么情况下需要使用接口。
特别提醒:
在以后的工作中,面试官会常问到:java中有没有多继承?这时你无论回答有或没有,都是不及格的!!你应该回答:在java的类中是没有多继承,但在接口中是可以有多继承。这是正确严谨的答法。