全部
技术
PHP
MySQL
前端
Linux
JAVA
工具
纪念日计算器
邮记星
个人记账
笔记侠
历史上的今天
生日密码
生日书
生日密码
生日花语
博古通今
三十六计
鬼谷子
笑林广记
本草纲目
山海经
唐诗宋词
宋词300首
唐诗300首
退出
登录
注册
编辑文章
选择分类
PHP
MySQL
前端
Linux
Java
工具
选择专栏
设计模式
java基础
Angular学习
Java面试题
描述:
Java 抽象类
封面图上传 :
+
点击上传图片
### 抽象类 抽象方法指的是没有方法体的方法,同时它还必须被**abstract**关键字修饰,拥有抽象方法的类一定是抽象类。抽象类一定要使用**abstract**申明,抽象类是不能直接被实例化的,由于抽象类的方法没有方法体,实例化之后也就没法执行了。所有没有意义 ```java abstract class A {//抽象类 public abstract void print();//抽象方法 } ``` - 抽象类一定要有子类,每一个抽象类一定要被子类覆写 - 抽象类的子类(子类不是抽象类)必须覆写抽象类里面的全部方法。 - 抽象类的实例化需要依靠子类完成,采用向上转型的方式处理 - 一个子类只能继承一个抽象类,单继承。 ```java abstract class A {//抽象类 public abstract void print();//抽象方法 } class B extends A{ public void print(){ System.out.println("hello"); } } public class TestDemo{ public static void main(String[] args){ A a = new B();//向上转型 a.print(); } } ``` #### 使用限制 - 抽象类由于会存在一些属性,所以抽象类中一定存在构造方法,子类实例化时依然满足先执行父类构造方法在执行子类构造方法的情况。 - 抽象类不能用final 定义,应为抽象类必须有子类,final 定义的类不能有子类 - 抽象类外部的抽象类不运行使用static 声明,而内部抽象类允许使用static 申明,使用static申明的内部抽象类就相当于一个外部抽象类,继承的时候使用**外部类.内部类**的形式表示类名称。 ```java abstract class A {//抽象类 static abstract class B { public abstract void print();//抽象方法 } } class C extends A.B{ public void print(){ System.out.println("hello"); } } public class TestDemo{ public static void main(String[] args){ A.B ab = new C();//向上转型 ab.print(); } } ``` - 抽象类可以有static方法,如下: ```java abstract class A {//抽象类 public static void print{ System.out.println("hello"); } } public class TestDemo{ public static void main(String[] args){ A.print();//可以直接调用 } } ``` - 我们有时候不想多写一个继承类,同时也不需要外部知道这个子类存在,那么可采用如下方法。 ```java abstract class A {//抽象类 public abstract void print();//抽象方法 private static class B extends A{ public void print(){ System.out.println("hello"); } } public static B newInstance(){ return new B(); } } public class TestDemo{ public static void main(String[] args){ A.newInstance.print();//可以直接调用 } } ``` #### 有关抽象类的一个问题 如下:这样调用输出的结果是**num=0**,这是由与执行 A a = new B(40);时,默认先执行父类构造,那么这个时候由于构造函数还没初始化完成,所以变量都是其对应类型的初始值,即int的初始值是0. 关键点:**类的所以属性赋值都是在构造函数执行完成后开始的** ```java abstract class A {//抽象类 public A(){//2.执行父类构造 this.print();//3.执行该方法会跳到子类去执行 } public abstract void print();//抽象方法 } class B extends A{ int num = 100; public B(int num){ this.num = num; } public void print(){//4.子类执行该方法 System.out.println("num=" + this.num); } } public class TestDemo{ public static void main(String[] args){ A a = new B(40);//1.new B } } ``` ### 总结 - 抽象类规定了子类必须要做的事情,而且可以与抽象类的普通方法结合使用 - 抽象类单继承
保存文章