About Me
欢迎各位读者访问,大家一起学习。
优秀是一种习惯♡♡♡
做更好的自己!
本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡
一:抽象类
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. 什么是抽象方法?
- 抽象方法就是在抽象类中没有实现的方法,没有方法体的方法。
- 没有方法体,以分号结尾;
- 方法中有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 什么是面向抽象编程?
顾名思义,面向抽象编程也就是不在面向具体的类,而是面向抽象类,让设计者不在关心具体的实现。可以降低程序的耦合度,提高程序的扩展力。
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本地程序。
三:思维导图
不要在最能吃苦的年纪选择了安逸!!! — Tornado♥