【Java学习笔记】接口和抽象类

-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java学习笔记之接口和抽象类

一、简介
       本文主要通过简单的实例来讲解接口和抽象类的特点,于此同时,还会分析接口和抽象类的区别。本篇的内容主要有:
       1、 抽象类的声明与使用
       2、 接口的声明与使用
       3、抽象类与接口的区别

二、抽象类的声明与使用
       使用abstract修饰符来表示抽象方法和抽象类。只有方法定义而不具体实现的方法称为抽象方法,抽象方法没有方法。包含一个或多个抽象方法的类必须被声明为抽象类。下面列举一个例子:
public class ExampleDemo {

	public static void main(String[] args) {
		//Car c = new Car();//定义报错
		Car car = new Bus();//创建一辆公交
		car.run();//公交启动
		car.setDirction("左");//设置方向
		car.Turned();//转向
	}
	
}


abstract class Car{//抽象类
	private String Dirction;
	
	public String getDirction() {
		return Dirction;
	}

	public void setDirction(String dirction) {
		Dirction = dirction;
	}

	public abstract void Turned();//抽象方法,无实体
	
	public void run(){//已经实现的方法
		System.out.println("乘客请注意,车要启动了!");
	};
	
}

//实例化的子类
class Bus extends Car{

	@Override
	public void Turned() {
		System.out.print("前方"+this.getDirction()+"转向,请您扶好坐稳!");
	}
	
}
运行程序后:
       乘客请注意,车要启动了!
       前方左转向,请您扶好坐稳

*关于抽象类,需要说明:
       抽象类不能直接使用,必须先实例化抽象类的子类,实例化的子类才可以使用。比如程序中的代码段Car c = new Car();会报错。可以理解为,要new一辆车,必须要和工厂说明是“什么车”(实例化子类),这样工厂才能生产出来。
       如果一个类继承自抽象类,则必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则子类必须定义为抽象类。例子中Bus作为Car的子类,实现了父类Car中抽象方法Turned。

三、接口的声明与使用
        接口(Interface)是抽象方法的集合,泛指供调用的方法或者函数。使用Interface关键字声明接口。接口都隐式的声明为公用(Public),接口中的所有方法都是抽象方法,接口是隐式抽象的,所以声明接口的时候,可以省略abstract关键字。下面举一个例子:

//做饭接口
interface Cook {
	void Cake();//蛋糕
	void IceCream();//冰激凌
}
//机器人类,实现做饭接口
class Robot implements Cook{
	
	Robot(){}
	
	@Override
	public void Cake() {//做蛋糕
		System.out.println("稍等:蛋糕马上就好!");
	}

	@Override
	public void IceCream() {//做冰激凌
		System.out.println("稍等:冰激凌马上就好!");
	}
}
public static void main(String[] args) {
		
		Robot r = new Robot();
		r.Cake();
		r.IceCream();
	}
	

运行结果:
        稍等:蛋糕马上就好!
        稍等:冰激凌马上就好!


四、抽象类与接口的区别
       相同点:
       1、 抽象类和接口都不能被直接实例化
       2、都包含抽象方法

       不同点:
       1、抽象类可以包含具体实现的方法和抽象方法,而接口中所有的方法必须是抽象的且隐式声明为Public
       2、抽象类也是类,所以只能单继承,即只能有一个父类。但是接口可以继承多个接口。一个类也可以多个接口。
       3、抽象类中可以声明各种成员变量,但是接口中的所有成员都是静态常量(public static final)
      
五、小结
       抽象类的设计,是从整体宏观上对事物进行归纳,而接口则更侧重于类的局部功能。简单的例子,鸟类可以作为抽象类来设计,而接口则更适合用来补充类似于鸟类的各种行为,比如觅食,飞行,睡觉等等。
       抽象类也是类,因此它遵从类的原则,类侧重于描述“是什么”。有相同的特点,才会被归为“类”。而接口则强调“有什么”。举个例子,恐龙都会跑,但有的会飞,那么作为基本的恐龙“类”,肯定都会跑、会觅食,但是“飞行”这个技能,就不适合放在类内部,因为对于有些恐龙来讲,它是不会飞的。所以,飞更适合做接口。看下面的例子:

//恐龙类
abstract class Dinosaur{
	public abstract void eat();
	public abstract void run();
}

//飞行接口
interface Fly{
	public void fly();
}

//霸王龙继承自恐龙类
class TyrannosaurusRex extends Dinosaur{

	@Override
	public void eat() {
		System.out.println("霸王龙吃肉!");
	}

	@Override
	public void run() {
		System.out.println("霸王龙会跑!");
	}
	
}

//翼龙继承自恐龙类,进化出了飞行功能
class Pterosaur extends Dinosaur implements Fly{

	@Override
	public void fly() {
		System.out.println("翼龙会飞");
	}

	@Override
	public void eat() {
		System.out.println("翼龙吃草!");
	}

	@Override
	public void run() {
		System.out.println("翼龙也会跑!");
	}
	
}
public static void main(String[] args) {
		TyrannosaurusRex TR = new TyrannosaurusRex();
		TR.eat();
		TR.run();
		
		Pterosaur pt = new Pterosaur();
		pt.eat();
		pt.run();
		pt.fly();
	}
运行结果:
       霸王龙吃肉!
       霸王龙会跑!
       翼龙吃草!
       翼龙也会跑!
       翼龙会飞


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值