目录
一:概述
二:抽象类的特点
1:抽象类和抽象方法必须用abstract关键字修饰
2:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。
3:抽象类的子类 要么是抽象类 要么重写抽象类中的所有抽象方法。
三:抽象类的成员特点
1:成员变量
2:构造方法
3:那么,构造方法的作用是什么呢?
4:成员方法
5:抽象类的抽象方法和非抽象方法
6:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
四:例子
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
格式 abstract class 类名 {}
public abstract void eat();
抽象类不能实例化 那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
可以是变量 也可以是常量
有构造方法,但是不能实例化
对现实中一些抽象事物的描述
用于子类访问父类数据的初始化
可以有抽象方法 限定子类必须完成某些动作 也可以有非抽象方法 提高代码服用性,子类可以有非抽象化方法,不过调用时要转化。(向下转型)
抽象类的抽象方法:用于限定子类必须完成某些动作 抽象类的
非抽象方法:用于提高代码的服用性
可以,为了描述一些生活中一些抽象的事物
package Proctice2; /*猫狗案例 具体事物:猫,狗 共性:姓名,年龄,吃饭 */ abstract class Animal{ private int age;//成员变量 private String name;//成员变量 public abstract void eat();//动物类的抽象方法 public void run(){ System.out.println("动物喜欢跑");//动物类的非抽象方法 } public Animal() {//无参构造 } public Animal(int age, String name) {//有参构造 this.age = age; this.name = name; } public int getAge() {//get方法 return age; } public void setAge(int age) {//set方法 this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println(getName()+"**"+getAge()); } } class Cat extends Animal{ public Cat() {//无参构造 } public Cat(int age, String name) {//有参构造 super(age, name);//引用父类的成员变量 super.run();//使用父类的非抽象方法 super.show();//父类的非抽象方法 } @Override public void eat() {//重写父类的方法 System.out.println("猫喜欢吃鱼"); } public void clim(){//自己的成员方法 System.out.println("猫会爬树"); } } class Dog extends Animal{ public Dog() {//无参构造 } public Dog(int age, String name) {//有参构造 super(age, name);//引用父类的成员变量 super.run();//使用父类的非抽象方法 super.show();//父类的非抽象方法 } @Override public void eat() {//重写父类的成员方法 System.out.println("狗喜欢吃肉"); } public void watch(){//自己的成员方法 System.out.println("狗会看门"); } } public class Text11 { public static void main(String[] args) { Animal c=new Cat(2,"小花");//调用有参构造 c.eat();//调用重写的成员方法 Cat c1=(Cat) c;//向下转型 c1.clim();//调用特有的成员方法 Animal d= new Dog(3,"小黄");//调用有参构造 d.eat();//调用重写的成员方法 Dog d1=(Dog) d;//向下转型 d1.watch();//调用特有的成员方法 } }