1.1 抽象类概述
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具回想前面我们的猫狗案例,提取出了一个动物类,这个时候我们是可以通过Animal a = new Animal()来创建动物对象的,其实这是不对的。为什么呢?因为,我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。 所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
1.1.1 案例代码
package com.itheima_01;
public class AnimalDemo {
public static void main(String[] args) {
/*
Animal a = new Animal();
a.eat();
*/
}
}
package com.itheima_01;
public abstract class Animal {
/*
public void eat() {
System.out.println("吃东西");
}
*/
//抽象方法
public abstract void eat();
}
1.2 抽象类的特点
抽象类和抽象方法必须用abstract关键字修饰
格式:
public abstract class 类名 {}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
2.2.1 案例代码
package com.itheima_02;
/*
* 抽象类的特点:
* A:抽象类和抽象方法必须使用abstract关键字修饰
* B:抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
* C:抽象类不能实例化
* 抽象类如何实例化呢?
* 参照多态的方式,通过子类对象实例化。
* D:抽象类的子类
* 要么重写抽象类中的所有抽象方法
* 要么是抽象类
*/
public class AnimalDemo {
public static void main(String[] args) {
//创建对象
//Animal a = new Animal();
//按照多态的形式实例化抽象类
Animal a = new Cat();
a.eat();
a.sleep();
}
}
package com.itheima_02;
public abstract class Dog extends Animal {
}
package com.itheima_02;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_02;
//抽象类
public abstract class Animal {
//抽象方法
public abstract void eat();
public void sleep() {
System.out.println("睡觉");
}
}
1.3 抽象类的成员的特点
- 成员变量
- 可以是变量
- 也可以是常量
- 构造方法
- 有构造方法,但是不能实例化
- 那么,构造方法的作用是什么呢?
- 用于子类访问父类数据的初始化
- 成员方法
- 可以有抽象方法 限定子类必须完成某些动作
- 也可以有非抽象方法 提高代码复用性
1.3.1案例代码
package com.itheima_03;
/*
* 抽象类的成员特点:
* 成员变量:
* 有成员变量,成员变量可以是变量,也可以是常量。
* 构造方法:
* 有构造方法。
* 抽象类中构造方法的作用?
* 用于子类访问父类数据的初始化。
* 成员方法:
* 有成员方法,成员方法可以是抽象的,也可以是非抽象的。
* 抽象方法:限定子类必须完成某些动作
* 非抽象方法:提高代码的复用性
*/
public class PersonDemo {
public static void main(String[] args) {
Person p = new Student();
p.show();
}
}
package com.itheima_03;
public class Student extends Person {
@Override
public void eat() {
System.out.println("学生吃米饭");
}
}
package com.itheima_03;
public abstract class Person {
private int age = 20;
private final String country = "中国";
public Person() {}
public Person(int age) {
this.age = age;
}
public void show() {
age = 30;
System.out.println(age);
//country = "美国";
System.out.println(country);
}
public abstract void eat();
}
1.4抽象类的练习之老师案例
- 老师案例
- 具体事物:基础班老师,就业班老师
- 共性:姓名,年龄,讲课。
1.4.1案例代码
package com.itheima_04;
/*
* 分析:从具体到抽象
* 实现:从抽象到具体
* 使用:使用的是具体的类的对象
*
* 分析:
* package com.itheima_04;
/*
* 分析:从具体到抽象
* 实现:从抽象到具体
* 使用:使用的是具体的类的对象
*
* 分析:
* 基础班老师:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach(){}
* 就业班老师:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach(){}
*
* 抽象的老师类:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach();
*/
public class TeacherDemo {
public static void main(String[] args) {
//使用的是具体的类的对象
//BasicTeacher
//多态形式的测试
Teacher t = new BasicTeacher();
t.setName("林青霞");
t.setAge(30);
System.out.println(t.getName()+"---"+t.getAge());
t.teach();
System.out.println("---------------------------");
t = new BasicTeacher("林青霞", 30);
System.out.println(t.getName()+"---"+t.getAge());
t.teach();
}
} 基础班老师:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach(){}
* 就业班老师:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach(){}
*
* 抽象的老师类:
* 成员变量:name,age
* 构造方法:无参,带参
* 成员方法:getXxx(),setXxx(),teach();
*/
public class TeacherDemo {
public static void main(String[] args) {
//使用的是具体的类的对象
//BasicTeacher
//多态形式的测试
Teacher t = new BasicTeacher();
t.setName("林青霞");
t.setAge(30);
System.out.println(t.getName()+"---"+t.getAge());
t.teach();
System.out.println("---------------------------");
t = new BasicTeacher("林青霞", 30);
System.out.println(t.getName()+"---"+t.getAge());
t.teach();
}
}
package com.itheima_04;
//就业班老师
public class WorkTeacher extends Teacher {
public WorkTeacher() {}
public WorkTeacher(String name,int age) {
super(name,age);
}
@Override
public void teach() {
System.out.println("就业班老师讲解JavaEE的内容");
}
}
package com.itheima_04;
//基础班老师
public class BasicTeacher extends Teacher {
public BasicTeacher() {}
public BasicTeacher(String name,int age) {
super(name,age);
}
@Override
public void teach() {
System.out.println("基础班老师讲解JavaSE的内容");
}
}
package com.itheima_04;
//抽象的老师类
public abstract class Teacher {
private String name;
private int age;
public Teacher() {}
public Teacher(String name,int age) {
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 teach();
}
网友评论