Java学习 java -,
分享于 点击 19444 次 点评:64
Java学习 java -,
多态:一种事物的多种形态
多态的规则(前提):
1.类与类之间要建立关系,建立继承的关系
2.必须要有方法的重写
3.父类的指针(引用) 指向子类的对象(空间)
public static void main(string[] args){
Cat cat = new Cat();
cat.eat();
Animal a = new Cat();
a.eat();
Animal aDog = new Dog();
aDog.eat();
}
class Animal{
public void eat(){
system.out.println("吃饭");
}
}
class Cat extends Animal{
public void eat(){
system.out.println("猫吃鱼");
}
}
class Dog extends Animal{
public void eat(){
system.out.println("狗吃肉");
}
}
猫是一只动物 而不是动物是一只猫 这样逻辑是不通的 在这里动物是父类 猫狗是子类 猫狗是一只动物就相当于父类指向了子类的对象
多态时如何调用成员变量
多态时 当父类引用调用成员变量时
编译 需要看父类中有没有这个成员变量,没有编译不通过
运行 访问就是父类中的这个成员变量
结论:
多态时 访问成员变量 访问父类 访问成员变量 编译 和 运行 (看父类)
多态调用成员变量时
编译看父类 运行看子类
public static void main(string[] args){
Father f = new Son();
f.speak();
system.out.println(f.num);
}
class Father{
int num = 10;
public void speak(){
system.out.println("Father 说");
}
}
class Son{
int num = 20;
public void speak(){
system.out.println("Son 说");
}
}
打印结果
多态时父类指向子类的对象在内存中的表现
那 现在在main函数中加上
Son s = new Son();
s.speak();
System.out.println(s.num);
打印结果是son说 20; 这个在内存中的表现
多态的好处
1.怎抢了代码的可维护性(建立在继承上)
2.增强方法的可扩展性(核心)
多态的弊端:
不能直接调用子类的特殊(不是重写父类的)方法
如果调用子类的特殊方法,需要将父类强转位子类的对象,然后对象点方法 调用子类的特殊方法
public static void main(string[] args){
Person p = new Cheat();
p.speak();
Cheat ct = (Cheat)p;// 强制转换成子类
}
class Person{
pubic void speak(){
system.out.println("聊天");
}
}
class Cheat extends Person{
public void speak(){
system.out.println("洗脑");
}
public void puch(){
system.out.println("打人")
}
}
在多态时 子类非常多的情况下 父类调用子类的方法时 可以封装一个方法 参数是父类的对象 在传参的时候匿名创建new Dao 相当于 WuQi w = new Dao();——父类指向子类的对象 进行调用 我们想调用子类的特殊方法 这里需要用一个 instanceof 关键字 这个关键字 是判断 前面的对象是否属于 后面的 实例
public static void main(string[] args){
fun(new Jian());
fun(new Dao());
}
public static void fun(WuQi w){
w.puch();
if(w instanceof Dao){
Dao dao = (Dao)w;
dao.liangdao();
}else if(w instanceof Jian){
Jian jian = (Jian)w
jian.liangjian();
}
}
class WuQi{
public void puch(){
system.out.println("打人");
}
}
class Jian extends WuQi{
pubilc void puch(){
system.out.println("砍人");
}
public void liangjian(){
system.out.println("独孤九剑");
}
}
class Dao extends WuQi{
public void puch(){
system.out.println("刺人");
}
public void liangdao(){
system.out.println("独霸天下");
}
}
相关文章
- 暂无相关文章
用户点评