【知晓的丧day拯救计划】java基础学习笔记18 接口

笔记来自2019求知讲堂零基础Java入门编程视频教程 https://www.bilibili.com/video/av76235341

(这一章是懵逼的笔记)

接口

有时候,一个类必须从几个类中继承属性和方法,比如想要表达会唱歌的厨子是个好老师,这个人既有教师的属性方法,也有厨师和歌唱家的方法,但java不支持多重继承,接口可以解决这个问题。

接口是比抽象类还抽象的抽象类。
抽象类中还提供了某些具体实现,而接口不提供任何实现,其中所有的方法都是抽象方法,可以更加规范的对子类进行约束,全面的实现了“规范和具体实现的分离”。

接口(interface)是抽象方法常量值定义的集合。本质上来讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,没有变量和方法的实现。

  • 接口的定义:interface
  • 接口的实现:implement,实现多个接口用逗号隔开
  • 接口中所有成员变量默认是由public static final修饰的
  • 接口中所有成员方法默认是由public abstract修饰的
  • 先继承父类,后实现接口
//抽象类Person,有两个属性和一个抽象方法
public abstract class Person1 {
	int age;
	String name;	
	public abstract void showInfo();
}

//接口Cooking,有一个抽象方法
public interface Cooking {
	//相当于 public abstract void fry();
	void fry();//炒菜
}

//接口Sing,有一个抽象方法
public interface Sing {
	//相当于 public abstract void singing();
	void singing();//唱法
}

//SCTeacher类,继承Person类,实现Cooking,Sing接口
//想要实例化这个类,就必须重写抽象类和两个接口中的三个抽象方法
public class SCTeacher extends Person1 implements Cooking,Sing{
	String course;//SCTeacher类自己的属性:科目
	
	//重写接口Sing的方法
	@Override
	public void singing() {
		// TODO Auto-generated method stub
		
	}

	//重写接口Cooking的方法
	@Override
	public void fry() {
		// TODO Auto-generated method stub
		
	}

	//重写抽象类Person的方法
	@Override
	public void showInfo() {
		System.out.println("会唱歌的厨子是个好老师");
		System.out.println(super.age);
		System.out.println(super.name);
		System.out.println(this.course);		
	}
}


还需要注意的是

  • 接口没有构造器。
  • 一个类可以实现多个接口。
  • 接口也可以继承其他接口(用extends),接口可以多继承,多个父类接口用逗号隔开。
  • 实现接口必须实现接口中的所有方法才能进行实例化,如果没有全部实现,就只能是一个抽象类。
  • 与继承类似,接口和实现类之间也存在多态性。
    接口可以接收实现了它的对象,但此时该对象只能访问这个接口中的方法。
public class Test2 {
	public static void main(String[] args) {
		//接口的多态,用Cooking类型的变量c接收SCTeacher类的对象
		Cooking c = new SCTeacher();
		//但此时只能使用Cooking接口中的方法
		c.fry();
	}
}
JDK8接口新特性

JDK8以后允许接口定义默认方法(扩展方法)和类方法(静态方法)。

  • 默认方法,是接口中的非抽象方法,用default修饰。和抽象方法必须被实现不同,默认方法不用,所有实现接口的类都可以继承到接口的默认方法。
  • 静态方法,可以直接在接口在定义静态方法,静态方法从属于接口,可以直接使用接口名.方法名调用。如果子类定义了同名的静态方法,他们是完全不同的方法,直接从属于子类,由子类名.方法名调用。
接口的应用
  • 接口可以解决java不支持的多重继承,一个类想要继承多个类的方法,可以继承其中一个类,其他的写成接口来实现。比如上面的例子。

  • 接口可以解决抽象类新增抽象方法存在的问题。
    首先,一个抽象类应该是稳定的,如果父类经常修改,就会影响到很多子类。例如当给抽象类新增一个抽象方法后,他的各级子类要想实例化,就必须重写这个抽象方法,而一个抽象类可能有多个子类甚至多层子类,这些子类有的可能已经产生对象在使用,且并不需要这个抽象方法,所以修改起来十分复杂。
    但是,如果的确必须修改父类,尽量不要在父类上修改,而是增加接口。将新增的抽象方法写成接口,让需要这个方法的子类实现这个接口就可以了。

