Bootstrap

java中的抽象类

目录

1、对抽象的理解

2、抽象类的继承

3、抽象类可以实现多态

3.1对于多态来说,他有这三个要素

4、总结


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、总结

  1. 抽象类为了把相同但是不确定的东西提出来,并可以具有多种实现方案,目的时为了想子类实现
  2. 没有方法体的方法叫抽象方法,必须使用abstract关键字修饰
  3. 抽象类可以没有抽象方法,但是抽象方法必须在抽象类中,即普通类中不能有抽象方法
  4. 抽象类使用abstract关键字进行修饰
  5. 抽象类中的抽象方法,子类继承该抽象方法时,必须重写这些抽象方法,普通方法可以不用重写
  6. 抽象类可以使用多态,即抽象类类型的变量可以指向其子类对象
  7. 抽象类不能实例化,即抽象类不能指向自己类型的对象
  8. 抽象类中的private和abstract不同同时在一个抽象方法中,private修饰的方法子类不可见,子类无法重写,abstract是要重写,冲突
  9. 抽象类中的static和abstract不能同时在一个抽象方法中,static是针对类层面的,abstract是针对对象层面的  冲突
  10. 抽象类中的final和abstract不能同时在一个抽象方法中,final是禁止方法重写,abstract是要求方法重写 冲突
  11. 抽象类不能实例化 但是可以有构造器  有构造器的目的是子类实例化时会先调用父类的构造器
  12. 子类继承抽象类之后,如果不想实现抽象类中的抽象方法,那么就让该类也变成抽象类
;