目录
3:抽象类的子类 要么是抽象类 要么重写抽象类中的所有抽象方法。
6:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
一:概述
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
二:抽象类的特点
1:抽象类和抽象方法必须用abstract关键字修饰
格式 abstract class 类名 {}
public abstract void eat();
2:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。
抽象类不能实例化 那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
3:抽象类的子类 要么是抽象类 要么重写抽象类中的所有抽象方法。
三:抽象类的成员特点
1:成员变量
可以是变量 也可以是常量
2:构造方法
有构造方法,但是不能实例化
3:那么,构造方法的作用是什么呢?
对现实中一些抽象事物的描述
用于子类访问父类数据的初始化
4:成员方法
可以有抽象方法 限定子类必须完成某些动作 也可以有非抽象方法 提高代码服用性,子类可以有非抽象化方法,不过调用时要转化。(向下转型)
5:抽象类的抽象方法和非抽象方法
抽象类的抽象方法:用于限定子类必须完成某些动作 抽象类的
非抽象方法:用于提高代码的服用性
6:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,为了描述一些生活中一些抽象的事物
四:例子
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();//调用特有的成员方法
}
}