Java基础之:OOP——类变量与类方法

类变量与类方法,我们习惯也将其称为静态变量与静态方法。

类变量/静态变量

通过一个实际案例来了解,为什么需要使用静态变量。

引入案例

声明一个学生类,每创建一个学生对象,统计学生的人数。

public class Test{    public static void main(String[] args){                int count = 0; //局部变量,累积计数        Student stu1 = new Student("小范");        count ++;        Student stu2 = new Student("小黄");        count ++;        Student stu3 = new Student("小雨");        count ++;                System.out.println("目前学生人数有:" + count);    }    }class Student{    private String name;        public Student(String name){        this.name = name;    }    }

通过这个案例我们可以看到,count作为一个局部变量,独立于Student外,当然也和创建的学生对象没有任何关联。以后在访问count的时候会很麻烦,在Student类中访问count也很麻烦。

解决方案:将count设置为类变量/静态变量

解决案例

package static_args_methods.args;public class Static_args {public static void main(String[] args) {Student student = new Student("小范");System.out.println(student.showFee());// 100Student student2 = new Student("小黄");System.out.println(student2.showFee());//200//System.out.println(Student.fee); //私有属性,无法访问System.out.println(Student.count); //2}}class Student{private String name;//static + 访问修饰符 + 类型 + 属性名static private double fee; //学费static Blackboard bb; //黑板//访问修饰符 + static + 类型 + 属性名 (推荐)public static int count; //人数public Student(String name) {super();this.name = name;fee += 100;//每个学生交100学费count += 1;}public double showFee(){return fee;}}class Blackboard{}

案例说明

由此案例,引出类变量/静态变量的概念及使用。

概念

类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。

定义语法

访问修饰符 static 数据类型 变量名; [推荐]

static 访问修饰符 数据类型 变量名;

访问方法

类名.类变量名 [推荐]

或者 对象名.类变量名 【静态变量的访问修饰符的访问权限和范围 和 普通属性是一样的。】

使用说明

  1. 当需要一个类的所有对象都可以共用一个属性时,就可以将此属性设置为静态属性。例如,Student中的count属性。

  2. 被静态static修饰过的属性,在类加载时就会被生成,然后初始化。

  3. 建议使用“类名.属性名” 的方式访问静态属性,因为静态属性(类变量)的生命周期是随类的加载开始,随着类消亡而销毁。在类加载的时候,并没有对象被创建,此时也可以使用类变量。

  4. 类变量是所有对象共享使用的,而普通变量是每个对象都独有的。

  5. 类变量的使用,访问权限也是由访问修饰符修饰的。例如:Student 的类变量 count 是 private 修饰的,那么在 Static_args 类中也不能通过 Student.count 来访问。

类方法/静态方法

类方法也叫静态方法 。

形式如下:

访问修饰符 static 数据返回类型 方法名() { } 【推荐】

static 访问修饰符 数据返回类型 方法名() { }

类方法的调用:

使用方式: 类名.类方法名 或者 对象名.类方法名 【前提是 满足访问修饰符的访问权限和范围】

使用说明

  1. 类方法与普通方法都是在类加载时就加载了,将其结构信息放在方法区中。

  2. 类方法中没有this关键字,也不能使用super关键字。因为类方法在类加载时就可以调用,此时还没有对象被生成。而this与super都是代表对象的关键字。

  3. 类方法/静态方法 只能访问静态属性或者调用其他静态方法,不可以使用成员属性与成员方法。因为在类方法被加载时,成员属性与成员方法都还没有被加载出来,不能使用。【前提是 满足访问修饰符的访问权限和范围】

  4. 而在成员方法(普通方法)中可以使用所有的静态方法与静态属性。【前提是 满足访问修饰符的访问权限和范围】

  5. 但不要误理解为,静态方法中使用的任何属性或方法都必须是静态的。也可以在静态方法中声明普通属性来使用。

说明案例

public class StaticMethodDetail {public static void main(String[] args) {// TODO Auto-generated method stub//类方法可以通过类名调用,也可以通过对象名调用new DD().hi();DD.hi();}}class EE {public String name = "EE";}class DD extends EE {/* * 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区 :类方法中无this的参数,普通方法中隐含着this的参数 * 类方法中,不能使用this ,普通方法可以使用this */private int num = 200;private static String name = "老王";public static void hi() {//System.out.println(this.num);}//类方法中不允许使用和对象有关的关键字,比如this和superpublic static void ok() {//System.out.println(this.num);//System.out.println(super.name);}//类方法(静态方法)中 只能访问 静态变量 或静态方法public void m1() { }public static void hello() {ok();//m1();System.out.println(name);}//普通成员方法(非静态方法),既可以访问 普通变量(方法),也可以访问静态变量(方法)public void m2() {ok();m1();System.out.println(name);System.out.println(num);}}

简单案例

package static_args_methods.methods;public class Static_methods {public static void main(String[] args) {Person person = new Person("小黄", 2000);Person person2 = new Person("小范", 2500);//可以使用类名调用,也可以使用对象调用System.out.println(Person.show());//建议System.out.println(person2.show());}}class Person{private String name;private double salary; //工资private static double totalSalary; //总工资public Person(String name, double salary) {super();this.name = name;this.salary = salary;sumSalary(salary);}//静态方法public static void sumSalary(double salary) {totalSalary += salary;}//返回总工资(静态方法里只能使用静态属性与方法)public static double show() {//salary = 100; //Cannot make a static reference to the non-static field salary//this.totalSalary = 100; //在静态方法中没有this指针,也不可以使用superreturn Person.totalSalary;}}

理解main

由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

简单案例

public class TestMain{private String name = "jack";private static int num = 600;//1.main方法时JVM调用,因此 public static//2. String[] args 是运行程序时,可以输入的//3. 比如 java TestMain tom jack smithpublic static void main(String[] args) {for(int i= 0 ;  i < args.length;i++) {System.out.println(args[i]);}//m1();m2();System.out.println(num);//如果我们就是要再 main调用非静态的成员,需要先创建对象,再调用..TestMain tm = new TestMain();tm.m1();}public void m1() {}public static void m2() {}}
(0)

相关推荐

  • Java基础之三个修饰符

    三个关键字 抽象的(abstract) 静态(static) 最终的(final) 一.抽象 1.1 什么是抽象 似是而非的,像却又不是:具备某种对象的特征,但不完整. 二. 抽象的(abstract ...

  • 一个HelloWorld,居然和面试官聊了半小时!

    这位小伙伴入行搞java开发,入坑三年不到.最近,私下跟我说,自己在团队没有存在感,决定骑马找驴. 真的,面试多了,自然也会遇到一些奇葩的面试官(不按套路出牌). 背景 他就遇到这么以为奇葩的面试官, ...

  • Java语言中的修饰符—static

    没有经过全文修饰的文章,读起来就会显得苍白无力,而善于用贴切修饰词的文章则能更形象地呈现主题,而在Java编程中也提供了一些修饰语,它们可以修饰类.变量和方法.对修饰符的灵活使用将大大提高软件的重用性 ...

  • Java基础之:OOP——接口

    Java基础之:OOP--接口 usb插槽就是现实中的接口,可以把手机,相机,u盘都插在usb插槽上,而不用担心那个插槽是专门插哪个的,原因是做usb插槽的厂家和做各种设备的厂家都遵守了统一的规定包括 ...

  • Java基础之:OOP——代码块

    代码块又称初始化块,是类中的成员(即类的一部分),类似于方法,将逻辑语句封装在方法体中,通过{}包围起来,也是通过调用执行. 但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象 ...

  • Java基础之:OOP——继承

    Java基础之:OOP--继承 面向对象编程OOP(Object Oriented Programming)的三大特征之二:继承 首先看一个案例,分别创建小学生与研究生类,输出他们的信息: 小学生类: ...

  • Java基础之:泛型

    Java基础之:泛型 在不使用泛型的情况下,在ArrayList 中,添加3个Dog. Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx()). package ...

  • Java 基础知识

    Java 基础知识

  • Java 基础语法

    注释 #单行注释 // 这里是单行注释 #多行注释 /* 这里是 多行注释 */ #JavaDoc /* *@Description: *@Author: */ Java可以使用中文命名 但不建议使用 ...

  • Java基础(第二期)

    数据类型扩展以及面试题讲解 整数拓展:进制 int i=10; int i2=010; //八进制0 int i3=0x10; //十六进制0x 0~9 A~F 16 相关进制转换自行学习,用的不多 ...

  • Java开发工程师最新面试题库系列——Java基础部分(附答案)

    JAVA基础 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发 ...

  • 全栈必备 Java基础

    那一年,从北邮毕业,同一年,在大洋的彼岸诞生了一门对软件业将产生重大影响的编程语言,它就是--Java.1998年的时候,开始学习Java1.2,并在Java Orbix 上做服务,而如今Java 9 ...