类变量

什么是类变量

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

如何定义类变量

定义语法:

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

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

访问方式

类名.类变量名,例子:

public class VisitStatic {
public static void main(String[] args) {
//类名.类变量名
//说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问
System.out.println(A.name);
A a = new A();
//通过对象名.类变量名
System.out.println("a.name=" + a.name);
}
} class A {
//类变量
//类变量的访问,必须遵守 相关的访问权限.
public static String name = "xxxx";
//普通属性/普通成员变量/非静态属性/非静态成员变量/实例变量
private int num = 10;
}

使用细节

1.什么时候需要用类变量

​ 当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量)

​ 比如:定义学生类,统计所有学生共交多少钱。Student (name, fee)

2.类变量与实例变量(普通属性)区别

​ 类变量是该类的所有对象共享的,而实例变量是每个对象独享的。

3.加上static称为类变量静态变量,否则称为实例变量/普通变量/非静态变量

4.类变量可以通过类名.类变量名或者对象名.类变量名来访问

​ 但java设计者推荐我们使用类名.类变量名方式访问。【前提是满足访问修饰符的访问权限和范围】

5.实例变量不能通过类名.类变量名方式访问。

6.类变量是在类加载时便初始化。

​ 也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了。

​ ps:补充一点个人理解,java中的静态变量和python中的静态修饰其实类似。前者没有创建对象实例也可以访问(因为其在类加载的时候就创建了),后者可以再没有实例化类函数的情况下直接使用类函数

7.类变量的生命周期是随类的加载开始,随着类消亡而销毁。

public class StaticDetail {
public static void main(String[] args) {
B b = new B();
//System.out.println(B.n1);
System.out.println(B.n2);
//静态变量是类加载的时候,就创建了,所以我们没有创建对象实例
//也可以通过类名.类变量名来访问
System.out.println(C.address);
}
} class B {
public int n1 = 100;
public static int n2 = 200;
} class C {
public static String address = "北京";
}

类方法

什么是类方法

类方法也叫静态方法。形式如下:

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

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

类方法的调用

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

public class StaticMethod {
public static void main(String[] args) {
//创建2个学生对象交学费
Stu jk = new Stu("jk");
//jk.payFee(150);或者如下
Stu.payFee(150); Stu cc = new Stu("cc");
cc.payFee(300); Stu.showFee();
}
} class Stu{
private String name;//普通成员
//定义一个静态变量用于累计学费
private static double fee = 0;
public Stu(String name) {
this.name = name;
}
//当方法使用static修饰之后就可以访问静态变量
//即为静态方法
public static void payFee(double fee){
Stu.fee += fee;//累积
}
public static void showFee(){
System.out.println("总学费为:"+Stu.fee);
}
}

类方法的使用场景

当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。

//如果我们希望不创建实例,也可以调用某个方法(即当做工具来使用)
//这时,把方法做成静态方法时非常合适
System.out.println("9开平方的结果是="” + Math.sqrt(9));

或者是自己开发工具类时,可将方法设为静态方法,方便调用

//求出两个数的和
class MyTools {
public static double calSum(double n1,double n2) {
return n1 + n2;
}
}

还是类比Python

Java因为是原生支持OOP的语言,因此"类"是Java的核心

类方法就是一种简化使用类步骤的技巧,这样Java的类就更加接近Python中所谓的"函数"的使用方式

也就是:即调即用

使用细节

1.类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:

​ 类方法中无this的参数;

​ 普通方法中隐含着this的参数;

2.类方法可以通过类名调用,也可以通过对象名调用。

3.普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。

4.类方法中不允许使用和对象有关的关键字,比如this和super。普通方法(成员方法)可以。

5.类方法(静态方法)中只能访问静态变量或静态方法。【如何理解】

6.普通成员方法,既可以访问普通变量(方法),也可以访问静态变量(方法)。

小结:

静态方法,只能访问静态的成员;

