黑马程序员--Java学习13--抽象与接口

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一、抽象类和抽象方法

      所谓抽象方法就是指看不懂的方法,用abstract关键字修饰,用abstract修饰的类叫做抽象类,抽象方法必须放在抽象类中。

抽象类的特点:

1、抽象方法一定定义在抽象类中

2、抽象方法和抽象类都必须被关键字abstract修饰

3、抽象类不可以被new创建对象,因为调用抽象方法没有意义

4、抽象类中的方法要被调用,必须由父类重写其所有的抽象方法,建立子类对象调用,如果子类只重写一部分抽象方法,那么该子类还是一个抽象类

<span style="font-size:14px;">/**
BaseStudent和AdvStudent含有共同的方法study,可以将其抽象出来
*/
abstract class Student
{
	abstract void study();
}
class BaseStudent extends Student
{
	void study()
	{
		System.out.println("study")
	}
}
class AdvStudent extends Student
{
	void study()
	{
		System.out.println("adv study");
	}
}
class  AbstractDemo
{
	public static void main(String[] args) 
	{
		BaseStudent bas = new BaseStudent();
		bas.study();
		AdvStudent adv = new adv AdvStudent();
		adv.study();
	}
}</span>

     抽象类和一般类没有太大的不同,该如何描述事物就如何描述事物,只不过该事物出现了一些看不懂的东西,这些不确定的部分也是该事物的功能,需要明确出现,但是还无法定义主体,通过抽象方法来表示。抽象类比一般类多了个抽象方法。抽象类不能实例化。

<span style="font-size:14px;">/*
假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性;
姓名、工号、以及工资。经理也是员工,除了含有员工的属性外,另还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行
属性访问。

解题思路:
1、不论是员工还是经理都有name id pay,经理多个bonus
2、不一样的人有不一样工作,可以将工作抽象出来
3、经理和工程师都继承员工类,并且重写工作方式
*/

abstract class  Empoyee
{
	private String name;
	private String id;
	private double pay;
	Employee(String name,String id,double pay)
	{
		this.name = name;
		this.id = id;
		this.pay = pay;
	}
	public abstract void work();
}

class Manager extends Employee
{
	private int bonus;
	Manager(String name,String id,double pay,int bonus)
	{
		super(name,id,pay);
		this.bonus = bonus;
	}
	public  void work()
	{
		System.out.println("manager work");
	}
}

class Pro extends Employee
{
	Pro(String name,String id,double pay)
	{
		super(name,id,pay);
	}
	public void work()
	{
		System.out.println("Pro work");
	}

}

class Company
{
	public static void main(String[] args)
	{
		
	}
}</span>


二、接口

     当抽象类中的方法都是抽象的,那么该类可以通过接口的形式表示。

     接口定义时格式特点:

1、接口中常见定义:常量,抽象方法

2、接口中的成员都有固定修饰符

常量: public static final

方法:public abstract

记住:接口中的变量都是public的

 1)接口声明
    前面曾使用class关键字来声明类,接口通过使用关键字interface来声明。格式:
    interface  接口的名字
 2)接口体
    接口体中包含常量定义和方法定义两部分。接口体中只进行方法的声明,不许提供方法的实现,所以,方法的定义没有方法体,且用分号";"结尾。

<span style="font-size:14px;">interface Inter//接口是固定的  抽象类是可以设定的
{
	public static final int NUM = 2;
	public abstract void show();
	//public abstract void speak();
}

class Test implements Inter
{
	public void show(){}//必须加public必须全部覆盖接口中的方法
}
class InterfaceDemo
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println(t.NUM);//合法
		System.out.println(Test.NUM);//合法
		System.out.println(Inter.NUM);//合法
		//t.NUM = 3;//非法
	}
}</span>


3)接口的使用
          一个类通过使用关键字implements声明自己使用一个或多个接口。如果使用多个接口,用逗号隔开接口名。如:
          类A使用接口Printable和接口Addable    
          class A implements Printable,Addable
          类Dog使用接口Eatable和接口Sleepable
          class Dog extends Animal implements Eatable,Sleepable  
          如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。需要注意的是:在类中实现接口的方法时,方法的名字、返同类型、参数个数及 类型必须与接口中的完全一致。特别要注意的是:接口中的方法默认是public abstract方法,所以类在实现接口方法时必须给出方法体,并且一定要用public来修饰,而且接口中的常量默认是public static常量。
          由于接口体中只有常量定义和public的abstract方法定义,程序在编写接口时,允许省略常量前面的public. final和static修饰,也允许省略方法前面的public和abstract修饰。另外,如果接口方法的返回类型不足void型,那么在类中实现该接口方法时,方法体至少要有一个retum语句;如果是void型,类体除了两个大括号外,也可以没有任何语句。
          Java提供的接口都在相应的包中,通过引入包可以使用Java提供的接口。也可以自己定义接口,一个Java源文件就是由类和接口组成的。只进行方法的声明,不许提供方法的实现,所以,方法的定义没有方法体,且用分号";"结尾。

 4)理解接口
        接口的语法规则很容易记住,但真正理解接口更重要。在上例如果去掉接口,该程序的运行没有任何问题。那为什么要用接口呢?
        假如轿车、货车、拖拉机、摩托车、客车都是机动车的子类,其中机动车是一个抽象类。如果机动车中有两个抽象方法:“收取费用”、“调节温度”,那么所有的子类都要实现这两个方法,即给出方法体,产生各自的收费或控制温度的行为。这显然不符合人们的思维方法,因为拖拉机可能不需要有“收取费用”或“调节温度”的功能,而其他的一些类,比 如飞机、轮船等需要有“收取费用”或“调节温度”的功能。接口可以增加很多类都需要实现的功能,不同的类可以使用相同的接口,同一个类也可以实现多个接口。接口只关心功能,并不关心功能的具体实现,比如“客车类”实现一个接口,该接口中有一个“收取费用”的方法,那么这个“客车类”必须具体给出怎样收取费用的操作,即给出方法的方法体,不同车的类都可以实现“收取费用”,但“收取费用”的手段可能不相同。接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系,就像各式各样的商品,它们珂能隶属不同的公司,工商部门要求都必须具有显示商标的功能(实现同一接口),但商标的具体制作由各个公司自己去实现。
         再比如,你是一个项目主管,你需要管理许多部门,这些部门要开发一些软件所需要的类,你可能要求某个类实现一个接口,也就是说你对一些类是否具有这个功能非常关心,但不关心功能的具体体现。比如,这个功能是speakLove,但你不关心是用汉语实现功能speakLove还是用英语实speakLoveo在某些时候,你也许打一个电话就可以了,告诉远方的一个开发部门实现你所规定的接口,并建议他们用汉语来实现speakLoveo如果没有这个接口,你可能要花很多的口舌来让开发部门找到那个表达爱的方法,也许他们给表达爱的那个方法起的名字是完全不同的名字。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值