java学习(四)--抽象和接口

一 抽象类

为什么要用抽象类?

答案是,当要求对抽象类进行操作,但实现必须交给所有具体子类的时候。

比如我们定义一个交通工具Traffic 的抽象父类,在这个类中,声明了一个驾驶方法。虽然定义了这个类,但考虑到子类众多,每种交通工具的驾驶方法Drive() 都不一样,所以导致了父类无法在其本身定义这个方法的具体内容。而这个任务就落到了各个子类中。

同时,火车或者飞机继承了交通工具类后,也继承了父类的驾驶方法。并且,必须要对这个方法进行补充完整(重写)

也就是说,抽象父类只负责告诉子类,我有这个方法,你必须继承,而且必须填充适合你自己的内容。(父类只声明不实现)

或者可以这么理解。有一个共通方法需要定义,但是呢,还没想好怎么实现,或者压根不知道该怎么实现(你可能想拿这个方法干这个事,他可能想拿这个方法干那个事,搞得父类老大人很头疼!)。这时候就可以把它变成抽象方法,放在父类中。至于具体怎么实现,父类就不管了。谁继承父类,谁就负责实现,而且必须实现。

另外看视频的时候,有一个例子也很形象。

比如父类是图形类,子类分别有圆形、三角形、正方形。现在有个需求,要求求图形的面积。那这个问题就有点坑爹了。为啥?给的要求太抽象了,根本没有一个公式能够涵盖所有的图形啊。所以无奈之下,图形类里面只能声明一个求面积的方法。至于怎么实现,则分配到图形类、三角形类、正方形类里具体实现。

package abstractDemo;

/**
 * 这是一个抽象父类
 *
 * @author shuko
 *
 */
public abstract class Traffic {
	String name;

	// 声明一个抽象方法
	public abstract void drive();

	// 定义一个非抽象方法,非抽象方法需要定义方法体
	public void carry() {
		System.out.println("父类:交通工具运输货物");
	}

	// 对carry方法的重写
	public void carry(String name) {
		System.out.println(name + "可以运输货物"+"\n");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
package abstractDemo;
/**
 * 创建火车类,并且继承Traffic类
 * @author shuko
 *
 */
public class Train extends Traffic{

	// 对父类Traffic里的drive方法重写
	@Override
	public void drive() {
		System.out.println("乘火车从北京去上海");

	}

}
package abstractDemo;
/**
 * 创建飞机类,并且继承Traffic类
 * @author shuko
 *
 */
public class Plane extends Traffic{

	// 对父类Traffic里的drive方法重写
	@Override
	public void drive() {
		System.out.println("乘飞机从北京去上海");

	}

}
package abstractDemo;

public class TrafficTest {

	public static void main(String[] args) {
		// 创建飞机对象
		Traffic plane = new Plane();
		plane.drive();
		plane.setName("空中客車");
		plane.carry();
		plane.carry(plane.getName());

		// 创建火车对象
		Traffic train = new Train();
		train.drive();
		train.setName("绿皮车");
		train.carry(train.getName());

	}

}

执行结果如下

乘飞机从北京去上海
父类:交通工具运输货物
空中客車可以运输货物

乘火车从北京去上海
绿皮车可以运输货物

还没有理解?好吧,再简单一点,抽象的父类是发号施令的将军,而继承他的子类才是具体的上战场拼刺刀,负责具体打仗的人。

注意事项

1.抽象类不能被实例化  例如 Traffic traffic =new Traffic()  这就是错误的 eclipse中会自动报错

 这句话依然可以以图形举例。如果new一个图形,我们就会产生疑问,你要的这个图形有啥特征?我们现实世界里根本没  有一个具象概念。这时候你只能new一个三角形或者圆形或者其他具体的图形(前提是这些类不是抽象类),这样我们才会知道,原来是要我们创建一个这样的对象。

2.抽象类可以没有抽象方法。但如果类里面定义了抽象方法,则类必须是抽象类,eclipse会提示加Abstract关键字

3.抽象方法不能有主体,就是说在抽象类中,抽象方法不能实现。全部的实现的任务在子类中完成。

二 接口

接口是更加抽象的抽象类

为什么要用接口?

接口其实就是一种公共标准和规范。比如说USB接口。

当实现了接口类的时候,跟抽象类一样,在子类中同样需要实现所有的抽象方法。

注意事项

1.接口不能被实例化  (跟抽象类一样)

2.接口里的所有抽象方法都不能有主体(当接口内的方法为默认方法时,需要有方法体)

3.一个类可以实现多个接口 AAA implements BBB,CCC

4.接口类中可以有变量,但不能用private和protect修饰。 变量均为public static final类型的,但一般省略不写这些关键字

5.因为具有上述4的特征,所以可以将全局变量放在接口中。访问形式为 接口名.变量名

例如[public] [static] [final] NUM_MAX = 100;并且赋值后就不能改变

6.一个接口不能继承其他的类,但可以继承extends其他的类

再补充一下java8以后的新变化

       7.从java8开始,接口里允许定义默认方法,格式为 [public] default 返回值类型 方法名称(参数列表){ 方法体 }
          注意: 默认方法也可以被覆盖重写

       8.从java8开始,接口里允许定义静态方法,格式为 ]public] static 返回值类型 方法名称(参数列表){ 方法体 }
           注意: 应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法

      9.从java9开始,接口里允许定义私有方法,格式
          普通私有方法 :private 返回值类型 方法名称(参数列表){ 方法体 }
          静态私有方法: private static 返回值类型 方法名称(参数列表){ 方法体 }
          注意 :private的方法只有接口自己才能调用,不能被实现类或别人使用。

 

总结一下

其实接口和抽象类有太多一致的地方,所以如果不常用的话,隔一段时间就会忘记两者的区别。因为java编程经验不足,所以觉得暂时先掌握了抽象类就好。等以后接触得多了,再慢慢体会两者用法的不同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值