1.抽象类
所有由abstract关键字修饰的方法我们称之为 抽象方法!
抽象方法只能存在于 抽象类中!
所有由abstract关键字修饰的类我们称之为 抽象类!
抽象类的特点:
01.由abstract关键字修饰
02.类中可以有抽象方法也可以有普通方法
03.子类必须重写父类的所有抽象方法,除非子类也是抽象类!
04.抽象类不能实例化!但是可以有构造方法!
final:
01.如果一个属性值不希望被修改 在属性前加final
02.如果一个方法不希望被重写 在方法上加 final
03.如果一个类不希望被继承 在类上加final
1 /** 2 * 所有动物的父类 3 */ 4 public abstract class Animal { 5 6 /** 7 * 定义所有动物共有属性 8 */ 9 private int age; // 年龄 10 private String name; // 姓名 11 12 /** 13 * 所有动物公共的行为 14 * 01.如果不在子类中重写这个eat方法!那么所有的动物吃东西都执行这一个方法! 15 * 显然这种方式不可行! 怎么办? 子类重写eat()! 16 * 02.重写方法之后,得到了我们想要的结果! 每个动物吃饭的方法都不一样! 17 * 我们又发现了一个问题! 父类的这个eat()中的输出语句 有意义??? 18 * 这个输入语句会得到执行吗?? 只要我们重写 这个eat不可能执行! 19 * 那么我们就删除这句话!方法体就没了!{}也删除 20 * 报错了??为什么报错! 21 * 001.加方法体,刚删除,这种方式不可行! 22 * 002.在方法声明时,加入abstract关键字! 可行! 23 * 24 * 所有由abstract关键字修饰的方法我们称之为 抽象方法! 25 * 抽象方法只能存在于 抽象类中! 26 * 27 * 又报错了?? 28 * 001.删除abstract关键字 ! 不可行! 29 * 002.在类上加入abstract关键字 30 * 31 * 所有由abstract关键字修饰的类我们称之为 抽象类! 32 * 33 */ 34 public abstract void eat(); 35 36 public int getAge() { 37 return age; 38 } 39 40 public void setAge(int age) { 41 this.age = age; 42 } 43 44 public String getName() { 45 return name; 46 } 47 48 public void setName(String name) { 49 this.name = name; 50 } 51 52 public Animal() { 53 super(); 54 } 55 56 public Animal(int age, String name) { 57 super(); 58 this.age = age; 59 this.name = name; 60 } 61 62 @Override 63 public String toString() { 64 return "Animal [age=" + age + ", name=" + name + "]"; 65 } 66 67 }
1 /** 2 * 因为cat不是抽象类,所以必须实现父类中所有的抽象方法 3 */ 4 public class Cat extends Animal { 5 6 @Override 7 public void eat() { 8 System.out.println("小猫咪在吃鱼!"); 9 } 10 11 }
1 /** 2 * 因为dog是抽象类 所以不需要 重写animal的抽象方法,也可以重写 3 */ 4 public abstract class Dog extends Animal { 5 6 }
1 public class AnimalTest { 2 3 public static void main(String[] args) { 4 // 创建小狗和小猫咪的实例 5 // Dog dog = new Dog(); 抽象类 不允许实例化 6 // 调用小狗吃东西的方法 7 // dog.eat(); 8 9 Cat cat = new Cat(); 10 // 调用小猫咪吃东西的方法 11 cat.eat(); 12 13 } 14 }