JAVA基础知识——抽象类和接口


必备知识

大家首先了解下方法重载、重写、重构的区别

1.方法重载
同名不同参。指的是在同一个类中,方法名相同,但是参数数量、参数类型或者返回类型不同的方法就叫做重载。比如:

	public Person() {
		System.out.println("这是我喜欢的人");
	}
	public Person(String name) {
		this();
		this.name = name;
	}
	public Person(String name,int age) {
		this(name);
		this.age= age;
	}

2.方法重写:

方法重写也叫覆盖,重写分两种:
(1)在子类继承父类的情况下,通过@Override注解,子类方法名、参数、返回值全部一样,方法体不一样的方法就是重写。
(2)接口实现,实现接口必须实现接口下的所有方法,因为实现方法上也有@Override注解,所以也算是重写的一种。

public class A{//定义类A
  public void s(){//定义方法s
  }
}
public class B extends A{//定义子类B,继承A
  public void s(){//重写父类A的方法s
  }
}

3.方法重构:
重构就是在原有的代码上,进行优化,使代码执行速度更快、或者更简单易读。
4.总结
重写:是对方法本身重新编写。
重载:同名不同参。
重构:重写算是重构的一部分,但重构还包括对程序结构的优化。


参考链接重载,重写,重构
提示:以下是本篇文章正文内容,下面案例可供参考

一、抽象类(单继承)

1.抽象类:事物的分类,词性是名词,为什么会有抽象类,因为某些行为无法具体化。比如:苹果----->水果。想要通过例子来更好地理解抽象类,可以看这一博主的文章——什么是抽象类
2.抽象方法
(1)需要用abstract关键字修饰方法,并且不能有方法的实现。
(2)在一个抽象类既可以有抽象方法,也可以有非抽象方法。
(3)抽象方法必须在抽象类里面,抽象类里面不一定有抽象方法。
(4)抽象类不能被实例化。(也就是说不能通过new来实例化)需要通过他的非抽象后代类来产生这个类型的对象。
3.举例代码:
在这里插入图片描述

public class E01 {

	public static void main(String[] args) {
		//多态:相同的操作,作用在不同地实例产生不同的结果
		Animal animal = new Dog();//不能去new一个抽象的类,实例化(具体的类Dog)
		animal.speak();
		animal = new Cat();//new了两次,两个对象,
		animal.speak();

	}

}
//1.定义抽象类,没办法实例化
abstract class Animal{
	//可以有抽象方法
	abstract public void speak();
	//也可以有非抽象方法
	public void breath() {
		System.out.println("动物们需要呼吸新鲜空气");
	}
}
//2.抽象类要被子类继承,抽象类是重构的结果。
class Dog extends Animal{

	@Override
	public void speak() {
		// TODO Auto-generated method stub
		System.out.println("小狗汪汪地叫");
	}
	
}
class Cat extends Animal{

	@Override
	public void speak() {
		// TODO Auto-generated method stub
		System.out.println("小猫喵喵地叫");
	}
	
}

二、接口(多实现)

1.接口:事物能力的体现,词性是动词或者形容词居多。它是更高级的抽象,抽象到里面不能有任何的实现。
比如:飞(接口),听(接口)
鸟可以有飞的能力,也可以有听的能力。
2.特点:(
(1)接口的关键字是interface,接口的实现用implements关键字。
(2)接口不能被实例化,我们通过接口的实现类来产生这个接口类型的对象。
3.举例
代码演示1:

public class E02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//3.接口不能实例化,通过接口的实现类来产生这个接口类型的对象
		IFly fly = new Bird();//向上转型,就可能面临着丢失子类或者实现类的特性
		//丢失了实现类听的特性
		fly.fly();
		
		fly = new Person();
		fly.fly();
		
		//若果想要得到听的特性,可以通过强制类型转换
		//强制类型转换演示
		IFly fly1 = new Person();
		fly1.fly();
		
		Person p = (Person)fly1;
		p.listen();

	}

}
//1.定义接口,接口名前面加个I代表是个接口
interface IFly{
	//声明一个飞的方法,不可以有大括号{ },有了就意味着实现
	//接口是更高级的抽象,抽象到里面不能任何的实现。
	public void fly();
}
interface IListen{
	public void listen();
}
//2.接口的实现,多实现
class Bird implements IFly,IListen{

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("鸟有翅膀可以飞");
	}

	@Override
	public void listen() {
		// TODO Auto-generated method stub
		System.out.println("鸟可以倾听");
	}
	
}
class Person implements IFly,IListen{

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("人有理想就可以飞");
	}

	@Override
	public void listen() {
		// TODO Auto-generated method stub
		System.out.println("人可以听");
	}
	
	
}

代码演示2:
在这里插入图片描述

public class E03 {

	public static void main(String[] args) {
		//通过接口的实现类来产生这个接口类型的对象
		IUsb usb = new PhonePrinter();
		usb.install();
		usb.work();
		
		usb = new PCPrinter();
		usb.install();
		usb.work();
		
		System.err.println("...............");
		/*
		强制类型转换演示
		IUsb usb1 = new PCPrinter();
		usb1.install();
		//usb1.work();
		
		PCPrinter p = (PCPrinter)usb1;
		//p.install();
		p.work();
*/
		//假如有一个数组,既可以放PhonePrint,也可以放PCPrint
		IUsb[] usbs = new IUsb[3];//给空间
		usbs[0] = new PCPrinter();
		usbs[1] = new PhonePrinter();
		usbs[2] = new PCPrinter();
		
		for (IUsb iUsb : usbs) {
			iUsb.install();
			iUsb.work();
		}
		}

}
//1.定义接口
interface IUsb{
	 public void install();
	 public void work();
}
//2.写实现类
class PhonePrinter implements IUsb{

	@Override
	public void install() {
		// TODO Auto-generated method stub
		System.out.println("安装手机驱动程序");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("从电脑拷贝数据到手机上");
	}
	
}
class PCPrinter implements IUsb{

	@Override
	public void install() {
		// TODO Auto-generated method stub
		System.out.println("安装打印机驱动程序");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("打印一份文件");
	}
	
}

三、抽象类与接口的区别

(1)抽象类要被子类继承,接口要被类实现。
(2)接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
(3)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
(4)接口是设计的结果,抽象类是重构的结果。
(5)抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
(6)抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
(7)抽象类主要用来抽象类别,接口主要用来抽象功能。

大家还想更好的了解抽象类与接口的区别可以参考这位博主的文章

四、思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全宇宙无敌最靓的仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值