类变量

什么是类变量

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

如何定义类变量

定义语法:

访问修饰符 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. [转帖]shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)

    https://developer.aliyun.com/article/885658 简介: shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 ...

  2. empty来显示暂无数据简直太好用,阻止用户复制文本user-select

    element-ui表格某一列无数据显示-- 很多时候,表格的某一列可能是没有数据的. 空着了不好看,ui小姐姐会说显示 -- 这个时候,小伙伴是怎么做的呢? 使用循环来判断是否为空,然后赋值为-- ...

  3. 重磅文章:VictoriaMetrics存储引擎分析.pdf

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 万字长文,详细介绍 VictoriaMetrics 存储引 ...

  4. python中,Microsoft Visual C++ 14.0 or greater is required问题解决方案

    今天在写一个小程序,安装依赖的时候发现这个问题,平时都是直接安装Visual Studio解决,但是这个安装太大了,所以解决看看怎么安装是最方便的,最容易解决的. 下面这个就是出现的问题: build ...

  5. Fabric网络升级(三)

    原文来自这里. 如果不熟悉capability,那么操作前可以查阅Capabilities.需要注意的是在启用capabilities前,需要升级归属该通道的peer节点和排序节点. 更多关于最新版F ...

  6. 不同版本的Unity要求的NDK版本和两者对应关系表(Unity NDK Version Match)

    IL2CPP需要NDK Unity使用IL2CPP模式出安卓包时,需要用到NDK,如果没有安装则无法导出Android Studio工程或直接生成APK,本篇记录一下我下载NDK不同版本的填坑过程. ...

  7. TeXStudio与Bakoma TeX 结合实现实时阅览

    参考链接:VSCode 或 TeXStudio LaTeX 配置方法 - 知乎 相信大家在使用TeXStudio时候,每次修改完毕都要运行一下再能看到PDF界面,这样做十分不方便,因此先给出如下操作办 ...

  8. 1cm+1kg纤薄身材 带来14小时超长续航!华硕灵耀13 2023评测

    一.前言:华硕推出1cm+1kg超轻薄笔记本 还有OLED好屏加持 随着处理器能效的不断进步,轻薄本已经不存在性能羸弱的问题了,也给了各大厂商极大的发挥空间,不过市面上的轻薄本厚度普遍在15~20mm ...

  9. Java执行Shell和传输文件

    特性: 多线程批量执行 多密码尝试 引入依赖: <dependency> <groupId>ch.ethz.ganymed</groupId> <artifa ...

  10. C语言程序设计之 循环控制2020-10-20

    2020-10-20 整理: 第一题: 2011年开始实行新个人所得税法,要求输入月薪salary,输出应交的个人所得税 tax (保留两位小数). 新税法方案如下: tax=rate*(salary ...