当前位置: 首页 > news >正文

Java 修饰符和多态

文章目录

    • 一、修饰符
      • 1. 权限修饰符
      • 2. 状态修饰符
        • 2.1 final
        • 2.2 static
    • 二、多态
      • 1. 成员访问特点
      • 2. 多态中的转型
      • 3. 多态案例

一、修饰符

1. 权限修饰符

在这里插入图片描述

2. 状态修饰符

2.1 final

final 关键字是最终的意思,可以修饰成员方法、成员变量及类。

//1.修饰成员变量
public final int age = 20; //age的值不允许再改变
//2.修饰成员方法
public final void method() {} //该方法不允许被重写
//3.修饰类
public final class Father {} //该类不允许被继承

final 修饰的特点:
① 修饰方法,表明该方法是最终方法,不能被重写;
② 修饰变量,表明该变量是常量,不能再次被赋值;
③ 修饰类,表明该类是最终类,不能被继承。

final 修饰的是基本类型的变量时,变量的数据值不能发生改变,当 final 修饰引用类型的变量时,变量的地址值不能发生改变,但地址里面的内容是可以改变的!

2.2 static

static 关键字是静态的意思,可以修饰成员方法和成员变量。

//Student.java
public static String university;
//Test.java
Student.university = "太原理工大学"; //直接通过类名为所有对象的公共部分赋值

static 修饰的特点:
① 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件;
② 被 static 修饰的变量和方法,可以通过对象名调用,也可以直接通过类名来调用,推荐使用类名调用。

静态成员方法只能访问静态成员,即 static 只能访问 static!

二、多态

多态,同一个对象在不同时刻表现出来的不同形态。

举例:
我们可以说米是米,米 rice = new 米();
我们也可以说米是粮食,粮食 food = new 米();
这里米在不同的时刻就表现出来了不同的形态,这就是多态。

多态的前提和体现:
① 有继承或者实现关系;
② 有方法重写;
③ 有父类引用指向子类对象。

1. 成员访问特点

Animal a = new cat();
System.out.println(a.age);
System.out.println(a.eat());

(1)Cat 类继承 Animal 类,不管是访问 a 的成员变量还是成员方法,程序都会先去 Animal 里面找,如果找不到该变量或方法,程序直接报错,即编译看左边

(2)如果我们访问的是成员变量 a.age,同时在 Animal 类中也找到该变量时,我们所访问到的 age 也正是 Animal 中的 age,即访问成员变量执行看左边

(3)如果我们访问的是成员方法 a.eat(),同时在 Animal 类中也找到该方法时,我们此时访问到的 eat() 应是 Cat 类中重写父类方法的 eat(),即访问成员方法执行看右边

2. 多态中的转型

① 多态的好处:提高了程序的扩展性,定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作;
② 多态的弊端,不能使用子类特有的功能,因为编译看左边,当多态访问成员变量或方法的时候,都是先去父类中寻找的,而父类中当然没有子类特有的功能,当它找不到的时候编译就会报错。

针对多态的弊端,有什么解决办法呢?
多态转型分为向上转型和向下转型,向上转型即父类引用指向子类对象,向下转型是父类引用转为子类对象。
我们通过向下转型的方法解决不能使用子类特有功能的问题。

Animal a;
//向下转型
a = new Cat();
Cat c = (Cat)a;
c.playGame();
//向上转型
a = new Dog();
a.eat();

3. 多态案例

//Animal.javapackage com.zxe;public class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat() {System.out.println("动物吃东西!");}
}
//Cat.javapackage com.zxe;public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫爱吃鱼!");}public void call() {System.out.println("喵喵喵~");}
}
//Dog.javapackage com.zxe;public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗爱吃骨头!");}
}
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {//这里仅以Cat为例,Dog同理Animal a = new Cat();a.setName("加菲猫");a.setAge(5);System.out.println(a.getName() + ", " + a.getAge());a.eat();//想要用Cat的特有方法,向下转型即可Cat c = (Cat) a;c.call();}
}

在这里插入图片描述

http://www.lryc.cn/news/20087.html

相关文章:

  • 学了一年Java的我,想转嵌入式了
  • 【Git】Git冲突与解决方法
  • 深度剖析数据在内存的存储
  • 身高排序(绝对值大的排后面,小的排前面)
  • 高频前端面试题之HTML篇(三)
  • 使用DG备份恢复测试库的流程以及可能出现的问题
  • Springboot注释解析
  • C语言之通讯录(动态 存储文件版)
  • Linux 工具
  • Java知识复习(七)常见的设计模式(装饰、代理、观察、策略、建造)
  • Linux系统看门狗应用编程
  • Spring MVC 源码- LocaleResolver 组件
  • Servlet
  • 简单的周总结
  • Elasticsearch7.8.0版本进阶——IK中文分词器
  • 一个阿里P6的说不会接口自动化测试,他不会是自己评的吧...
  • 规则引擎与风控系统04:风控系统实例(下)
  • 我为什么选择Linux mint 21.1 “Vera“ ? Mint安装优化调教指南(分辨率DPI)
  • 雅思经验(十四)
  • 刚来的薪资20k,是我的2倍,我是真的卷不过,真的太变态了
  • 五、DeepWalk、Node2Vec论文精读与代码实战【CS224W】(Datawhale组队学习)
  • 学习 Python 之 Pygame 开发魂斗罗(四)
  • Linux 基础知识:指令与shell
  • 【数通网络交换基础梳理1】二层交换机、以太网帧、MAC地址数据帧转发原理详解
  • 《分布式技术原理与算法解析》学习笔记Day22
  • [MySQL]MySQL数据类型
  • 利用steam搬砖信息差赚钱,单账号200+,小白也能轻松上手!
  • 树与二叉树与森林的相关性质
  • MySQL面试题
  • 【蓝桥OJ—C语言】高斯日记、马虎的算式、第39级台阶