0
点赞
收藏
分享

微信扫一扫

多态及static

静守幸福 2022-04-14 阅读 94

一.多态的概述及其使用

1.继承与重写、父类引用指向子类对象是触发多态的三大前提
2.多态是同一种事物表现出的多种形态
3.多态的好处:(下文会举例说明)

  • 提高了代码的使用效率
  • 提高了代码的可扩充性
  • 将代码化繁为简

class Animal{
    public void eat(){
        System.out.println("what");
    }
    public void sleep(){
        System.out.println("how");
    }
}

class Dog extends Animal{
    public void eat(){ System.out.println("狗吃骨头");}
    public void sleep(){System.out.println("狗睁着眼睛睡觉");}
}

class Cat extends Animal{
    public void eat(){ System.out.println("猫吃狗");}
    public void sleep(){System.out.println("猫不睡觉");}
    public void special(){        //父类无法继承子类方法
        System.out.println("很可爱,有主宰铲屎官的能力");
    }
}

public class Duotai{
    public static void main(String[] args){
        Animal heihei=new Cat();  //触发多态机制
        Animal lala=new Dog();
        nani(heihei);
        nani(lala);
        Cat z=(Cat)heihei;
        z.special();
    }

    public static void nani(Animal obj){
        obj.sleep();
        obj.eat();
    }
    /*如果nani()的参数不是Animal类型,那要产生相同效果代码如下
    public static void nani(Cat obj){
        obj.sleep();
        obj.eat(); }

        public static void nani(Dog obj){  //当对象过多时很明显以Animal为类型的简便的多
        obj.sleep();
        obj.eat(); }
    */
}
}

4.多态的弊端:

  • 不能使用子类特有功能
  • 解决方案:
    A.创建子类对象调用方法
    B.把父类的引用强制转化为子类的引用(向下转型)

二.final的概述及其应用

  1. 当final修饰一个类时,该类不能被继承也不能被重写
  2. final(最终的),为常量声明,只能付一次值,赋值后其值不能在改变
  3. final赋值初始化有两种方式:
  • 变量声明时赋值
  • 成员变量声明时不赋值,但要在这个类的所有构造函数中对此变量赋值,局部变量声明时只需在该方法内部对其进行赋值
  1. final对引用类型修饰时,只是限定了其引用变量的引用不可改变,但其引用对象的值是可以变得
public class FinalTest {
    final int f1=10;
    /*f1=20; 报错,因为final只能赋一次值*/
    final int f2;
    public FinalTest(){
        f2=2;
    }

    public static void main(String[] args) {
        final double f3;
        f3=0.3;
        Value f4=new Value(3) //final对引用类型
        f4.v=5;
    }
 }

 class Value{
    int v;
    public Value(int v){this.v=v;
        System.out.println("输出f4对象的第一次值"+v);
    }
 }

三.static的应用

  1. 同类类加载时先执行static初始化,创建对象(new)时进行成员变量初始化,在进行构造方法初始化
  2. 父类往往比子类更先完成类加载
  3. 由static修饰的变量放在静态储存区
public class Demo_6541 {
    static Demo_6541_Book b1;
    static Demo_6541_Book b2;
    
    Demo_6541_Book b3 = new Demo_6541_Book("chushihua b3");
    Demo_6541_Book b4 = new Demo_6541_Book("chushihua b4");

    static {
        b1 = new Demo_6541_Book("chushihau b1");
        b2 = new Demo_6541_Book("chushihua b2");
    }

    public static void heihei() {
        System.out.println("hei hei bei diao yong");
    }

    public static void main(String[] args) {
        heihei();//调用方法会对 Demo_6541进行类加载,执行static
        new Demo_6541();//创建对象(new)时进行成员变量初始化,在进行构造方法初始化
    }
}

class Demo_6541_Book {
    public Demo_6541_Book(String BookName) {
        System.out.println(BookName);
    }
}
输出结果:

chushihau b1
chushihua b2
hei hei bei diao yong
chushihua b3
chushihua b4

进程已结束,退出代码为 0

符合预期。

举报

相关推荐

0 条评论