java抽象类和接口

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手机
发送文字短信:你好
给马云打电话
正在播放音乐《断桥残雪》
已经开启移动网络
咔嚓...拍照成功


版权声明:本文为m0_56557880原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。