2.继承关系中构造方法的执行顺序
4.抽象类
1.抽象类和抽象方法的特点
(1)抽象类和抽象分都通过abstract关键字来修饰。
(2)抽象类不能实例化。抽象类中可以没有、有一个或者多个抽象方法,甚至全部都可以是抽象方法。
(3)抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重新所有抽象方法才能实例化,否则子类还是一个抽象类。
抽象类:public abstract class Pet {
}
//抽象方法 //属性
问题:抽象类可有构造方法吗?
解答:抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是有private修饰,也可以被本类的子类中类构造方法调用。
5.Final 修饰符 1.Final 的应用
(1)、用final 修饰类,不能再被继承,如以下代码所示。
Final class penguin{
Class SubPenguin extends Penguin{//此行出现错误
} }
(2)、用final修饰符的方法不能被子类重写,如: Class penguin{
Public final void print(){} }
提示错误:The type SubPenguin cannot subclass the final class,即Penguin类不能被继承。
Class SubPenguin extends Penguin{
Public void print(){}//此行出现错误 }
提示错误:cannot override the final method from Penguin ,即print()方法不能被子类重写。 (3)、用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次,如:
Public class penguin{
Final String home=”南极”; //居住地 Public void setHome(String name){
This.home=home; //错误,home不可以再次赋值 } }
提示错误:The final filed Penguin.home cannot be assigned,即不可以再次赋值。
2.final和abstract的区别
? final 和abstract是功能相反的两个关键字,可以对比记忆。 ? abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。 Final可以用来修饰类、方法和属性,不能修饰构造方法。
? Java 提供的很多类都是final类,如String 类、Math类,它们不能再有
子类。Object类中一些方法,如getClass()、notify()、wait()都是final方法,只能被继承而不能被重写,但是hashCode()、toString()、equals(Object obj)不是final方法,可以重写。
使用final修饰引用型变量时,变量的值时固定不变的,而变量所指向的对象属性值时可变的。
(2)abstract是否可以和private、static、final共用? (1) abstract不能和private同时修饰一个方法。 (2) abstract不能和static同时修饰一个方法。 (3) abstract不能和final同时修饰一个方法或类。
第三章、多态
1.什么是多态
多态(polymorphism)是具有多种形态的能力的特征。(同一个实现接口,使用不同的实例执行不同的操作。)(其核心是重写,核心机制是动态绑定) 子类到父类的转型(向上转型)
在引用数据类型的子类和父类之间也存在着转换问题,
Dog dog=new Dog(“欧欧”,”雪丽娜”); //不涉及类型转换 Dog.eat();
Pet pet=new Dog(“欧欧”,”雪丽娜”); //子类到父类的转换
Pet.eat(); //会调用dog类重写eat()方法,而不是Pet类的eat()方法 Pet.catchingFlyDisc(); //编译错误,父类的引用无法调用类特有的方法
? 将一个父类的引用指向一个子类对象,称为向上转型(upcasting),自动进行类型转换。 ? 此时通过父类引用变量调用的方法是子类覆盖或继承的方法,不是父类的方法。 ? 此时通过父类引用变量无法调用子类特有的方法。
2.使用父类作为方法形参实现多态
是Java中实现和使用多态的主要方法之一。
/*
* 主人给Dog喂食 */
public void feed (Dog dog){ dog.eat(); } /**
* 主人给Penguin喂食 */
public void feed(Penguin pgn){ pgn.eat(); }
多态的明显优势:可以减少代码量,提高代码的可扩展性和可维护性。
3.使用父类作为方法返回值实现多态
是Java中实现和使用多态的另一种方式。
public class Master {
private String name =\; //主人名字 private int money=0; //元宝数 public Master(String name ,int money){ this.name=name; this.money=money; }
public void feed(Pet pet){ pet.eat(); }
public Pet getPet(int typeId){ Pet pet=null; if(typeId==1){
pet=new Dog(\欧欧\,\雪娜瑞\); }else if(typeId==2) {
pet=new Penguin(\楠楠\,\妹\); }
return pet; }
1.总结:
? 继承的存在(继承是多态的基础,没有继承就没有多态)。 ? 子类重写父类的方法(多态下调用子类重写后的方法)。 ? 父类引用变量指向子类对象(子类到父类的类型转换)。
4.父类到子类的转换(向下转型)
父类到子的转换。同时,会使用instanceof运算符来判断对象的类型。 将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。
调用不同的宠物子类对象的特有方法,在预编译阶段,虚拟机对引用采用静态绑定,没有办法动态获取到子类中特有的方法。
public class Test {//
public static void main(String[] args) { Pet pet =new Dog(\欧欧\,\雪娜瑞\); //Pet pet=new Penguin(\楠楠\妹\ pet.eat();
//pet.catchingFlyDisc();//编译错误,无法调用子类特有的方法 if(pet instanceof Dog){
Dog dog=(Dog) pet; //强制类型转换成狗对象
相关推荐: