抽象类【详细】

About Me

欢迎各位读者访问,大家一起学习。

优秀是一种习惯♡♡♡

做更好的自己!

本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡


一:抽象类

1. 什么是抽象类?

  1. 类和类之间具有共同特征,将这些共同特征抽取出来,形成的就是抽象类
  2. 如果一个类没有足够的信息来描述一个具体的对象,这个类就是抽象类。
  3. 因为类本身就是不存在的,所以抽象无法创建对象,也就是无法实例化

问题:既然抽象类是无法创建对象,无法实例化,那是用来干嘛的???

抽象类是用来被子类继承的。

抽象类【详细】_第1张图片

2. 抽象类属于什么类型?

  • 抽象类属于引用数据类型

3. 抽象类怎么定义?

关键字abstract

语法:【修饰符列表】 abstract class 类名{

​ 类体

​ }

4. 思考?

4.1 final和abstract能联合使用吗?

不能联合使用,因为被final关键字修饰过的类是无法继承的,而前面说到abstract就是用来被子类继承的。这两个关键字是对立的
//会报错,因为final和abstract不能联合使用
//final abstract class Person{

//}

4.2 抽象类的子类还可以是抽象类吗?

可以是抽象类

//定义一个抽象类Person
abstract class Person{

}
//抽象类Student继承抽象父类Person
abstract class Student extends Person{

}

4.3 抽象类中有构造方法吗?

抽象类虽然不能实例化,但是抽象类有构造方法,这个构造方法是给子类提供的。因为抽象就是被用来继承的,子类继承父类,子类的构造方法中的第一句默认是super();

//定义一个抽象类Person
abstract class Person {
    //父类无参构造
    Person() {

    }
}

//抽象类Student继承抽象父类Person
abstract class Student extends Person {
    //子类无参构造
    Student() {
        //默认第一句就是调用父类的无参构造
        super();
    }
}

二:抽象方法

1. 什么是抽象方法?

  • 抽象方法就是在抽象类中没有实现的方法,没有方法体的方法。
    1. 没有方法体,以分号结尾;
    2. 方法中有abstract关键字
    //定义一个抽象方法eat();
    public abstract void eat();

2. 思考?

2.1 抽象类中一定要有抽象方法吗?

抽象类中不一定有抽象方法,但是有抽象方法必须得在抽象类中。 抽象方法中还可以有非抽象方法

//定义一个抽象类Person01
abstract class Person01{
    //定义一个抽象方法eat();
    public abstract void eat();
    //非抽象方法
    public void sleep(){
        
    }
}

2.2 如何调用?

使用多态的方式调用,父类的引用指向子类的对象。

public class AbstractTest02 {
    public static void main(String[] args) {
        //使用多态的方式创建对象
        Person01 person01 = new Ceshi();
        //调用eat方法【编译看左,运行看右】
        person01.eat();     //吃
    }
}
//定义一个抽象类Person01
abstract class Person01{
    //定义一个抽象方法eat();
    public abstract void eat();

}
//非抽象类继承抽象类
class Ceshi extends Person01{
    //覆盖重写抽象类中的抽象方法
    @Override
    public void eat() {
        System.out.println("吃");
    }
}

2.3 什么是面向抽象编程?

顾名思义,面向抽象编程也就是不在面向具体的类,而是面向抽象类,让设计者不在关心具体的实现。可以降低程序的耦合度,提高程序的扩展力。

抽象类【详细】_第2张图片

3. 结论:

3.1 非抽象类继承抽象类,必须实现/重写抽象类中的抽象方法。

实现格式: 去掉 abstract 加上 方法体

//定义一个抽象类Person01
abstract class Person01{
    //定义一个抽象方法eat();
    public abstract void eat();

}
//非抽象类继承抽象类
class Ceshi extends Person01{
    //实现抽象类中的抽象方法
    @Override
    public void eat() {
    }
}

3.2 抽象类不能被实例化,只有抽象类的非抽象子类可以创建对象。

public class AbstractTest03 {
    public static void main(String[] args) {
        // 抽象类不能实例化,如果实例化就会报错
        // Test test = new Test();     //报错
    }
}
//定义一个抽象类Test
abstract class Test{
    
}

3.3 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

//定义一个非抽象类Test1
//class Test1{
    //定义一个抽象方法method,一个类中如果有抽象方法那么这个类必须是抽象类
    //public abstract void method();    //报错
//}

4. 权限修饰符

                本类	     同一个包下的类		不同包下的子类	    不同包下的无关类
private		     √
默认		        √		        √
protected	     √		          √				    √
public		     √		          √					√			       √

5. 面试题:

java语言中凡是没有方法体的方法都是抽象方法吗?【判断题】

不对,错误的。Object类中有很多方法都没有方法体,都是以;结尾的,但是他们都不是抽象方法

例如: public native int hashCode(); 这个方法底层调用了C++写的动态链接程序,修饰符中没有abstract,有一个native,表示调用JVM本地程序。

三:思维导图

抽象类【详细】_第3张图片
                                                      不要在最能吃苦的年纪选择了安逸!!!        — Tornado♥

你可能感兴趣的:(java基础,博客,java,开发语言,后端)