抽象类是对一类事物的高度抽象,既有属性又有方法
接口是一系列方法的抽象,只有方法和常量

工厂模式

以下全是个人瞎理解,错了算我的

工厂模式(FactoryMethod)属于创建型模式,它提供了一种创建对象的最佳方式。

从名字来理解,就是使用工厂来生产“产品”(对象),而不是我们一般在使用的时候直接new。比如说我们需要一个产品,不是自己造,而是去商家买一样,我们不需要知道产品的创造过程和具体的细节,只需要知道怎么买就可以了。

通常情况下,类的建立和实例化不是由同一个程序员编写的,一个人修改了某个类名,导致其他人需要跟着修改实例化该类的代码,这对其他程序员来说是不必要的额外操作;或者类的细节不想向使用者暴露,这样的情况下,创建对象的人可能根本不知道类的名字,就没办法使用new的方法创建对象。

这时,就可以使用工厂模式创建对象——通过使用一个共同的接口来指向新创建的对象。

定义一个产生对象的接口,让其子类自己决定实例化哪一个工厂类,每个子类(工厂类)中实例化一种产品,利用接口的多态性,不需要知道每一个工厂类和实体类的名称,只需要知道产品个产品工厂的接口,和工厂类设计者向外提供的产生对象的方法,就可以获取对象。

  • 产品接口,以及实现接口的产品子类
//产品接口——宝马车
public interface BWM {
	//一个抽象方法——介绍产品信息
	void showInfo();
}

//实现接口的子类——宝马3系
class BWM3 implements BWM{
	//重写抽象方法
	@Override
	public void showInfo() {
		System.out.println("这是宝马3系车");		
	}	
}
//实现接口的子类——宝马5系
class BWM5 implements BWM{
	@Override
	public void showInfo() {
		System.out.println("这是宝马5系车");		
	}		
}
//实现接口的子类——宝马7系
class BWM7 implements BWM{
	@Override
	public void showInfo() {
		System.out.println("这是宝马7系车");		
	}	
}
  • 工厂类接口,以及实现接口的工厂类
//这是一个宝马车工厂类,类中有一个产生宝马车对象的抽象方法productBWN()
//因为不知道返回的是哪一个类型的宝马车,利用接口的多态,BWM3、BWM5、BWM7都实现了BWM接口,所以可以用BWM类型接收这三种类型的对象
public interface BWMFactory {
	BWM productBWN();

}

//实现BWMFactory接口的BWM3工厂类
class BWM3Factory implements BWMFactory{
	//重写抽象方法,返回一个BWM3类的对象
	@Override
	public BWM productBWN() {
		System.out.println("生产宝马3系车");
		return new BWM3();
	}	
}

//实现BWMFactory接口的BWM5工厂类
class BWM5Factory implements BWMFactory{
	//重写抽象方法,返回一个BWM5类的对象
	@Override
	public BWM productBWN() {
		System.out.println("生产宝马5系车");
		return new BWM5();
	}	
}

//实现BWMFactory接口的BWM7工厂类
class BWM7Factory implements BWMFactory{
	//重写抽象方法,返回一个BWM7类的对象
	@Override
	public BWM productBWN() {
		System.out.println("生产宝马7系车");
		return new BWM7();
	}	
}

  • 测试类
public class Test {
	public static void main(String[] args) {
		//想产生一个BWM3类的对象,因为不知道类名,同样利用接口多态,直接用BWM产品接口接收对象,
		BWM b3 = new BWM3Factory().preductBWN();
		b3.showInfo();
		BWM b5 = new BWM5Factory().preductBWN();
		b5.showInfo();
		BWM b7 = new BWM7Factory().preductBWN();
		b7.showInfo();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值