终极结论:
类到对象是实例化,对象到类是抽象 抽象类: 1、什么是抽象类? 类和类之间有共同特征,将这些特征提取出来,形成的就是抽象类 类本身是不存在的,所以抽象类无法创建对象(实例化) 2、抽象类属于什么数据类型? 抽象类也属于引用数据类型 3、抽象类怎么定义? 语法: [修饰符列表] abstract class 类名{ 类体; } 结论: 4、抽象类无法实例化的,无法创建对象,所以抽象类是用来被子类继承的 思考:抽象类也是类 那么能不能加final不让其他类继承呢? 答案:不能 5、final和abstract不能联合使用,这两个关键字是对立的 6、抽象类的子类可以是抽象类 7、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的[构造方法当中有super();子类可以通过super();调用父类的构造方法] 8、抽象类关联到一个概念:抽象方法 / 抽象类当中也可以有非抽象方法 public void doSome(){} 什么是抽象方法? 例如:public abstract void doSome(); 特点1:没有方法体,以分号结束 特点2:前面修饰符列表中abstract关键字 9、抽象类中不一定有抽象方法,但抽象方法一定在抽象类当中 10、【重点】:一个非抽象类,继承抽象类,必须将抽象类当中的抽象方法进行覆盖/重写
一、抽象类的概述
二、抽象类的应用
1、抽象类无法实例化的,无法创建对象,所以抽象类是用来被子类继承的
代码演示:
public class homework01 {
public static void main(String[] args) {
// 将抽象类实例化对象
// 报错:Animal是抽象的; 无法实例化
// 因为抽象类本身是由类抽象出来的 但是类也是凭借对象空想出来的(如猫[对象]----->空想成Animal[类])
Animal a =new Animal();
}
}
// 动物类(假设是抽象类)
abstract class Animal{
}
思考:抽象类也是类 那么能不能加final不让其他类继承呢? 答案:不能 2、final和abstract不能联合使用,这两个关键字是对立的
代码演示:
public class homework01 {
public static void main(String[] args) {
}
}
// 动物类(假设是抽象类)
final abstract class Animal{
// 报错:非法的修饰符组合: abstract和final
}
3、抽象类的子类可以是抽象类
public class homework01 {
public static void main(String[] args) {
}
}
// 动物类(假设是抽象类)
abstract class Animal{
}
// 来个抽象子类进行继承抽象的动物类[假设Dog是抽象类]
abstract class Dog extends Animal{
// 能够运行 不报错
}
4、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的[构造方法当中有super();子类可以通过super();调用父类的构造方法]
public class homework01 {
public static void main(String[] args) {
// 抽象类无法实例化对象
// 报错:Dog是抽象的; 无法实例化
// Dog d =new Dog();
// Cat类是由对象抽象出来的 可以实例化对象
Cat c =new Cat();
}
}
// 动物类(假设是抽象类)
abstract class Animal{
// 抽象类当中默认由一个无参构造方法
public Animal() {
System.out.println("抽象动物类的无参构造方法开始执行");
}
}
// 来个抽象子类进行继承抽象的动物类[假设Dog是抽象类]
abstract class Dog extends Animal{
// 无参构造方法
public Dog() {
// 构造方法当中第一行默认有一个super();调用父类的无参构造方法
System.out.println("抽象Dog类的无参构造方法开始执行");
}
}
// 假设猫是由对象抽象出来的一个类
class Cat extends Dog{
public Cat() {
// 默认一个super(); 去调用父类Dog的无参构造方法
System.out.println("子类Cat的无参构造方法开始执行");
}
}
运行结果:
5、抽象类关联到一个概念:抽象方法 / 抽象类当中也可以有非抽象方法 public void doSome(){}
代码演示:
public class homework01 {
public static void main(String[] args) {
}
}
// 动物类(假设是抽象类)
abstract class Animal{
public abstract void doSome();
// 也可以有非抽象方法
//public void doSome(){}
}
6、抽象类中不一定有抽象方法,但抽象方法一定在抽象类当中
public class homework01 {
public static void main(String[] args) {
}
}
// 动物类(假设是抽象类)
class Animal{
// 抽象方法
// 报错:Animal不是抽象的, 并且未覆盖Animal中的抽象方法doSome()
public abstract void doSome();
}
三、非抽象类继承抽象类必须想实现抽象方法
public class homework01 {
public static void main(String[] args) {
// 能不能使用多态?
// 答案:可以
// 因为Dog类是非抽象类 所以可以创建对象 又因为Animal类是Dog的父类 所以可以使用多态(向上转型)
// 又因为子类继承父类重写了方法 所以可以通过父类"引用."进行访问方法
Animal a =new Dog(); // 向上转型
// 分析:
// 编译时:move()方法是Animal类来进行找move()方法进行静态绑定
// 运行时: move()方法是Dog类来进行找move()方法进行运行(也就验证了非抽象类继承抽象类[有抽象方法]时,要重写该方法)
a.doSome(); // 输出结果: 鸟儿在飞翔
/*
这里就是面向抽象编程
以后你都是调用的a.方法名
a的类型是Animal,Animal是抽象的
面向抽象编程,不面向具体编程,降低程序的耦合度,提高程序的扩展力
这种编程思想符合OCP原则
*/
}
}
// 动物类(假设是抽象类)
abstract class Animal{
// 抽象方法
public abstract void doSome();
}
// 定义非抽象类
class Dog extends Animal{
// 方法体中什么也不写时报错:Dog不是抽象的, 并且未覆盖Animal中的抽象方法doSome()
// 报错原因:Dog类继承抽象类Animal会将抽象方法也继承下来,但是规定抽象方法一定在抽象类当中 所以报错
// 如何把抽象方法在非抽象类中实现呢?
// 需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也可以叫做"实现"
public void doSome(){
System.out.println("鸟儿在飞翔");
}
}