Java(12)接口和抽象类

一、抽象类

简单来说:在class前面加上abstract就是一个抽象类。

1.抽象类的特点

1)抽象方法所在的类必须是抽象类
2)抽象类不能实例化,因为抽象类本身就是一个抽象的
3)如果想实现抽象类,创建一个子类去继承它
4)子类继承一个抽象类,子类必须重写抽象里面所有的抽象方法(子类也是抽象类除外)
5)抽象类里面可以定义普通方法
6)抽象类里面有构造方法

2.抽象方法特点:

1)只有方法定义没有方法体


*举例:
动物类(Animal)-抽象方法(eat)-普通方法(sleep)-构造方法(Animal)

//动物类
public abstract class Animal {
	
	//吃饭:动物吃饭,就是一个抽象,因为我不知道具体是什么动物
	public abstract void eat();  //抽象方法所在类必须为抽象类,但是抽象类里可以有普通方法。
	
	public void sleep(){	
		
	}
	
	public Animal(){	
		
	}
	
}

写两个子类吧- 猫(Cat),狗(Dog)
继承父类用extends,由抽象类特点第3)条,通过子类继承来实现抽象类eat()

public class Cat  extends Animal{

	@Override
	public void eat() {
		System.out.println("猫爱吃鱼");	
	}

}

狗啃骨头。自己尝试写:

@override怎么调出来?
答:重写父类方法,点鼠标右键的Source,或者菜单栏上的Source菜单,有Override/implement methods。。 从那里选出来的就自动生成这个。出来后方法内容为空,自己添加即可。

public class Dog extends Animal {

	@Override
	public void eat() {
		System.out.println("狗爱吃骨头");	
	}
}

Test一下:

public class TestAnimal {

	public static void main(String[] args) {
		
		//Animal a=new Animal();  抽象类不能实例化(即new Animal 违法。)
		
		Dog d=new Dog();
		d.eat();
		//多态
		Animal cat=new Cat();
		cat.eat();
	}
}

结果:
在这里插入图片描述
这就是抽象类的使用。


*小总结:

抽象类VS一般类
  • 1.相同点:
    抽象类和一般类都是用来描述事物的,都在内部定了成员。
  • 2.不同:
    1)一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。
    2)一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
    3)一般类可以被实例化。抽象类不可以被实例化。
  • 3.*注意:
    不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

二、接口

:就是多个类之间的公共规范,接口里面的方法都是抽象方法,是一个特殊的抽象类

1.定义

public interface 接口名{ 常量; }

接口A:

public interface A {
}

这就是一个接口。

其他特点

2.接口里面的成员变量都是常量,默认都会加上"public static final"修饰
3.接口里面的方法默认会被public abstract修饰,也就是我定义的方法不加public abstract,默认也会加上
4.接口不能实例化,抽象类是继承,接口是用来实现的
5.一个类实现了接口,要实现这个接口里面所有的抽象方法
6.一个类可以实现多个接口
7.接口可以继承接口,并可以继承多个接口
8.接口没有构造方法

*小例子(对上面的特点逐一验证介绍)

  • 交通工具接口,验证1)2)3)8)
public interface Traffic {
	
	//int a=10;//这是一个常量
	//
	public static final int A=10;
	
	public abstract void start();//是一个抽象方法
	
	public void add();//是抽象方法
	
	void run();//是
	
	abstract void stop();//是
	
//	public void method(){	
//	} //无构造方法
}
  • 实例化验证4):
    (看注释部分)
public class TestTraffic {

	public static void main(String[] args) {
		//Traffic t=new Traffic();  这里是不行的。会报错,说明无法实例化
		}
  • 验证要实现所有的抽象方法5)(接口里面没有普通方法)
    建一个汽车类吧,实现交通工具接口
//汽车
public class Car implements Traffic{

	@Override
	public void start() {
		System.out.println("小汽车启动了。。。。。。。");
		
	}

	@Override
	public void add() {
		System.out.println("小汽车加速了。。。。。。。");
		
	}

	@Override
	public void run() {
		System.out.println("小汽车开始跑了。。。。。。。");
		
	}

	@Override
	public void stop() {
		System.out.println("小汽车停止了。。。。。。。");
		
	}

}

在这里插入图片描述
全部抽象方法。

  • 验证6)一个类可以实现多个接口
    同样用汽车类,汽车还可以加油吧。所以建一个加油接口,汽车类调用加油接口来实现加油。
//针对于加油交通工具的接口
public interface Oil {	
	void addOil();
}

然后是汽车(同时实现交通工具和加油接口)

//小汽车
public class Car implements Traffic,Oil {

	@Override
	public void start() {
		System.out.println("小汽车启动了。。。。。");
	}

	@Override
	public void add() {
		System.out.println("小汽车加速了。。。。。。");
		
	}

	@Override
	public void run() {
		System.out.println("小汽车开始跑了。。。。。");
	}

	@Override
	public void stop() {
		System.out.println("小汽车停止了。。。");
		
	}

	@Override
	public void addOil() {
		System.out.println("汽车加油");
		
	}

}
  • 验证7)接口可继承接口,且可继承多个接口。可自行验证。
    前边有个A接口,还有一个Traffic接口。找一个B接口来继承一下这两个接口,看是否报错。不报错则可用。
public interface B extends A,Traffic {

}

就这么简单。


*小总结:

  • 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
  • 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
  • 接口主要用来定义规范。解除耦合关系。

三、抽象类VS接 口

1.相同点

1)都不能被实例化。只能被其他类实现和继承。
2)都可以包含抽象方法,实现的类都必须实现这些抽象方法,否则实现的类就是抽象类。

2.不同点

①定义不同:抽象类abstract class ;接口 interface
②抽象类可以包含普通的方法;接口不能包含普通方法,只能包含抽象方法;
③抽象类里既可以定义普通属性,也可以定义静态常量;接口里只能定义静态常量属性,不能定义普通属性;
③抽象类可以包含构造方法;接口不包含构造方法。(抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。)
④抽象类可以包含初始化块;接口不包含初始化块
⑤抽象类是继承;接口类是实现。
⑥抽象类是单继承,接口类可以多继承。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LIUBLOGS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值