Java抽象类,那抽象类的出现是为了
Java抽象类,那抽象类的出现是为了
目录
一、抽象类的基本概念
二、抽象类的使用
一、抽象类是否能被实例化
二、抽象类的使用语法
三、抽象类的使用限制
一、抽象类的基本概念
如果需要在类中定义一个没有方法体的方法,可以在类前加上 abstract 关键字来定义。
那抽象类的出现是为了解决什么呢?
类的核心包含了属性和方法,在学完继承之后,可以知道子类是可以重写父类方法的,这一点又与对象的多态相关。但是这样又会有一个问题,假设有一个普通的类(父),类中有个eat()的方法,但是所有的子类都必须去覆盖(重写)eat()的方法,但是这只是个普通的类,它的子类完全可以不去重写eat()的方法,这个时候就会有漏洞,那抽象类的出现就很好的解决子类不去重写父类的方法。
【举个例子】:定义一个抽象类
public abstract class A { // 普通方法 public void eat() { } // 抽象方法 public abstract void run(); }
二、抽象类的使用
一、抽象类是否能被实例化
抽象类是无法进行实例化的
【举个例子】:我们直接实例化抽象类
// 定义一个抽象类 public abstract class A { // 定义一个普通方法 public void eat() { System.out.println("存在方法体的方法"); } // 定义一个抽象方法,没有方法体,用 abstract 做修饰符 public abstract void run(); } // 定义一个测试类 abstract class Test { public static void main(String[] args) { // 实例化抽象类 A csdn = new A(); } }
你会发现在实例化的时候就会有编译错误 'A' is abstract;cannot be instantiated
一个类在被实例化的时候是可以调用这个类的属性和方法的,但在抽象类中的方法是没有方法体的,所以就没有东西去调用,既然没有东西去调用就没办法去实例化。所以抽象类只能通过继承去使用。
二、抽象类的使用语法
1、抽象类中可以有普通方法。
public abstract class Animal { // 抽象类中可以有普通方法 public void eat() { } }
2、抽象类中可以有抽象方法(抽象方法没有方法体)。
public abstract class Animal { // 抽象类中可以有抽象的方法 public abstract void run(); }
3、抽象类不能直接实例化,必须通过子类采用向上转型才能实例化,且一个类只能继承一个抽象类。
// 定义一个抽象类 public abstract class A { // 定义一个普通方法 public void eat() { System.out.println("存在方法体的方法"); } // 定义一个抽象方法,没有方法体,用 abstract 做修饰符 public abstract void run(); } // 定义一个子类B继承抽象类A class B extends A { @Override public void run() { System.out.println("跑起来"); } } // 定义一个测试类 abstract class Test { public static void main(String[] args) { A a = new B(); a.run(); } }
运行结果:
D:\JDK\JDK17\bin\java.exe "-javaagent:D:\IntelliJ IDEA\lib\idea_rt.jar=49799:D:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\26026\Desktop\面向对象\JavaSE\out\production\JavaSE com.gb_learning_note.abstract_class.abstract_class_concept.Test 跑起来 Process finished with exit code 0
4、抽象类可以包含属性、方法、构造方法、但是构造方法不能用于实例化,它的用途主要是被子类调用。
5、包含抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法。
6、抽象方法必须是 public、protected、或者是默认default,因为如果为 private 则不能被子类所继承,子类也无法实现该方法,省略情况下会默认为 public。
7、子类继承父类(无论抽象方法还是普通方法)的方法,访问修饰符都必须大于或等于父类的访问修饰符。
三、抽象类的使用限制
1、抽象类中是有构造方法的,由于构造方法里面是允许定义属性的,所以抽象类中的构造方法也是会对属性进行初始化,并且子类实例化的时候还是会满足先执行父类构造方法再执行子类构造方法。
// 定义一个抽象类 public abstract class A { // 定义 A 的构造方法 public A() { System.out.println("定义A的构造方法"); } } // 定义一个子类B继承抽象类A class B extends A { public B() { System.out.println("定义B的构造方法"); } } // 定义一个测试类 abstract class Test { public static void main(String[] args) { A a = new B(); } }
运行结果:
D:\JDK\JDK17\bin\java.exe "-javaagent:D:\IntelliJ IDEA\lib\idea_rt.jar=61558:D:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\26026\Desktop\面向对象\JavaSE\out\production\JavaSE com.gb_learning_note.abstract_class.abstract_class_concept.Test 定义A的构造方法 定义B的构造方法 Process finished with exit code 0
2、抽象类不能使用final声明,因为抽象类必须得有子类,而final定义的类不能有子类。
3、外部抽象类不能使用static声明,但是内部抽象类可以使用。
【举个例子】:外部抽象类
// 定义一个抽象类 static abstract class A { // 定义 A 的构造方法 public A() { System.out.println("定义A的构造方法"); } } // 定义一个子类B继承抽象类A class B extends A { public B() { System.out.println("定义B的构造方法"); } } // 定义一个测试类 public abstract class Test { public static void main(String[] args) { A a = new B(); } }
运行结果:
C:\Users\26026\Desktop\面向对象\JavaSE\src\com\gb_learning_note\abstract_class\abstract_class_concept\A.java:4:17 java: 此处不允许使用修饰符static
所以外部抽象类不能使用 static 声明
【举个例子】:内部抽象类
// 定义一个抽象类 public abstract class A { // 定义一个普通方法 public void eat() { System.out.println("存在方法体的方法"); } static abstract class B { // 定义一个抽象方法,没有方法体,用 abstract 做修饰符 public abstract void run(); } } class C extends A.B { @Override public void run() { System.out.println("跑起来"); } } // 定义一个测试类 abstract class Test { public static void main(String[] args) { A.B a = new C(); a.run(); } }
运行结果:
D:\JDK\JDK17\bin\java.exe "-javaagent:D:\IntelliJ IDEA\lib\idea_rt.jar=51460:D:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\26026\Desktop\面向对象\JavaSE\out\production\JavaSE com.gb_learning_note.abstract_class.abstract_class_concept.Test 跑起来 Process finished with exit code 0
4、任何时候如果要执行类中的 static 方法的时候,都可以在没有对象的时候直接调用,抽象类也一样。
【举个例子】:
// 定义一个抽象类 public abstract class A { // 定义一个普通方法 public static void eat() { System.out.println("Java"); } } // 定义一个测试类 abstract class Test { public static void main(String[] args) { A.eat(); } }
运行结果:
D:\JDK\JDK17\bin\java.exe "-javaagent:D:\IntelliJ IDEA\lib\idea_rt.jar=60099:D:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\26026\Desktop\面向对象\JavaSE\out\production\JavaSE com.gb_learning_note.abstract_class.abstract_class_concept.Test Java Process finished with exit code 0
用户评论