《java入门第一季》之面向对象(static关键字)

/*
	static的特点:(它可以修饰成员变量,还可以修饰成员方法)
		A:随着类的加载而加载
			回想main方法。
		B:优先于对象存在
		C:被类的所有对象共享
			举例:班级的学生应该共用同一个班级编号。
			其实这个特点也是在告诉什么时候使用静态?
				如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
			举例:
				饮水机(用静态修饰)
				水杯(不能用静态修饰)
		D:可以通过类名调用
			其实它本身也可以通过对象名调用。
			推荐使用类名调用。
			
			静态修饰的内容一般我们称其为:与(类相关)的,(类)成员
*/
class Student {
	//非静态变量
	int num = 10;
	
	//静态变量
	static int num2 = 20;
}

class StudentDemo {
	public static void main(String[] args) {
		Student s = new Student();
		System.out.println(s.num);
		
		System.out.println(Student.num2);//用类名调用(推荐使用类名调用)
		System.out.println(s.num2);//用对象名调用,以前的方式,天经地义
	}
}


/*
	定义一个人类
	
	姓名和年龄都是变化的,这个能接收,因为每个人的姓名和年龄是不同的。
	但是,现在选取的几个人都是中国人,他们的国籍是一样的。
	一样的国籍,每次创建对象,在堆内存都要开辟这样的空间,
	我就觉得有点浪费了。怎么办呢? 
		针对多个对象有共同的这样的成员变量值的时候,
		Java就提供了一个关键字来修饰:static。
		static修饰的变量或者方法被所有的对象共用
*/
class Person {
	//姓名
	String name;
	//年龄
	int age;
	//国籍
	//String country;
	static String country;
	
	public Person(){}
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person(String name,int age,String country) {
		this.name = name;
		this.age = age;
		this.country = country;
	}
	
	public void show() {
		System.out.println("姓名:"+name+",年龄:"+age+",国籍:"+country);
	}
}

class PersonDemo {
	public static void main(String[] args) {
		//创建对象1
		Person p1 = new Person("邓丽君",16,"中国");//静态修饰的变量只需要赋值一次就可以了。
		p1.show();
		
		//创建对象2
		//Person p2 = new Person("杨幂",22,"中国");
		//p2.show();
		Person p2 = new Person("杨幂",22);
		p2.show();
		
		//创建对象3
		//Person p3 = new Person("凤姐",20,"中国");
		//p3.show();
		Person p3 = new Person("凤姐",20);
		p3.show();
		System.out.println("-----------------");
		p3.country = "美国";//静态的修改了,其他在调用的时候都会修改
		p3.show();
		
		p1.show();
		p2.show();
	}
}

/*
	static关键字注意事项
		A:在静态方法中是没有this关键字的
			如何理解呢?
				静态是随着类的加载而加载,this是随着对象的创建而存在。驴和骡子不相及
				静态比对象先存在。驴优先于骡子存在
		B:静态方法只能访问静态的成员变量和静态的成员方法
				静态方法:
					成员变量:只能访问静态成员变量。他要访问的变量要定义为静态的
					成员方法:只能访问静态成员方法  他要访问的方法要定义为静态的
				非静态方法:
					成员变量:可以是静态的,也可以是非静态的。它都可以访问
					成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
			简单记:
				静态方法只能访问静态的变量或者方法。
*/
class Teacher {
	public int num = 10;
	public static int num2 = 20;
	
	public void show() {//定义一个非静态的方法
		System.out.println(num); //隐含的告诉你访问的是成员变量
		System.out.println(this.num); //明确的告诉你访问的是成员变量,this该类中的成员变量
		System.out.println(num2);//非静态方法中可以访问静态的变量
		
		function();
		function2();//非静态的方法中可以访问静态的方法
	}
	
	public static void method() {//静态方法
		//无法从静态上下文中引用非静态 变量 num
		//System.out.println(num);//静态不可以引用非静态的
		//System.out.println(this.num);//无法从静态上下文中引用非静态 变量 this.就是说在静态方法中是没有this关键字的
		System.out.println(num2);//静态方法访问静态的成员变量和静态的成员方法,这里不报错
		
		//无法从静态上下文中引用非静态 方法 function()
		//function();//静态不可以引用非静态的方法
		function2();//静态方法访问了静态的成员方法不会报错
	}
	
	public void function() {//非静态,只可以被非静态方法访问
	
	}
	
	public static void function2() {//静态的可以被静态方法访问也可以被非静态方法访问
	
	}
}

class TeacherDemo {
	public static void main(String[] args) {
		//创建对象
		Teacher t = new Teacher();
		t.show();
		System.out.println("------------");
		t.method();//静态的方法用对象来调用	,这是最原始的方式调用,天经地义
		Teacher.method();//静态的方法用类名来调用,推荐使用这个语句,因为method为类Teacher下的静态方法。
	}
}


原文地址:https://www.cnblogs.com/wanghang/p/6299876.html