首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:OOP:继承
第二章:关键字 super
第三章:关键字 static
第四章:成员变量初始化
第五章:OOP:多态
第六章:关键字 native
第七章:关键字 final
第八章:Object 类的使用
第九章:抽象类
第十章:接口
第十一章:经典接口介绍
第十二章:包装类
第十三章:内部类
当前位置:
首页>>
技术小册>>
Java语言基础6-面向对象高级
小册名称:Java语言基础6-面向对象高级
9.1 概述 随着继承层次一个个新的子类的定义,类变得越来越具体,而父类则更一般,更通用。 类的设计应该保证父类和子类能够共享特征。 这些公共特征应该抽取到一个公共的父类中,而这些方法在父类中又无法给出具体的实现,而是应该交给子类各自去实现。 在父类中声明这些方法的时候,就只有方法签名,没有方法体,我们将这些没有方法体的方法称为 抽象方法 。 在 Java 中,将包含抽象方法类称为 抽象类 。 9.2 语法格式 抽象类 : 定义:使用 abstract 关键字修饰的类。 语法: ```bash 权限修饰符 abstract class 类名 {} ``` ```bash 权限修饰符 abstract class 类名 extends 父类 {} ``` - 抽象方法 : - 定义:没有方法体的方法。 - 语法: ```bash 权限修饰符 abstract 返回值类型 方法名(参数列表); ``` 示例: ```bash package com.github.demo; /** * 抽象类 Animal * * @author maxiaoke.com * @version 1.0 * @return */ public abstract class Animal { /** * 吃饭的方法 */ public abstract void eat(); } ``` ```bash package com.github.demo; /** * @author maxiaoke.com * @version 1.0 * @return */ public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃老鼠"); } } ``` ```bash package com.github.demo; /** * @author maxiaoke.com * @version 1.0 * @return */ public class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉"); } } ``` ```bash package com.github.demo; /** * @author maxiaoke.com * @version 1.0 * @return */ public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); // 狗吃肉 Cat cat = new Cat(); cat.eat(); // 猫吃老鼠 } } ``` 9.3 注意事项 ① 抽象类不能创建对象,如果创建,编译将无法通过。只能创建其非抽象子类的对象。 理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。 ② 抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。。 理解:子类的构造方法中,有默认的 super() 或手动的 super(实参列表) ,需要访问父类的构造方法。 ③ 抽象类中,不一定包含抽象方法,但是有抽象方法的类一定属于抽象类。 理解:没有包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。 ④ 抽象类的子类,必须重写抽象父类的所有抽象方法;否则,编译无法通过。除非,该子类也是抽象类。 理解:假设不重写所有的抽象方法,则类中可能包含抽象方法,那么在创建对象后,调用抽象的方法,没有意义。 ⑤ 不能用 abstract 修饰变量、代码块、构造器。 ⑥ 不能用 abstract 修饰私有方法、静态方法、final 修饰的方法和 final 修饰的类。 9.4 练习 9.4.1 练习1 定义一个几何图形父类 Graphic 。所有几何图形都应该具备一个计算面积的方法。但是不同的几何图形计算面积的方式完全不同。 示例: ```bash package com.github.demo2; /** * 图形 * * @author maxiaoke.com * @version 1.0 * @return */ public abstract class Graphic { /** * 计算面积 * * @return double */ public abstract double getArea(); } ``` ```bash package com.github.demo2; /** * 圆 * * @author maxiaoke.com * @version 1.0 * @return */ public class Circle extends Graphic { private double radius; public Circle() {} public Circle(double radius) { this.radius = radius; } public double getRadius() { return this.radius; } public void setRadius(double radius) { this.radius = radius; } @Override public double getArea() { return Math.PI * Math.pow(this.radius, 2); } } ``` ```bash package com.github.demo2; /** * 矩形 * * @author maxiaoke.com * @version 1.0 * @return */ public class Rectangle extends Graphic { private double width; private double height; public Rectangle() {} public Rectangle(double width, double height) { this.width = width; this.height = height; } public double getWidth() { return this.width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return this.height; } public void setHeight(double height) { this.height = height; } @Override public double getArea() { return this.width * this.height; } } ``` ```bash package com.github.demo2; /** * @author maxiaoke.com * @version 1.0 * @return */ public class Test { public static void main(String[] args) { Circle circle = new Circle(2); double area = circle.getArea(); System.out.println("circle:" + area); Rectangle rectangle = new Rectangle(2, 2); area = rectangle.getArea(); System.out.println("rectangle:" + area); } } ``` 9.5 修饰符的使用(了解) - 修饰符的使用总结如下: ![](/uploads/images/20230725/ee49ac0d7e3f1292e698e6bb336b34a6.png) - 不能和 abstract 一起使用的修饰符: - abstract 和 final 不能一起修饰 方法 和 类。 - abstract 和 static 不能一起修饰 方法 。 - abstract 和 native 不能一起修饰 方法 。 - abstract 和 private 不能一起修饰 方法。 - static 和 final 一起使用: - 修饰方法:可以,因为都不能被重写。 - 修饰成员变量:可以,表示静态常量。 - 修饰局部变量:不可以,static 不能修饰局部变量。 - 修饰代码块:不可以,final 不能修饰代码块。 - 修饰内部类:可以一起修饰成员内部类,不能一起修饰局部内部类。
上一篇:
第八章:Object 类的使用
下一篇:
第十章:接口
该分类下的相关小册推荐:
Java面试指南
Java语言基础10-Java中的集合
Java必知必会-JDBC
Java语言基础3-流程控制
Java语言基础11-Java中的泛型
Mybatis合辑2-Mybatis映射文件
Java高并发秒杀入门与实战
SpringBoot合辑-高级篇
深入理解Java虚拟机
Mybatis合辑5-注解、扩展、SQL构建
Mybatis合辑4-Mybatis缓存机制
Java并发编程