抽象类【详细】

About Me

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

优秀是一种习惯♡♡♡

做更好的自己!

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


一:抽象类

1. 什么是抽象类?

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

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

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

image-20211108210506709

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 什么是面向抽象编程?

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

image-20211108201420769

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本地程序。

三:思维导图

image-20211116114400784
                                                      不要在最能吃苦的年纪选择了安逸!!!        — Tornado♥

  • 19
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
抽象类Java中的一种特殊类,它不能被实例化,只能作为其他类的基类或父类来被继承。抽象类的主要目的是为了提供一种通用的抽象模板,定义了一些方法的签名(包括方法名、参数和返回类型),但没有具体的实现。子类继承抽象类后,必须实现抽象方法,才能创建该子类的实例。 在Java中,我们使用`abstract`关键字来声明一个抽象类抽象类可以包含普通方法、成员变量和构造方法,但不能包含私有的构造方法。抽象方法用`abstract`关键字来声明,并且不提供具体的实现。子类必须实现父类中的所有抽象方法,否则子类也必须声明为抽象类。 下面是一个简单的抽象类的示例: ```java abstract class Shape { protected String color; public Shape(String color) { this.color = color; } public abstract double getArea(); } class Circle extends Shape { private double radius; public Circle(double radius, String color) { super(color); this.radius = radius; } @Override public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { private double side; public Square(double side, String color) { super(color); this.side = side; } @Override public double getArea() { return side * side; } } ``` 在上面的示例中,`Shape`类是一个抽象类,它有一个抽象方法`getArea()`,并且包含一个成员变量`color`和一个构造方法。`Circle`和`Square`类继承自`Shape`类,并实现了抽象方法`getArea()`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值