java第四天

多态:
前提:1、要有继承关系。2、要有方法重写。3、要有父类引用指向子类对象。
子类对象在堆区存储时会分配一个空间存储父类(super)的成员

class Test{
    public static void main(String[] args){
        Animal c = new Cat();
        c.eat();//cat eat fish!
        System.out.println(c.num)//10
    }
}
class Animal{
    int num = 10;
    void eat(){
    System.out.println("animal eat food!");
    }
}
class Cat extends Animal{
    int num = 20;
    void eat(){
    System.out.println("cat eat fish!");
    }
}

成员变量:编译看左边(父类),运行看左边(父类)
成员方法:编译看左边(父类),运行看右边(子类)(动态绑定)
静态方法:便一看左边(父类),运行看左边(父类)因为所属于类
向上转型:父类引用指向子类对象就是向上转型,只能访问子类中super部分,无法调用子类特有方法。
向下转型:将父类引用转型为子类对象方法为:(子类)对象名。依然指向同一个地址但能访问所有子类内容

class Polymorphic{
    public static void main(String[] args){
        ClassA b = new ClassB();
        ClassB c = new ClassC();
        b.show();//this is B's show2()
        c.show();//this is C's show2()
    }
}
class ClassA{
    void show(){
        show2();
    }
    void show2(){
        System.out.println("this is A's show2()");
    }
}
class ClassB extends ClassA{
    void show2(){
        System.out.println("this is B's show2()");
    }
}
class ClassC extends ClassB{
    void show(){
        super.show();
    }
    void show2(){
        System.out.println("this is C's show2()");
        }
}

抽象类和抽象方法必须用abstract修饰,有抽象方法的类一定是抽象类或者是接口,但抽象类不一定有抽象方法
抽象类是不能被实例化的,只能通过他的子类实例化,抽象类的子类要么是抽象类,要么重写所有抽象方法。
抽象类的成员变量既可以是变量,也可以是常量。abstract不能修饰成员变量。
abstract不能与static、final、private同时存在

abstract class Animal{
    public abstract void eat();
}
class A extends Animal{
    public void eat(){
        System.out.println("A eat sth");
    }
}
class Abstract{
    public static void main(String[] args){
        Animal a = new A();
        a.eat();//A eat sth
    }
}

接口(interface)关键字为interface。
类实现接口用implements表示。
接口不能实例化,接口的子类可以是抽象类(意义不大),可以是具体类重写所有抽象方法。
接口中的变量都是常量 ,默认都是public static final。 建议手动给出
接口中没有构造方法。
接口中不能有非抽象方法。其中方法是公共的,需要加上public abstract。(系统会默认加上)

interface Inter{
    int num = 10;//系统默认加上public static final
    //public void show(){}//错误,必须是抽象方法
    public void eat(){}//正确,系统默认加上public abstract
}

类与接口是实现关系,可以单实现也可以多实现
接口与接口是继承关系,可以单继承也可以多继承
接口编译后也是.class

猜你喜欢

转载自blog.csdn.net/qq_41584674/article/details/81489149