5-Java中的类-学习笔记2-静态与非静态

前言

在本专栏之前第二节学了局部变量和成员变量,只是比较说明了局部变量必须赋值,这样才分配了内存,才能访问,而成员变量可以不赋值(Java中默认会给成员变量赋值),也可以赋值。在第4节最后总结中提到,变量前的修饰符的语法为:
修饰符可以省略,也可以是public、protected、private、static、final、abstract。其中(1)public、protected、private三个最多只能出现一个;(2)abstract 和 final 最多只能出现一个;(3)static视需求,可出现也可不出现
参考资料:
1.《疯狂Java讲义》(第3版 李刚)— P123-130

1 static能修饰局部变量吗?

对于(1)、(2)后面类的继承、抽象类及接口相关知识大致会讲到,今天来看看(3)。书中提到,static可以用来修饰成员变量和方法,其中用static修饰的成员变量可称为静态变量或类变量,static修饰的方法可以成为静态方法或类方法
疑点1—static可以修饰局部变量(形参、方法中的局部变量、代码块中的局部变量)吗?

我们现在来试一试
在这里插入图片描述
在这里插入图片描述
编译报错如下
在这里插入图片描述
修改类Animal如下
在这里插入图片描述
编译依然报错
在这里插入图片描述
由上可知方法(无论是否是static)里的定义的局部变量不可为static

那么方法里的形参呢?
修改Animal类
在这里插入图片描述
编译
在这里插入图片描述
由此可见方法(无论是否是static)的形参必不能是static

那么代码块中的呢?
由于之前没有接触过代码块,因此先来个对比(先确保可在代码块中定义变量,至于能不能定义static类型的后面再实验),代码如下
在这里插入图片描述
在这里插入图片描述
编译
在这里插入图片描述
上面犯了一些小错误,修改代码
Animal.java

class Animal{
	
	{
		int testNum1 = 0;
		num1 = 5;
	}
	
	private int num1 = 8;
	
	Animal(){
		
	}
	
	void testF1(){
		
	}
	
	int getNum1(){
		return num1;
	}
	
}

Main.java

class MainActivity{
	
	public static void main(String[] args){
		Animal animal = new Animal();
		System.out.println(""+animal.getNum1());
	}
}

编译运行结果如下
在这里插入图片描述
而如果把代码块和定义num1的语句调换位置,结果如下
在这里插入图片描述
通过以上测试说明了代码块中可以定义变量,那么接下来测试能能否定义static类型的变量,代码如下

class Animal{
	
	private int num1 = 8;
	
	{
		int testNum1 = 0;
		static int testNum2 = 99;
		num1 = 5;
	}
	
	
	Animal(){
		
	}
	
	void testF1(){
		
	}
	
	int getNum1(){
		return num1;
	}
	
}

编译,结果如下
在这里插入图片描述

2 static修饰的成员变量与方法的使用

详细内容参考李刚老师的资料,总之一点,记住static是所有对象都共有的,可以通过类名访问,与类共存亡!(实例变量与对象共存亡)因此通过某一个对象或类名访问修改后,其他对象再访问的就是修改后了的(类名也是同理)。
同时也静态成员变量与方法也可以通过对象来访问(哪怕这个对象为null也可以访问)

2.1 static修饰成员变量

static修饰的成员可以使用对象来访问,也可以直接通过类名来访问,需要注意的是,类中不可用this访问本类中的static成员变量

案例代码
Animal.java

class Animal{
	static int num1;
	private int num2;
	
	void setNum2(int num){
		num2 = num;
	}
	
	int getNum2(){
		return num2;
	}
	
}

Main.java

class MainActivity{
	
	public static void main(String[] args){
		Animal a1 = new Animal();
		Animal a2 = new Animal();
		
		
		System.out.println("Before Changed");
		System.out.println("a1.num1 = "+a1.num1);
		System.out.println("a1.num2 = "+a1.getNum2());
		System.out.println("Animal.num1 = "+Animal.num1);
		System.out.println("a2.num1 = "+a2.num1);
		System.out.println("a2.num2 = "+a2.getNum2());
		System.out.println();
		System.out.println();
		
		
		a1.num1 = -34;
		a1.setNum2(67);
		System.out.println("After Changed!");
		System.out.println("a1.num1 = "+a1.num1);
		System.out.println("a1.num2 = "+a1.getNum2());
		System.out.println("Animal.num1 = "+Animal.num1);
		System.out.println("a2.num1 = "+a2.num1);
		System.out.println("a2.num2 = "+a2.getNum2());
		
	}
}

编译运行结果
在这里插入图片描述

2.2 static修饰方法

而对于类中static修饰的方法,可以使用对象来访问,也可以直接使用类名来访问,而需要注意的是,static方法不可访问非static的成员,此方法中不可出现this,super
案例
Animal.java

class Animal{
	static int num1;
	private int num2;
	
	void setNum2(int num){
		num2 = num;
	}
	
	int getNum2(){
		return num2;
	}
	
	static void testFun(){
		System.out.println("A static function is running !");
	}
	
}

Main.java

class MainActivity{
	
	public static void main(String[] args){
		Animal a1 = new Animal();
		
		System.out.println("Using an Object");
		a1.testFun();
		
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("Using a class");
		Animal.testFun();
	}
}

编译运行,结果如下
在这里插入图片描述

3 总结

(1)局部变量不可用static修饰
(2)static方法中不可访问非static的成员变量,static变量为所有对象共有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值