第一章:类变量与类方法详解

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、类变量
  • 二、类方法
  • 总结


前言

可不可以不创建对象来访问成员变量和成员方法呢?


一、类变量

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

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

//访问类变量
类名.变量名[推荐]
对象名.变量名
public class ChildGame {
	public static void main(String[] args) {
		//定义一个变量 count, 统计有多少小孩加入了游戏
		int count = 0;
		Child child1 = new Child("白骨精");
		child1.join();
		//count++;
		child1.count++;
		Child child2 = new Child("狐狸精");
		child2.join();
		//count++;
		child2.count++;
		Child child3 = new Child("老鼠精");
		child3.join();
		//count++;
		child3.count++;
		//===========
		//类变量, 可以通过类名来访问
		System.out.println("共有" + Child.count + " 小孩加入了游戏...");
		//下面的代码输出什么?
		System.out.println("child1.count=" + child1.count);//3
		System.out.println("child2.count=" + child2.count);//3
		System.out.println("child3.count=" + child3.count);//3
	}
} 

class Child { //类
	private String name;
	//定义一个变量 count ,是一个类变量(静态变量) static 静态
	//该变量最大的特点就是会被 Child 类的所有的对象实例共享
	public static int count = 0;
	
	public Child(String name) {
		this.name = name;
	} 
	
	public void join() {
		System.out.println(name + " 加入了游戏..");
	}

}

类变量内存剖析
同一个类所有对象共享
类变量可能存在堆区或者方法区的静态域
类变量在类加载的时候就生成了,所以我们没有创建对象实例也可以通过类名.类变量名来访问
类变量使用细则
什么时候用类变量:当我们需要让某个类的所有对象共享一个变量时
类变量与实例变量(普通属性)区别:类变量是该类的所有对象共享的,而实例变量是每个对象独享的
加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
类变量是在类加载的时候就初始化了,所以可以通过类名.变量名访问
类变量的生命周期是随类的加载开始,随类消亡而销毁

二、类方法

类方法也叫静态方法。

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

//调用
类名.类方法名

package com.hspedu.static_;
public class StaticMethod {
	public static void main(String[] args) {
		//创建 2 个学生对象, 叫学费
		Stu tom = new Stu("tom");
		//tom.payFee(100);
		Stu.payFee(100);//对不对?对
		Stu mary = new Stu("mary");
		//mary.payFee(200);
		Stu.payFee(200);//对
		//输出当前收到的总学费
		Stu.showFee();//300
		//如果我们希望不创建实例, 也可以调用某个方法(即当做工具来使用)
		//这时, 把方法做成静态方法时非常合适
		System.out.println("9 开平方的结果是=" + Math.sqrt(9));
		System.out.println(MyTools.calSum(10, 30));
	}
} 
//开发自己的工具类时, 可以将方法做成静态的, 方便调用
class MyTools {
	//求出两个数的和
	public static double calSum(double n1, double n2) {
		return n1 + n2;
	} 
	//可以写出很多这样的工具方法...
} 

class Stu {
	private String name;//普通成员
	//定义一个静态变量, 来累积学生的学费
	private static double fee = 0;
	
	public Stu(String name) {
		this.name = name;
	}
	 
	//说明
	//1. 当方法使用了 static 修饰后, 该方法就是静态方法
	//2. 静态方法就可以访问静态属性/变量
	public static void payFee(double fee) {
		Stu.fee += fee;//累积到
	} 
	public static void showFee() {
		System.out.println("总学费有:" + Stu.fee);
	}
}

类方法使用场景
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,这样不需要创建对象就可以使用
比如工具类中的方法,Math、Arrays、Collection
类方法使用细则
类方法和普通方法都是随类的加载而加载,将结构信息存储在方法区
类方法中不允许使用this和super关键字
类方法可以通过类名调用,也可以通过对象名调用
普通方法和对象有关,需要通过对象名调用
类方法中只能访问静态变量或静态方法
普通成员方法既可以访问非静态成员也可以访问静态成员
package com.hspedu.static_;

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();
	}
}

总结

类变量和类方法可以不需要创建该类的对象,通过类名来访问。

你可能感兴趣的:(#,Java面向对象编程高级知识,java,jvm)