欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java学习 java -,

来源: javaer 分享于  点击 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("独霸天下");
}
}

相关文章

    暂无相关文章
相关栏目:

用户点评