---------------------- 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培训、期待与您交流! ----------------------