非静态的方法,可以访问静态成员和非静态成员;(必须遵守访问权限)

public class StaticMethodDetail {
public static void main(String[] args) { D.hi();//ok
//非静态方法,不能通过类名调用
//D.say();, 错误,需要先创建对象,再调用
new D().say();//可以
}
}
class D { private int n1 = 100;
private static int n2 = 200;
public void say() {//非静态方法,普通方法 } public static void hi() {//静态方法,类方法
//类方法中不允许使用和对象有关的关键字,
//比如this和super。普通方法(成员方法)可以。
//System.out.println(this.n1);
} //类方法(静态方法)中 只能访问 静态变量 或静态方法
//口诀:静态方法只能访问静态成员.
public static void hello() {
System.out.println(n2);
System.out.println(D.n2);
//System.out.println(this.n2);不能使用
hi();//OK
//say();//错误
}
//普通成员方法,既可以访问 非静态成员,也可以访问静态成员
//小结: 非静态方法可以访问 静态成员和非静态成员
public void ok() {
//非静态成员
System.out.println(n1);
say();
//静态成员
System.out.println(n2);
hello();
}
}

练习题for类变量与类方法

public class StaticExercise03 {
} class Person {
private int id;
private static int total = 0;
public static void setTotalPerson(int total){
// this.total = total;//错误,因为在static方法中,不可以使用this 关键字 Person.total = total;//改成这样即可,意思就是访问静态变量
}
public Person() {//构造器
total++;
id = total;
}
//编写一个方法,输出total的值
public static void m() {
System.out.println("total的值=" + total);
}
}
class TestPerson {
public static void main(String[] args) { Person.setTotalPerson(3);
new Person(); //最后 total的值就是4
Person.m();//看看输出的是不是4
}
}

main方法的语法

深入理解main方法

解释main方法的形式:public static void main(Stringargs){}

  1. main方法是由Java虚拟机调用的

  2. Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public【因为JVM与main不在同一个类,不是public怎么调?】

  3. Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static

  4. 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数

    public class Hello {
    public static void main(String[] args){
    //args是如何传入
    //遍历显示
    for(int i =e; i < args. length; i++){
    System.out.println("第"+(+1)+"个参数="+ args[i]);
    }
    }
    }
    ==================================================================
    D: \javacode>javac Hello.java D: \javacode>java Hello
    (无输出)
    D:javacode>java Hello tom jack smith
    第1个参数=tom
    第2个参数=jack
    第3个参数=smith

    上述过程表明多个输入参数会被打包成数组传入方法中

    即:String[] args的值是执行程序的时候传入的(面试问题)

  5. java 执行的程序 参数1 参数2 参数3

特别提示:

  1. 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性。

  2. 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。

public class Main01 {

    //静态的变量/属性
private static String name = "韩顺平教育";
//非静态的变量/属性
private int n1 = 10000; //静态方法
public static void hi() {
System.out.println("Main01的 hi方法");
}
//非静态方法
public void cry() {
System.out.println("Main01的 cry方法");
} public static void main(String[] args) { //可以直接使用 name
//1. 静态方法main 可以访问本类的静态成员
System.out.println("name=" + name);
hi();
//2. 静态方法main 不可以访问本类的非静态成员
//System.out.println("n1=" + n1);//错误
//cry();
//3. 静态方法main 要访问本类的非静态成员,需要先创建对象 , 再调用即可
Main01 main01 = new Main01();
System.out.println(main01.n1);//ok
main01.cry();
}
}

