你知道【final ,static,多态】吗?超详细总结

一、final

final修饰符,用来修饰

  • 类: 修饰类,类不被继承
  • 属性/变量: 修饰变量,变量不能被修改
  • 方法: 修饰方法,方法不能被重写

1.1 final修饰类: 类不能被继承,即不能有子类

在这里插入图片描述

1.2 final修饰方法: 子类不能重写,但是可以正常使用

在这里插入图片描述

1.3 final修饰属性/变量: 变量为常量,不能再改变

在这里插入图片描述

三、static

3.1 语法特征

static修饰符,主要是用来修饰

  • 属性
  • 方法

static修饰属性和方法的语法特点

  • static修饰的属性/方法随着类加载而在内存出现并初始化,而且是出现在内存的方法区
  • static修饰的属性/方法在内存中只有一份,所以被该类所有对象共享

image-20240528111755338

3.2 使用技巧

技巧1: 当某些属性/方法需要被共享使用时就加静态static, 比如售票的票数


public class Ticket {

    static int num = 100;

    public void sell(){
        System.out.println("售出一张票" );
        num--;
        System.out.println("还剩"+num+"张" );
    }

    public static void main(String[] args) {
        Ticket t1 = new Ticket( );
        Ticket t2 = new Ticket( );

        t1.sell();
        t2.sell();
    }

}

技巧2: 当某些属性和方法想要方便调用时,给加static

可以通过类名.方法() 类名.属性直接调用,不需要创建对象

  		int[] arr = {1,2,3,4};
        System.out.println(Arrays.toString(arr ) );
        System.out.println(Math.PI );

技巧3: 为了main方法方便调用时候,给方法加static

main方法是静态的,定义的方法也是静态的,静态调用静态可以直接调用,不用创建对象,

技巧4: 经常使用static 和final一起声明常量,称为静态常量

public static final int A = 1;

  • 常量的命名规范: 所有字母都大写! 多个单词直接使用_分开
    • public static final String ID_CARD = “41111111X”;
  • public static final三个顺序没有关系,只不过习惯是写这个顺序

3.3 注意事项

  • 静态可以调用静态,但是不能不调用非静态

    • 因为静态的随着类加载就在内存出现了
    • 其他属性和方法需要创建对象才会在内存出现
    • 即有静态属性和方法的时候,不一定有非静态的属性

  • 非静态可以调用静态,也可以调用非静态

    • 因为非静态方法/属性需要对象调用
    • 对象需要被类创建
    • 类需要被加载
    • 即非静态方法执行意味着,类已经加载且已经创建对象
public class TestStatic {
    static int x = 1; // 静态属性
    int y = 1; // 非静态属性
    // a是静态方法
    public static void a(){
        b();//静态调用静态方法
        System.out.println(x );//静态调用静态属性
        //c(); //静态不能调用非静态方法
        //System.out.println(y ); //静态不能调用非静态属性
    }

    // b是静态方法
    public static void b(){}

    // c是非静态方法
    public void c(){
        a(); // 非静态都可以调用
        System.out.println(x );
        System.out.println(y );
    }
}

四、多态[重点]

4.1 什么是多态

  • 生活中的多态: 多种状态/形态,变形金刚 ; 蝌蚪

  • 代码中的多态: 是指的类中的方法,具体是指方法执行出现多种状态

4.2 怎么实现多态

要想实现同一个方法执行出现不同的状态,即多态,需要满足三个前提条件

  • 1)继承/实现
  • 2)重写
  • 3)向上转型(子类对象赋值给父类引用/父类引用指向子类对象)

满足以上3个条件,再执行这个父对象的方法,执行出来的结果就会不一样

4.3 演示

// 父类

public class Animal {

    public void eat(){
        System.out.println("动物吃" );
    }

}

// 子类

public class Dog extends Animal {

    @Override
    public void eat() {
        System.out.println("狗吃骨头" );
    }
}

