- 面向对象的特征之三:多态
- 多态机制是面向对象程序设计的一个重要特征
- 多态的特点是采用同名的方式,根据调用方法时传送的参数的多少以及传送参数类型的不同,调用不同的方法,这样对于类的编制而言,可以采用同样的方法获得不同的行为特征
- 多态性可以分为编译时多态和运行时多态
-
编译时多态:表现为方法名相同参数列表不同(重载) 运行时多态(对象的多态性):程序运行的时候判断到底是哪个类(父类还是 子类的),这其实就是子类对象和父类对象的相互转化关系 向上转型 父类 父类对象 = new 子类的实例 自动完成 向下转型 子类 子类对象 = (子类)父类的实例 强制完成 - 如何实现多态
-
1.子类继承父类
2.子类重写父类的方法
3.编写方法时,使用父类作为形参类型
4.将子类的对象作为实参传递给该方法
5.运行时,根据实际创建的对象类型动态决定使用哪个方法
实现多态的三个条件:
1.要有重写
2.要有继承
3.父类的引用指向子类的对象(实例)
多态的应用:
public class TestPoly03{
public static void main(String[] args){
Breeder b=new Breeder(); Animal animal=new Animal();
Cat cat=new Cat();
Dog dog=new Dog();
Elephants elephants=new Elephants();
Food food=new Food();
Fish fish=new Fish();
Meat meat=new Meat();
Banana banana=new Banana();
b.feed(animal,food);
b.feed(cat,fish);
b.feed(dog,meat);
b.feed(elephants,banana);
}
}
class Breeder{
public void feed(Animal animal,Food food){
animal.eat(food); }
}
class Animal{
public void eat(Food food){
System.out.println("动物吃"+food.getFood()); }
}
class Cat extends Animal{
public void eat(Food food){
System.out.println("猫吃"+food.getFood()); }
}
class Dog extends Animal{
public void eat(Food food){
System.out.println("狗吃"+food.getFood()); }
}
class Elephants extends Animal{
public void eat(Food food){
System.out.println("大象吃"+food.getFood()); }
}
class Food{
public String getFood(){
return "食物"; }
}
class Fish extends Food{
public String getFood(){
return "鱼"; }
}
class Meat extends Food{
public String getFood(){
return "肉"; }
}
class Banana extends Food{
public String getFood(){
return "香蕉"; }
}
- “==”与Object类的equals方法
-
1.等号可以比较基本类型和引用类型,等号比较的是值,特别是比较引用类型,比较的是引用的内存地址。
2.equals比较两个对象是否相等
- Object类的toString方法
-
1.Object类的toString方法返回的是对象的
名称@哈希码 2.String类的toString方法返回的是自身
3.基本数据类型的包装类的toString方法返回的是自身
4.数组和集合的toString方法返回的是自身的值
- 内部类
-
实例内部类:
1.创建实例内部类,外部类的实例必须已经创建
2.实例内部类会持有外部类的引用
3.实例内部不能定义static成员,使能定义实例成员
静态内部类:
1.静态内部类不会持有外部的类的引用,创建时可以不用创建外部类
2.静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
局部内部类:
1.局部内部类是在方法中定义的,它只能在当前方法中使用。和局部变量的作用一样
2.局部内部类和实例内部类一致,不能包含静态成员
匿名内部类:
十一种特殊的内部类,没有名字
- 访问权限修饰符:
-
public:任何类都能访问
protected:本类
同包 子类可访问 default:同包 本类可访问
private:只能本类访问