在进入抽象的学习之前,先看下面的代码,有一个Animal类,并且有一个eat方法,我们可以通过 Animal animal = new Animal(); 来创建一个动物类对象。
public class Animal {public void eat(){System.out.println("动物吃东西");}
}
我们给动物创建对象,对吗?很明显这是不对的吧,假设,他说他被动物咬了,你知道他说的动物是什么动物吗?再假设,他说他被狗咬了?你是不是一下子就知道他被狗这个具体的动物对象咬了。
因此,动物本身又不是具体的动物,只有看到猫、狗等具体的动物对象,我们才会知道这动物是什么动物吧。所以,在现实中只要描述的不是具体事物(例如,动物、人类等),那就可以把它理解为抽象的。
同理,每个动物吃的东西应该都是不一样的,我们也不应该给动物具体的吃的方法实现,而应该只给吃的方法声明,只声明这个动物能吃东西即可。通俗来说就是,我们只会说动物能吃东西,不会说它具体吃什么东西,这具体吃的东西看具体动物的特性,例如:狗吃骨头,猫吃鱼等。再举个反例,动物吃骨头?动物吃鱼?是不是怪怪的,每个动物都吃骨头吗?像牛就只吃草。所以不应该给具体的方法实现,只给声明即可。
1、抽象类概述
1.1 概念:在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
1.2 代码实现
//抽象类
public abstract class Animal {//抽象方法public abstract void eat();
}
2、抽象类的特点
(1)抽象类和抽象方法必须使用abstract 关键字修饰
① public abstract class 类名 {}
② public abstract void eat();
(2)抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;
(3)抽象类不能实例化。那抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态。
(4)抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类。
或者
(5)代码实现
① Animal类
//抽象类
public abstract class Animal {//抽象方法public abstract void eat();
}
② Cat类
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼。。。");}
}
③ Dog类
public class Dog extends Animal{public void eat(){System.out.println("狗吃骨头。。");}
}
④ Test类
public class Test {public static void main(String[] args) {Animal animal = new Cat();animal.eat();Animal animal2 = new Dog();animal2.eat();}
}
⑤ 运行结果
3、抽象类的成员特点
3.1 抽象类的成员有哪些?
(1)成员变量,可以是变量,也可以是常量。
(2)构造方法,有构造方法,但是不能实例化。那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化。也就是在子类的构造方法中,会访问父类的构造方法来完成数据的初始化操作。
(3)成员方法:可以有抽象方法,限定子类必须完成某些动作;也可以有非抽象方法,提高代码复用性。
3.2 代码实现
① Animal类
public abstract class Animal {private int age = 20;private final String city = "南宁";public Animal(){}public Animal(int age){this.age = age;}public void show(){age = 40;System.out.println(age);System.out.println(city);}public abstract void eat();
}
② Cat类
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼。。。");}
}
③ Test类
public class Test {public static void main(String[] args) {Animal animal = new Cat();animal.eat();animal.show();}
}
④ 运行结果
4、抽象类的案例
① Animal类
package Polymorphism;public abstract class Animal {private int age;private String city;public Animal(){}public Animal(int age, String city) {this.age = age;this.city = city;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public abstract void eat();
}
② Cat类
package Polymorphism;import Polymorphism.Animal;public class Cat extends Animal {public Cat() {}public Cat(int age, String city) {super(age, city);}@Overridepublic void eat() {System.out.println("猫吃鱼。。。");}
}
③ Test类
package Polymorphism;public class Test {public static void main(String[] args) {Animal animal = new Cat();animal.setAge(20);animal.setCity("南宁");System.out.println(animal.getAge()+":"+animal.getCity());animal.eat();System.out.println("-------------");Animal animal2 = new Cat(25,"北京");System.out.println(animal.getAge()+":"+animal.getCity());animal.eat();}
}
④ 运行结果
本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!
创作不易,如果对你有点帮助的话麻烦点个赞支持一下!
新手小白,欢迎留言指正!