// 测试

  public static void main(String[] args) {
        // 向上转型(子类对象赋值给父类引用/父类引用指向子类对象)
        Animal animal = new Dog( );
        animal.eat();// 编译看父类,运行看子类
      // eat() 执行的是Dog类的方法
      
      // 多建一个Cat类,继承,重写,向上转型后,再调用eat()
   }

4.4 为什么要多态

  • 解/松耦合
  • 方便扩展代码

假设: 目前设计一个方法,这个方法运行可以展示狗类吃东西的状况,如下

 	public static void main(String[] args) {
        Dog dog = new Dog( );
        show(dog);
    }

    public static void show(Dog dog){
        dog.eat();
    }

后来,动物园又来一个动物,猫,需要一个方法来展示猫如何吃东西,如下

   public static void main(String[] args) {
        Dog dog = new Dog( );
        show(dog);
        Cat cat = new Cat( );
        show(cat);
    }

    public static void show(Dog dog){
        dog.eat();
    }
    public static void show(Cat cat){
        cat.eat();
    }
}

再后来,动物园陆陆续续来了其他动物,老虎,猪,狮子等等很多动物,都需要展示如何吃, 该怎么办?

以现在的情况,每次来一个动物要展示吃,就需要该代码单独创建一个方法…

此时,就会考虑,能不能设计代码,让代码能够适应任何动物来,都不需要改代码? --> 多态

   public static void main(String[] args) {
        Dog dog = new Dog( );
        show(dog);// 传参数,相当于给Animal赋值,即向上转型
        Cat cat = new Cat( );
        show(cat);
        show(new Pig());
    }
    // 设计方法的参数为父类类型,
    public static void show(Animal animal){
        animal.eat();// eat()会多态展示,运行看子类
    }

五、向上转型&向下转型

5.1 什么是向上转型

  • 例如:Animal父类,Dog是子类

  • 那么 Animal animal = new Dog(); 就是将子类对象赋值给父类引用,也就是子类对象向上转型变成了父类类型

为什么需要向上转型?

  • 是因为利用多态来实现代码的扩展性

向上转型后,有一个注意事项:

  • 转型后的父类对象,只能调用父类中有,或者是子父类中都有的,即子类中特有方法无法调用 —> 编译看父类,运行看子类

在这里插入图片描述

5.2 什么是向下转型

  • 向下转型就是将父类对象变为子类对象过程

  • 需要注意:需先向上转型后,再向下转型

在这里插入图片描述

-----------------------------------------------------------------------------------------------------------

在这里插入图片描述

为什么需要向下转型? 因为向上转型的父类,无法使用子类特有方法

  • 因为需要转回成自己的子类对象,来调用子类特有的方法

六、每日一练【多态的使用】

  • 创建三个类,组成一个继承树,表示游戏中的角色。
    描述如下:
    • 父类:Role。是所有职业的父类。
    • 属性:name,表示角色的名字。
    • 方法:public int attack(),
      • 该方法返回值为角色的攻击对敌人的伤害。
  • Role 有两个子类:
    • 1) 法师Magicer
    • 属性:魔法等级(范围为1 ~ 10)
    • 方法: public int attack(),
      • 该方法返回法师的攻击对敌人造成的伤害值。
      • 法师攻击伤害值为:魔法等级*魔法基本伤害值(固定为5)
    • 2) 战士Soldier
    • 属性:攻击伤害值
    • 方法: public int attack(),
      • 该方法返回战士的攻击对敌人造成的伤害值。
      • 战士的攻击伤害值为:其攻击伤害属性值
  • 注意:上述的三个类所有属性都应当作为私有,并提供相应的get/set 方法。
    再设计一个Team 类,表示一个组队。具有如下方法
    • 1) addMember,表示组队增加一个成员。注意:组队成员最多为6 人
      提示:应当利用一个数组属性,保存所有成员
    • 2) attackSum,表示组队所有成员进行攻击时,对敌人造成的总伤害值

参考UML类图

在这里插入图片描述

点这里获取参考代码


最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值