【Java复健指南10】OOP高级01-类变量、类方法和main的更多相关文章

  1. 【Java复健指南09】项目练习全解--房屋出租系统

    一个基于文本界面的综合练习,主要用于串联和回忆知识点,比较简单 各个界面的设计样式 主菜单 =============房屋出租系统菜单============ 1 新 增 房 源 2 查 找 房 屋 ...

  2. 【Java复健指南15】链表LinkedList及其说明

    链表LinkedList by Java 之前有写过一些记录(引用),但是忘了乱了,现在重新梳理一遍 链表是Java中List接口的一种实现 定义(引用) 链表(linked list)是一种物理存储 ...

  3. Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)

        上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...

  4. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  5. 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值

    016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...

  6. [翻译]Java日志终极指南

    本文由 ImportNew - Wing 翻译自 loggly.欢迎加入翻译小组.转载请见文末要求. Java日志基础 Java使用了一种自定义的.可扩展的方法来输出日志.虽然Java通过java.u ...

  7. Java日志终极指南

    Java日志基础 Java使用了一种自定义的.可扩展的方法来输出日志.虽然Java通过java.util.logging包提供了一套基本的日志处理API,但你可以很轻松的使用一种或者多种其它日志解决方 ...

  8. Java工程师学习指南 初级篇

    Java工程师学习指南 初级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  9. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  10. 20155214 2016-2017-2 《Java程序设计》第10周学习总结

    学号 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技术相关API的使用 教材学习中的 ...

随机推荐

  1. [转帖]超线程SMT究竟可以快多少?(AMD Ryzen版 )

    https://www.modb.pro/db/139224 昨天我们用Intel I9的10核,每个核2个threads的机器跑了内核的编译: 超线程SMT究竟可以快多少? 今天,我换一台机器,采用 ...

  2. [转帖]IPv6地址解析库,窥探IPv6地址中包含的信息

    https://zhuanlan.zhihu.com/p/479028720 大家好,我是明说网络的小明同学. 今天和大家介绍一个IPv6 地址解析库IPv6 address Parser :http ...

  3. ESXi6.7安装Win11的方法

    背景 公司里面要进行新的操作系统验证了. 之前Win10 Win7 Win8 都比较简单. 就是现在Win11有了TPM非常繁琐. 今天必须得搞一把了,就简单搜索了下. 发现还是可以解决的. 然后记录 ...

  4. 兄弟组件互相传递值-this.$bus.$emit与this.$bus.$on

    B组件向C组件传递一个值. 一种组件间通信的方式, 适用于任意的组件间通信. 适用于任意的组件间通信. 适用于任意的组件间通信. 通过this.$bus.$emit('事件名',数据)进行提供数据 通 ...

  5. 正则表达式match方法和search方法

    正则表达式, //match() 方法可在字符串内检索指定的值 找到返回相关数据,找不到返回null var part = /Box/ig; var str = "this is box,i ...

  6. 从源码中解析fabric区块数据结构(一)

    从源码中解析fabric区块数据结构(一) 前言 最近打算基于fabric-sdk-go实现hyperledger fabric浏览器,其中最重要的一步就是解析fabric的上链区块.虽说fabric ...

  7. TienChin 渠道管理-前端展示渠道信息

    在编写 Vue 项目的时候我们可以使用 IDEA 当中提供的一个工具叫做 structure,也就是说可以很轻松的列举出当前 Vue 文件的大致结构,点那个就会跳转到对应的地方. 简简单单介绍一个编写 ...

  8. hadoop-3.0.0-cdh6.3.2源码编译实践

    1.编译过程 参考:https://blog.mygallop.cn/2020/10/centos/hadoop-cdh6-compile/ 2.问题记录 CDH6.3.2 Hadoop源码位置发生变 ...

  9. Dart常用核心知识

    Dart简述 Dart 是一个为全平台构建快速应用的客户端优化的编程语言,免费且开源. Dart是面向对象的.类定义的.单继承的语言.它的语法涵盖了多种语言的语法特性,如C,JavaScirpt, J ...

  10. Linux如何禁用透明大页

    环境: RHEL 6.5 + Oracle 11.2.0.4 RAC 1.确认透明大页是否开启 grep HugePage /proc/meminfo cat /sys/kernel/mm/redha ...