1.java抽象类和抽象方法
面向对象中,所有的对象都是通过类来描述,但是并不是所有的类都是用来描述对象的,如果类中没有足够的信息来描述一个具体的对象,通常讲类定义为抽象类
关键字:abstract
public abstract class Pet{//抽象类
public abstract void print();//抽象方法
public abstract void show();
}抽象类不可以被实例化(即使有专门的构造方法),一般时给子类使用,抽象类作为父类
抽象类没有构造方法给本类使用,但是可以创建该类型的子类对象
Pet p = new Dog() ; //Dog是Pet子类
特殊情况:
Pet p = new Pet() {//匿名内部类
public void show(){
System.out.print("hello");
}
};
p.show();相当于Pet p = new Dog() ; //Dog是Pet子类
相当于内部不知名的某个类重新写了抽象方法,然后创建这个子类对象引用父类类型
抽象类注意:
1)抽象类内部一定有一个非抽象的构造方法给子类使用
2)抽象类内部可以有抽象方法和普通方法
3)抽象类的抽象方法必须让子类全部实现,否则子类也必须是抽象类
抽象方法注意:
抽象方法必须在抽象类内部,没有方法体,并且在子类中全部实现
抽象构造方法不存在,抽象静态方法也不存在
2.接口:
接口实际上可以理解为定义的是标准,另外意义上的一种继承
public interface Eat{
int a;//实际上由public static final修饰,静态常量
void eatFood();//实际上默认的都由public abstract修饰
}接口和抽象类一样都不可以被实例化
一个类对接接口,必须实现接口的所有方法,除非抽象类
java实现的是单继承,只能有一个直接父类,但是接口可以有多个,使用关键字:implements,在继承后面用关键字修饰接口对象,不同接口用,分开
public abstract class A extends Father implements B,C,D{
}3.抽象类和接口:
相同点:
代表系统的抽象层
都不能被实例化
都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)
不同:
抽象类中可以包含普通方法,使部分方法默认提供实现,但是接口中只能用抽象方法
抽象类用于代码的复用,接口便于代码的维护
抽象类只能继承一个,接口可以接多个
4.使用:
需求说明:
原始的手机,可以发短信,通电话。
随着发展,手机增加了功能:音频、视频播放、拍照、上网。使用接口实现手机功能

(虚线代表接口,实线代表继承)
代码实现:
//先定义基础手机类:
package mobile;
public class Handset {
String name;
String type;
public Handset() {
}
public Handset(String name, String type) {
this.name = name;
this.type = type;
Show();
}
void Show() {
System.out.println("这是一款型号为:" + type + "的" + name + "手机");
}
void TextMe(String txt) {
System.out.println("发送文字短信:" + txt);
}
void MakeCall(String name) {
System.out.println("给" + name + "打电话");
}
}
//定义接口:
//连接网络
package mobile;
public interface Network {
void NetworkConn();
}
//拍照
package mobile;
public interface TakePhoto {
void TakePicture();
}
//播放
package mobile;
public interface PlayWiring {
void Play(String name);
}
//普通手机继承基础手机和播放接口
package mobile;
public class CommonHandset extends Handset implements PlayWiring {
public CommonHandset(String name, String type) {
this.name = name;
this.type = type;
Show();
}
@Override
public void Play(String name) {
System.out.println("正在播放" + name);
}
}
//智能手机
package mobile;
public class AptitudeHandset extends Handset implements PlayWiring, TakePhoto, Network {
public AptitudeHandset(String name, String type) {
this.name = name;
this.type = type;
Show();
}
@Override
public void NetworkConn() {
System.out.println("已经开启移动网络");
}
@Override
public void TakePicture() {
System.out.println("咔嚓...拍照成功");
}
@Override
public void Play(String name) {
System.out.println("正在播放" + name);
}
}
测试:
package mobile;
public class Test {
public static void main(String[] args) {
CommonHandset ch = new CommonHandset("k20pro", "小米");
ch.TextMe("你好");
ch.MakeCall("马化腾");
ch.Play("音乐《青花瓷》");
System.out.println();
AptitudeHandset ah = new AptitudeHandset("12", "apple");
ah.TextMe("你好");
ah.MakeCall("马云");
ah.Play("音乐《断桥残雪》");
ah.NetworkConn();
ah.TakePicture();
}
}
运行结果:
这是一款型号为:小米的k20pro手机
发送文字短信:你好
给马化腾打电话
正在播放音乐《青花瓷》
这是一款型号为:apple的12手机
发送文字短信:你好
给马云打电话
正在播放音乐《断桥残雪》
已经开启移动网络
咔嚓...拍照成功