目录
1、对抽象的理解
抽象类为了把相同但是不确定的东西提出来,并可以具有多种实现方案,目的时为了想子类实现----没有方法体的方法叫抽象方法,必须使用abstract关键字修饰
例如:
abstract class Shape {
public int a;//抽象类成员变量
abstract public void func();//抽象类成员方法
}
也就是:抽象类只定义方法名,没有方法体
注意:抽象类可以没有抽象方法,但是抽象方法必须在抽象类中,即普通类中不能有抽象方法
2、抽象类的继承
抽象类中的抽象方法,子类继承该抽象方法时,必须重写这些抽象方法,普通方法可以不用重写
例如:一个普通类继承了一个抽象类,而没有重写 抽象类Shape 的抽象方法 所以报错
正确继承应该这样,重写Shape的func() 方法
abstract class Shape {
public int a;//抽象类成员变量
abstract public void func();//抽象类成员方法
}
public class Test11 extends Shape{
public static void main(String[] args) {
}
@Override
public void func() {
// TODO Auto-generated method stub
}
}
而普通类的继承就不需要重写方法。
3、抽象类可以实现多态
abstract class Shape {
public abstract void draw(); // 抽象方法不能里有具体的语句
}
// 当一个普通类继承一个抽象类的时候,再这个子类中必须重写抽象类中的抽象方法
class Cycle extends Shape {
@Override // 如果不重写会报错,但如果继承的是普通类则不会报错,用抽象类更安全
public void draw() {
System.out.println("画一个圆圈");
}
}
class Flower extends Shape { // 不同的子类对父类的draw方法进行了不同的重写
@Override
public void draw() {
System.out.println("画一朵花");
}
}
class Square extends Shape {
@Override
public void draw() {
System.out.println("画一个正方形");
}
}
public class Test4 {
public static void main(String[] args) {
Cycle cycle = new Cycle(); // 子类引用cycle
Flower flower = new Flower(); // 子类引用flower
Square square = new Square();
// 数组的类型是Shape,即数组中每一个元素都是一个父类引用
// 在这个过程其实也发生了向上转型,对抽象类中的方法进行了重写
Shape[] shapes = {cycle, flower, square}; // 父类引用引用不同的子类对象
for (int i = 0; i < shapes.length; i++) {
Shape shape = shapes[i]; // 父类引用shape指向—>当前所对应的子类对象
shape.draw(); // 通过父类引用调用子类重写的draw方法
}
}
结果都是调用 draw()方法,因为子类的不同,输出结果也不同。
3.1对于多态来说,他有这三个要素
1、继承(我们刚才的Cycle类继承Shape抽象类)
2、重写(我们子类对draw方法的重写)
3、父类指向子类对象(就是shape1[0] = cycle -->也可以称作向上转型)
回头再看一下我们的代码,是不是就刚好符合了多态的三要素。
当我们的父类引用指向不同的子类对象时,当我们调用同一个draw方法时却输出了不同的结果。(其实就是该方法再子类中被重写成了不同形式)这就叫做多态。
4、总结
- 抽象类为了把相同但是不确定的东西提出来,并可以具有多种实现方案,目的时为了想子类实现
- 没有方法体的方法叫抽象方法,必须使用abstract关键字修饰
- 抽象类可以没有抽象方法,但是抽象方法必须在抽象类中,即普通类中不能有抽象方法
- 抽象类使用abstract关键字进行修饰
- 抽象类中的抽象方法,子类继承该抽象方法时,必须重写这些抽象方法,普通方法可以不用重写
- 抽象类可以使用多态,即抽象类类型的变量可以指向其子类对象
- 抽象类不能实例化,即抽象类不能指向自己类型的对象
- 抽象类中的private和abstract不同同时在一个抽象方法中,private修饰的方法子类不可见,子类无法重写,abstract是要重写,冲突
- 抽象类中的static和abstract不能同时在一个抽象方法中,static是针对类层面的,abstract是针对对象层面的 冲突
- 抽象类中的final和abstract不能同时在一个抽象方法中,final是禁止方法重写,abstract是要求方法重写 冲突
- 抽象类不能实例化 但是可以有构造器 有构造器的目的是子类实例化时会先调用父类的构造器
- 子类继承抽象类之后,如果不想实现抽象类中的抽象方法,那么就让该类也变成抽象类