Java基础9--继承--抽象类--接口(二)

2014-11-24 07:48:18 · 作者: · 浏览: 1
可以被继承。

(3)final修饰的方法不可以被覆盖。

(4)final修饰的变量是一个常量,只能赋值一次。

3,为什么用final修饰变量?

在程序中,如果一个数据是固定不变的,那么直接使用这个数据就可以了,但是这样阅读性很差,所以应该给这个数据起一个名称,而且这个变量名称的值不能变化,所以加上final固定。若该数据是要被共享的,可以在加上static修饰符,可以直接被类名调用,若该常量在全局有效,可以加上public修饰,使全县最大化。

4,写法规范:

常量的所有字母都大写,多个单词之间用下划线连接。

9-5,抽象类-概述

1,例:

abstract class Person {//抽象类
	abstarct void show();//抽象方法
}

2,当遇到不具体的事物时就定义成抽象的,如犬科都有吼叫功能,狗和狼的叫声是不同的,但都具备吼叫功能,所以犬科的吼叫方法定义为抽象的,由于有不确定的方法,所以该类也是不确定的,该类也定义为抽象的。

3,示例:

abstarct class 犬科{
	abstract void 吼叫();
}
class 狗 extends 犬科 {
	void 吼叫() {
		System.out.println("汪汪");
	}
}
class 狼 extends 犬科 {
	void 吼叫() {
		System.out.println("嗷嗷");
	}
}

因为犬科中有一些是具体的方法,如睡觉功能,狗和狼的睡觉功能是一样的,所以向上提取出犬科类,而不在狗和狼类中直接写吼叫的方法。

9-6,抽象类-特点

特点:

(1)方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类必须也被abstract修饰。

(2)抽象类不可以被实例化,为什么?因为调用抽象方法没有意义。

(3)抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以被实例化,否则这个子类还是抽象类。

9-7,抽象类-细节

1,抽象类中有构造函数么?

有,用于给子类对象初始化。

2,抽象类可以不定义抽象方法么?

可以,但是很少见,目的就是不让这个类创建对象。AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是没有内容。

3,抽象关键字不可以和哪些关键字共存?

(1)private不行,因为抽象方法必须被子类覆盖并实现才能创建对象,若用private修饰,则子类不能覆盖这个抽象方法。

(2)static不行,用static修饰的方法可以不用对象调用,直接用类名调用,但是调用抽象方法是没有意义的,所以不兼容。

(3)final不行,抽象方法必须被覆盖,而加上final就不能被覆盖了,冲突。抽象类可以有子类,用final修饰则不能有子类,冲突。

4,抽象类和一般类的区别

相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。

不同:

(1)一般类有足够的信息描述事物。

抽象类描述事物的信息有可能不足。

(2)一般类中不能定义抽象方法,只能定义非抽象方法。

抽象类中可以定义抽象方法,同时也可以定义非抽象方法。

(3)一般类可以被实例化。

抽象类不可以被实例化。

5,抽象类一定是一个父类么?

是的。因为需要子类覆盖其方法后才可以对子类实例化。

9-8,抽象类的一个小练习

需求:雇员示例:

公司中程序员有姓名,工号,薪水,工作内容。

项目经理除了有姓名,工号,薪水,还有奖金,工作内容。

对给出数据进行数据建模。

分析:

在这个领域中,先通过名词提炼找出涉及的对象。

程序员:

属性:姓名、工号、薪水

行为:工作

经理:

属性:姓名、工号、薪水、奖金

行为:工作

程序员和经理不存在直接继承的关系,但是程序员和经理有着共性的内容,可以进行抽取。因为他们都是公司的雇员。

可以将程序员和经理进行抽取,建立体系。

//描述雇员
abstract class Employee{
	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 Programmer extends Employee {
	Programmer(String name,String id,double pay) {
		super(name,id,pay);
	}
	public void work() {
		System.out.println("code...");
	}
}
//描述经理
class Manager extends Employee {
	private int bonus;
	Manager(String name,String id,double pay,int bouns) {
		super(name,id,pay);
		this.bonus = bonus;
	}
	public void work() {
		System.out.println("manage");
	}
}
class AbstractTest {
	public static void main(String[] args) {
		Programmer p = new Programmer("Peter","01001",6000.0);
		p.work();
		Manager m = new Manager("Tom","09001",12000.0,3000);
		m.work();
	}
}

9-9,接口interface-定义

1,当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface。

定义接口使用的关键字不是class而是interface,但接口仍是一个类,编译完成后生成与接口同名的.class文件,如:interface Demo,则声称Demo.class。

2,接口当中常见的成员,这些成员都有固定的修饰符。

(1)全局常量:public static final

(2)抽象方法:public abstract

如:

interface Demo {
	public static final int NUM = 4;
	public abstract void show();
}

接口中的成员必须这么定义。

可以得出一个结论,接口中的成员都是公共的权限。

3,由于接口中的成员的修饰符石固定的,所以若不写publc static final或是其中的某个修饰符,编译时会自动加上,但返回值类型必须写。

上述中的那段代码可以写成:

interface Demo {
	int NUM = 4;
	void show();
}

但一般不这么写,因为阅读性太差。若int NUM = 4;前面不加修饰符,很可能把它误以为是一个变量,而show()前不加修饰符,由于抽象方法是需要被覆盖的,而覆盖必须要了解抽象的权限,否则可能覆盖失败。

9-10,接口-实现implements

1,形式:

interface Demo