本帖最后由 我是楠楠 于 2018-3-5 14:06 编辑
第3章 抽象类
1.1 抽象类概述当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢? 分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。 1.1.1 案例代码十一:[AppleScript] 纯文本查看 复制代码 package com.itheima_01;
/*
* abstract:关键字,用于修饰方法和类
* 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
* 抽象类:有抽象方法的类必须是抽象类
*
* 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
*/
public class AbstractDemo {
}
abstract class Animal1 {
public abstract void eat();
//非抽象方法子类可以不重写
public void run() {
}
}
class Cat1 extends Animal1 {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
/*public void eat() {
System.out.println("猫吃鱼");
}*/
}
abstract class Dog1 extends Animal1 {
/*public void eat() {
System.out.println("狗吃屎");
}*/
}
1.2 抽象类的特点 抽象类的特点: 抽象方法只能在抽象类里面 抽象类和抽象方法必须被abstract修饰 抽象类不能创建对象(不能实例化) 抽象类中可以有非抽象的方法 抽象类和类的关系也是继承 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类 1.2.1 案例代码十二package com.itheima_01; /* * 抽象类的特点: * 抽象方法只能在抽象类里面 * 抽象类和抽象方法必须被abstract修饰 * 抽象类不能创建对象(不能实例化) * 抽象类中可以有非抽象的方法 * 抽象类和类的关系也是继承 * 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类 */ public class AbstractDemo2 { public static void main(String[] args) { //Animal a = new Animal(); } }
abstract class Animal2 { public abstract void eat();
public void run() {
} }
class Cat2 extends Animal2 {
@Override public void eat() { // TODO Auto-generated method stub
}
} 1.3 抽象类的成员的特点A:抽象类的成员特点: 成员变量 可以有成员变量 可以有常量 成员方法 可以有抽象方法 可以有非抽象方法 构造方法 可以有构造方法的,需要对抽象类的成员变量进行初始化 1.3.1 案例代码十三[AppleScript] 纯文本查看 复制代码 package com.itheima_01;
/*
* 抽象类的成员特点:
* 成员变量
* 可以有成员变量
* 可以有常量
* 成员方法
* 可以有抽象方法
* 可以有非抽象方法
* 构造方法
* 可以有构造方法的,需要对抽象类的成员变量进行初始化
*
* final:修饰类、成员变量、成员方法
*/
public class AbstractDemo3 {
public static void main(String[] args) {
Dog d = new Dog();
d.barking();
}
}
abstract class Animal {
String name = "哮天犬";
final int num = 10;
public Animal() {
System.out.println("我是抽象类的构造方法");
}
public abstract void eat();
public void run() {}
}
class Dog extends Animal {
public void barking() {
System.out.println(name);
System.out.println(num);
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
}
1.4 抽象类案例
1.4.1 老师案例: 老师类: 属性:姓名,年龄,性别 行为:讲课 基础班老师: 属性:姓名,年龄,性别 行为:讲基础班课程 就业班老师: 属性:姓名,年龄,性别 行为:讲就业班课程 1.4.1.1 案例代码十四[AppleScript] 纯文本查看 复制代码 //测试类
package com.itheima_04;
/*
* 基础班老湿,就业班老湿
共性
属性 姓名,年龄,性别
行为 讲课
*
*/
public class AbstractTest {
public static void main(String[] args) {
//创建的基础班老湿对象
BasicTeacher bt = new BasicTeacher();
//为老湿对象的成员变量进行赋值
bt.setName("风清扬");
bt.setAge(50);
bt.setGender("男");
bt.teach();
//创建就业班老湿对象
JobTeacher jt = new JobTeacher();
//为老湿对象的成员变量进行赋值
jt.setName("苍老师");
jt.setAge(18);
jt.setGender("女");
jt.teach();
}
}
package com.itheima_04;
//老师类
public abstract class Teacher {
private String name;//姓名
private int age;//年龄
private String gender;//性别
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
public Teacher(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public abstract void teach();
}
package com.itheima_04;
//基础班老师类
public class BasicTeacher extends Teacher {
@Override
public void teach() {
System.out.println(getName() + "讲基础班课程");
}
}
package com.itheima_04;
//就业班老师类
public class JobTeacher extends Teacher{
@Override
public void teach() {
System.out.println(getName() + "讲就业班课程");
}
}
1.4.2 员工案例雇员类: 属性:姓名,编号,薪水 行为:工作 程序员: 属性:姓名,编号,薪水 行为:写代码工作 经理: 属性:姓名,编号,薪水,奖金 行为:盯着程序员写代码工作 1.4.2.1 案例代码十五//测试类 [AppleScript] 纯文本查看 复制代码
package com.itheima_05;
/*
* 员工(Employee)示例:
需求:
公司中
程序员(Programmer)有姓名(name),工号(id),薪水(pay),工作(work)。
项目经理(Manager)除了有姓名(name),工号(id),薪水(pay),工作(work),还有奖金(bonus)。
共性
属性 姓名,工号,薪水
行为 工作
*/
public class AbstractTest2 {
public static void main(String[] args) {
//创建程序员对象
Programmer p = new Programmer();
p.setName("张三");
p.setId("002");
p.setPay(10000);
p.work();
//创建项目经理的对象
Manager m = new Manager();
m.setName("比尔盖茨");
m.setId("001");
m.setPay(0);
m.setBonus((byte)100);
m.work();
}
}
//员工类 [AppleScript] 纯文本查看 复制代码
package com.itheima_05;
public abstract class Employee {
private String name;//姓名
private String id;//工号
private double pay;//薪水
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(String name, String id, double pay) {
super();
this.name = name;
this.id = id;
this.pay = pay;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getPay() {
return pay;
}
public void setPay(double pay) {
this.pay = pay;
}
public abstract void work();
}
//程序员类 [AppleScript] 纯文本查看 复制代码 package com.itheima_05;
public class Programmer extends Employee {
@Override
public void work() {
System.out.println(getName() + "正在写代码...");
}
}
//项目经理类 [AppleScript] 纯文本查看 复制代码 package com.itheima_05;
public class Manager extends Employee{
private byte bonus;
public byte getBonus() {
return bonus;
}
public void setBonus(byte bonus) {
this.bonus = bonus;
}
@Override
public void work() {
System.out.println(getName() + "正在盯着程序员写代码...");
}
}
1.4.3 技师案例 技师: 属性:姓名,年龄 行为:服务 足疗技师: 属性:姓名,年龄 行为:按按脚揉揉肩 其它技师: 属性:姓名,年龄 行为:你懂的 1.4.3.1 案例代码十六//测试类 [AppleScript] 纯文本查看 复制代码 package com.itheima_06;
/*
* 足疗店
* 技师
* 足疗技师
* 其他技师
* 共性
* 属性 姓名,年龄
* 行为 服务
*/
public class AbstractTest3 {
public static void main(String[] args) {
//创建足疗技师的对象
足疗技师 zl = new 足疗技师();
zl.service();
//创建其他技师对象
其他技师 qt = new 其他技师();
qt.service();
}
}
//技师类 [AppleScript] 纯文本查看 复制代码 package com.itheima_06;
public abstract class 技师 {
private String name;//姓名
private int age;//年龄
public 技师() {
super();
// TODO Auto-generated constructor stub
}
public 技师(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void service();
}
//足疗技师类 [AppleScript] 纯文本查看 复制代码 package com.itheima_06;
public class 足疗技师 extends 技师{
@Override
public void service() {
System.out.println("揉揉肩按按腰捏捏脚");
}
[align=left]}
//其它技师类 [AppleScript] 纯文本查看 复制代码 package com.itheima_06;
public class 其他技师 extends 技师{
@Override
public void service() {
System.out.println("你懂的");
}
}
1.5 抽象类的细节 A:抽象类关键字abstract可以和哪些关键字共存? 1.private: 私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。 2.final: 抽象类不能和final共存,因为抽象类自身无法创建对象,我们需要通过子类创建对象,一旦抽象类使用final关键字,那么抽象类就没有子类 抽象方法不能和final共存,因为抽象方法后期需要被子类重写,一旦加final无法重写 3.static: 抽象方法不能和static关键字共存,因为一旦加static我们就可以通过类名直接访问抽象方法,由于抽象方法没有方法体,没有任何意义,也不允许这样做 B:抽象类中是否可以不定义抽象方法? 是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用 C:抽象类是否有构造函数?
有,抽象类的构造函数,是由子类的super语句来调用,用于给抽象类中的成员初始化 更多 第一天 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|