Java面向对象(五)


Java面向对象(五)

1.多态

概括:多态指不同类的对象在调用同一个方法时所呈现出的多种不同行为。通过多态消除了类之间的耦合关系,提高了程序的可拓展性和可维护性。Java的多态性是由类的继承、方法重写以及父类引用指向子类对象体现的。

举例:

abstract class Animal6{
    abstract void shout();
}

class Cat6 extends Animal6{
    public void shout(){
        System.out.println("喵喵~");
    }
}

class Dog6 extends Animal6{
    public void shout(){
        System.out.println("汪汪...");
    }
}

public class Page121 {
    public static void main(String[] args) {
        Animal6 an1=new Cat6();
        Animal6 an2=new Dog6();
        an1.shout();
        an2.shout();
    }
}

2.对象的类型转换

概括:多态中涉及将子类对象当作父类类型使用的情况,在Java语言中称为“向上转型”。

 Animal an1=new Cat();	//将Cat类对象当作Animal类型来使用
 Animal an2=new Dog();	//将Dog类对象当作Animal类型来使用

注意:此时不能通过父类变量去调用子类中特有的方法

举例:

  • 以下代码是错误的

    interface Animal7{
        void shout();
    }
    
    class Cat7 implements Animal7{
        public void shout(){
            System.out.println("喵喵~");
        }
        public void catchMouse(){
            System.out.println("抓老鼠");
        }
    }
    
    public class Page122 {
        public static void main(String[] args) {
            Animal7 an1=new Cat7();
            an1.shout();
            an1.catchMouse();	//子类特有方法
        }
    }
    
  • 但如果把主函数这样改就没问题了

    Animal7 an1=new Cat7();
    Cat7 cat=(Cat7)an1;
    cat.shout();
    cat.catchMouse();
    
  • 在向下转型时必须转换为本质类型,否则会出错,如下:

    interface Animal7{
        void shout();
    }
    
    class Cat7 implements Animal7{
        public void shout(){
            System.out.println("喵喵~");
        }
        public void catchMouse(){
            System.out.println("抓老鼠");
        }
    }
    
    class Dog7 implements Animal7{
        public void shout(){
            System.out.println("汪汪...");
        }
    }
    
    public class Page122 {
        public static void main(String[] args) {
            Animal7 an1=new Dog7();
            Cat7 cat=(Cat7)an1;
    		cat.shout();
    		cat.catchMouse();
        }
    }
    
  • 为避免上面这种情况,Java提供了关键字instanceof,它可以判断一个对象是否为某个类(或接口)的实例或者子类实例

    Animal7 an1=new Dog7();
    if(an1 instanceof Cat7){
        Cat7 cat=(Cat)an1;
        cat.shout();
        cat.catchMouse();
    }else{
        System.out.println("该类型的对象不是Cat类型")
    }
    

3.内部类

类中也可以定义类

举例:

class Outer{
    int m=0;
    void test1(){
        System.out.println("外部类成员方法");
    }
    class Inner{
        int n=1;
        void show1(){
            System.out.println(m);
            test1();
        }
        void show2(){
            System.out.println("内部类成员方法");
        }
    }
    void test2(){
        Inner inner=new Inner();
        System.out.println(inner.n);
        inner.show2();
    }
}

public class Page126 {
    public static void main(String[] args) {
        Outer outer=new Outer();
        Outer.Inner inter=outer.new Inner();
        inter.show1();
        outer.test2();
    }
}

注意:

  • 类也可以定义在某方法中,称为局部类
  • 静态内部类中只能访问外部类中的静态成员

匿名内部类直接上例子:

interface Animal{
    void shout();
}
public class test{
    public static void main(String[] args){
        String name="小花";
        animalShout(new Animal(){
            public void shout(){
                System.out.println(name+"喵喵~");
            }
        });
    }
}
public static void animalShout(Animal an){
    an.shout();
}