面向对象程序基础九

来源:互联网 发布:修改数据库字段备注 编辑:程序博客网 时间:2024/05/22 06:08

 

对象的多态性:
子类对象与父类对象之间的转换
1、 子类对象向父类对象转换(向上转型)
自动转型(父类对象子类对象)
2、 父类对象向子类对象转换(向下转型)
强制转型(子类对象(子类)父类对象)
多态性:
1、 方法的多态性(重载):同一个方法名称根据传入参数的不同,完成的功能不同
2、 对象的多态性
 
面向对象程序开发的一个思路:[建议]永远不去继承一个普通类
 
对象多态性是在继承应用上的一种扩展,所以程序要先有继承关系才能够去使用多态性
class A
{
public void fun1()
{
        System.out.println("1、 A ----public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
public void fun1()
{
        System.out.println("2 B ----public void fun2()");
}
public void fun3()
{
        System.out.println("3、 B ----public void fun3()");
}
}
 
public class javaoo04
{
public static void main(String []args)
{
        B b = new B();
        b.fun2();
        b.fun3();
}
}
 
2、 B ----public void fun2()
3、 B ----public void fun3()
 
 
如果一个方法被子类覆写了,则子类与父类之间发生转换时,自动去调用已经补覆写过的方法(子类中的方法)。
class A
{
public void fun1()
{
        System.out.println("1、 A ----public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
//覆写了fun1()方法
public void fun1()
{
        System.out.println("2、 B ----public void fun1()");
}
//增加了一个fun3()方法
public void fun3()
{
        System.out.println("3、 B ----public void fun3()");
}
}
 
public class javaoo04
{
public static void main(String []args)
{
 
        A a = null;
        a = new B();
        //A a = new B(); //子类对象为父类实例化
         B b = (B)a; 
        a.fun2(); //fun1()中的方法被覆写了。
        //a.fun3(); //javaoo04.java:74: 找不到符号
        b.fun2();
}
}
2 B ----public void fun1()
2 B ----public void fun1()
 
class A
{
public void fun1()
{
        System.out.println("1、A----public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
public void fun1()
{
        System.out.println("2、B----public void fun3()");
}
}
 
public class javaoo04
{
public static void main(String []args)
{
        A a = new A();
        a.fun2();
        B b = (B)a; //Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B at javaoo04.main(javaoo04.java:107)
 
 
}
}
 
 
class A
{
public void fun1()
{
        System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
public void fun1()
{
        System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
        System.out.println("3、B ---public void fun3()");
}
}
 
public class javaoo04
{
public static void main(String []args)
{
        //一个print方法,此方法可以接收A和B类的对象,并调用方法打印
        //如果是A类对象,则调用fun2()方法
        //如果是B类对象,则调用fun2()和fun3()两个方法
        print(new B());
               //如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
        a.fun2();
}
public static void print(B b)
{
        b.fun2();
        b.fun3();
}
}
 
//2、B ---public void fun1()
//3、B ---public void fun3()
 
 
 
 
class A
{
public void fun1()
{
        System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
public void fun1()
{
        System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
        System.out.println("3、B ---public void fun3()");
}
}
 
 
public class javaoo04
{
public static void main(String []args)
{
        //一个print方法,此方法可以接收A和B类的对象,并调用方法打印
        //如果是A类对象,则调用fun2()方法
        //如果是B类对象,则调用fun2()和fun3()两个方法
        print(new B());
               //如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
        a.fun2();
        B b = (B)a;
        b.fun3();
}
public static void print(B b)
{
        b.fun2();
        b.fun3();
}    
}
 
 
//2、B ---public void fun1()
//3、B ---public void fun3()
 
 
class A
{
public void fun1()
{
        System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
        this.fun1();
}
}
 
class B extends A
{
public void fun1()
{
        System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
        System.out.println("3、B ---public void fun3()");
}
}
 
class C extends A
{
public void fun1()
{
        System.out.println("4、B---public void fun1()");
}
public void fun4()
{
        System.out.println("5、B---public void fun4()");
}
}
 
public class javaoo04
{
public static void main(String []args)
{
        //一个print方法,此方法可以接收A和B类的对象,并调用方法打印
        //如果是A类对象,则调用fun2()方法
        //如果是B类对象,则调用fun2()和fun3()两个方法
        print(new A());
               //如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
        a.fun2();
        //缺少一个对象是否是某一个类的实例的判断
        B b = (B)a;
        b.fun3();
}
public static void print(B b)
{
        b.fun2();
        b.fun3();
}    
}
 
//javaoo04.java:278: 需要为 class、interface 或 enum
 
 
 
两个常见的错误:
ClassCastException(两个对象之间没有任何关系而进行转换)
NullPointerException
 
       Instanceof 关键字
       作用: 1、对象instanceof 类
              Eg:如果对象a 是类B的例则返回true .反之则返回flase
class A
{
}
class B extends A
{
}
public class javaoo04
{
       public static void main(String []args)
       {
              A a = new A();
              System.out.println(a instanceof A); //trie
              System.out.println(a instanceof B); //false
       }
}
 
 
 
 
对象多态性最核心的部分就是方法的覆写与继承的关系,只要有继承关系,只要有覆写过的方法,则子类向父类进行转型时,肯定调用被子类覆写过的方法(核心)。
class A
{
       public void fun1()
       {
              System.out.println("1、A --- public void fun1()");
       }
       public void fun2()
       {
              this.fun1();
       }
}
 
class B extends A
{
       public void fun1()
       {
              System.out.println("2、B --- public void fun1()");
       }
       public void fun3()
       {
              System.out.println("3、B --- public void fun3()");
       }
}
 
class C extends A
{
       public void fun1()
       {
              System.out.println("4、C --- pubic void fun1()");
       }
       public void fun4()
       {
              System.out.println("5、C --- public void fun4()");
       }
}
 
public class javaoo04
{
       public static void main(String []args)
       {
              print(new B());
       }
       public static void print(A a)
       {
              a.fun2();
              if (a instanceof B)
              {
                     B b = (B)a;
                     b.fun3();
              }
              if (a instanceof C)
              {
                     C c = (C)a;
                     c.fun4();
              }
       }
}
 
接口与抽象类的实际应用(基础类、封装、继承、覆写、多态性)
 
原创粉丝点击