• 面向对象编程(高级部分)——类变量和类方法


    目录

    1. 类变量-提出问题

    2. 传统的方法来解决

    3. 类变量快速入门

    4. 类变量内存布局

    5. 什么是类变量

    6. 如何定义类变量

    7. 如何访问类变量

    8. 类变量使用注意事项和细节讨论

    9. 类方法基本介绍

    11. 类方法应用案例

    12. 类方法经典的使用场景

    13. 类方法使用注意事项和细节讨论

    14. 练习题


    1. 类变量-提出问题

    有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。

    2. 传统的方法来解决

    3. 类变量快速入门

    针对这样的问题我们可以这样写:

    1. public class ChildGame {
    2. public static void main(String[] args) {
    3. //定义一个变量 count,统计有多少个小孩加入游戏
    4. int count=0;
    5. Child child01 = new Child("白骨精");
    6. child01.join();
    7. count++;
    8. Child child02 = new Child("狐狸精");
    9. child02.join();
    10. count++;
    11. Child child03 = new Child("老鼠精");
    12. child03.join();
    13. count++;
    14. //==============
    15. System.out.println("共有"+count+"个小孩加入了游戏!");
    16. }
    17. }
    18. class Child{
    19. private String name;
    20. public Child(String name) {
    21. this.name = name;
    22. }
    23. public void join(){
    24. System.out.println(name+" 加入了游戏...");
    25. }
    26. }

    但是我们这样写会有什么问题?思路有了,代码也实现了,但是这样写带来的问题:

    对于这个问题最主要是:这个变量不属于所有对象

    这时候延伸出一个静态变量

    1. public class ChildGame {
    2. public static void main(String[] args) {
    3. //定义一个变量 count,统计有多少个小孩加入游戏
    4. int count=0;
    5. Child child01 = new Child("白骨精");
    6. child01.join();
    7. // count++;
    8. child01.count++;
    9. Child child02 = new Child("狐狸精");
    10. child02.join();
    11. // count++;
    12. child02.count++;
    13. Child child03 = new Child("老鼠精");
    14. child03.join();
    15. // count++;
    16. child03.count++;
    17. //==============
    18. //静态变量可以通过类名来访问
    19. System.out.println("共有"+ Child.count +"个小孩加入了游戏!");
    20. }
    21. }
    22. class Child{
    23. private String name;
    24. //定义一个变量count,是一个类变量(静态变量)-->static
    25. //该变量的最大特点就是会被Child类的所有对象实例共享
    26. public static int count = 0;
    27. public Child(String name) {
    28. this.name = name;
    29. }
    30. public void join(){
    31. System.out.println(name+" 加入了游戏...");
    32. }
    33. }


    4. 类变量内存布局

    从图中可以直观感受:两个对象共享的一个数据,存放count的这个空间是个堆空间。

    静态变量是被所有对象实例共享的


    在JDK 8之前,这个count静态变量是在方法区里的静态域,JDK 8或者之后,是放在堆里面的,通过反射机制,会加载一个class对象。

    当类进行加载的时候,会在堆生成的class对象,通过这个对象可以拿到很多类的信息。

    也就是说在JDK 8以后,通常的认为静态变量在堆里面的这个类对应的Class对象的最后。

    在面试的时候说清楚这一点就行了。不管是在堆还是静态域,这里不会影响我们对静态变量的使用。

    静态变量的核心是:1.被所有对象共享的。2.在类加载的时候就生成。


    5. 什么是类变量


    6. 如何定义类变量


    7. 如何访问类变量

    1. public class VisitStatic {
    2. public static void main(String[] args) {
    3. //类名.类变量名
    4. //说明:类变量是随着类加载而创建的,所以即使没有创建对象实例,也可以访问。
    5. System.out.println(A.name); //输出:GodAiro
    6. A a = new A();
    7. //通过对象名.类变量名
    8. System.out.println("a.name="+a.name); //输出:a.name=GodAiro
    9. }
    10. }
    11. class A{
    12. //类变量
    13. public static String name = "GodAiro";
    14. }

    8. 类变量使用注意事项和细节讨论


    9. 类方法基本介绍

    11. 类方法应用案例

    1. public class StaticMethod {
    2. public static void main(String[] args) {
    3. Student student1 = new Student("godairo");
    4. student1.payFee(100);
    5. Student student2 = new Student("tom");
    6. Student.payFee(200);
    7. Student.showFee(); //总学费有:300.0
    8. }
    9. }
    10. class Student{
    11. private String name; //普通成员
    12. //定义一个静态变量,来累积学生的学费
    13. private static double fee = 0;
    14. public Student(String name) {
    15. this.name = name;
    16. }
    17. /**
    18. * 1.当方法使用static修饰后,该方法就是静态方法
    19. * 2.静态方法就可以访问静态属性/变量
    20. */
    21. public static void payFee(double fee){
    22. Student.fee +=fee; //累积到静态变量里的fee
    23. }
    24. public static void showFee(){
    25. System.out.println("总学费有:"+Student.fee);
    26. }
    27. }

    12. 类方法经典的使用场景

    也就是说我们不用创建一个对象,就能使用其中的方法

    1. //如果我们希望不创建实例,也可以调用某个方法(即当做工具来使用)
    2. //这时,把方法做成静态方法时非常合适
    3. System.out.println("9开平方的结果是="+Math.sqrt(9)); // 3.0
    1. //开发自己的工具类时,可以将方法做成静态的,方便调用
    2. class MyTools{
    3. //求出两个数的合
    4. public static double calSum(double n1,double n2){
    5. return n1+n2;
    6. }
    7. }
    8. public static void main(String[] args) {
    9. System.out.println(MyTools.calSum(1,2)); //3.0
    10. }

    13. 类方法使用注意事项和细节讨论


    14. 练习题

    因为是后++,那么就是先输出一个9,然后进行++。

    然后又创建匿名对象,然后调用count方法,那么会先输出count的值:10,然后自增,此时count变成了11。

    那么最后用类名.属性名去访问count的值,最后值就是11。


    这里在静态getTotalPerson()方法里是不能访问普通属性,也就是id,这里我们直接注释掉就行。

    而在构造器Person里面可以访问所有成员。

    那么直接通过类调用getTotalPerson()方法,这里直接输出0。

    当我们new了一个Person对象,构造器里面total自增,变成了1,此时还把total赋给了id,id也变成了1,这时候再去通过类调用getTotalPerson()方法,此时的值为1


    在static方法中,不能用this,把形参total的值赋给静态变量的值可以这样写:Person.total=total;  

  • 相关阅读:
    微信视频通话怎么美颜
    Excel-VBA 快速上手(十三、日期的常见用法)
    另一种降维算法:UMAP(主要是和t-SNE进行对比)
    【JavaSE】面向对象三大特性之多态
    使用matplotlib 演示矩阵乘法
    SEO业务适合什么代理IP?2023海外代理IP推荐排名
    C/C++|基于回调函数实现异步操作
    Verilog基础:阻塞/非阻塞赋值
    MinDoc文档管理系统在宝塔环境安装教程
    二:对表进行基本CRUD操作
  • 原文地址:https://blog.csdn.net/qq_44706176/article/details/126432727