Java的静态与非静态、常量笔记

初学Java的小白,如果有不对,望斧正。

Java的静态有静态方法,静态成员。
Java没有东西是全局的,但对于PI来说,它的值是不变的,如果用一千次PI的值就需要实例化一千个PI的对象的话,太浪费时间了。所以就有了静态,一种折中的方法,引用就有,不引用就没有这个东西。
在c++中,static变量只能定义一次,Java我也是这么理解的。
静态的一种说法就是“一种不依靠实例变量也就不需要对象的行为”。
一、静态

1,静态方法
对于静态方法来说,不需要实例化对象就能调用这个静态方法,例如Math.min(2, 5); 就是调用了Math类中的静态方法min,在用min方法的时候,你并不需要也不能实例化一个对象,因为min方法就是一个比较大小的用处,没必要专门实例化一个对象,因此Java也规定了不允许实例化Math对象(通过构造函数设为private实现的),如果进行Math实例化会报错。
静态的方法不能调用非静态的变量和非静态的方法,这个并不需要死记硬背,举个例子就能懂了。

public class Test{
	protected int a = 10;
	
	public static void main(String[] args){
		Test t1 = new Test();
		Test t2 = new Test();
	
		System.out.println(a);
	}
}

这个例子会报错,因为静态方法不知道你指得是哪个实例的a,在静态方法中是不知道堆上有哪些实例(对象)的
同理也就很好理解为什么静态方法不能调用非静态方法了。(这里说的调用时直接调用,而不是通过实例化)。

2,静态变量
先举一个老生常谈的例子

public class Test
{
	protected int a = 0;
	
	Test()
	{
		a++;
	}
		
	public static void main(String[] args)
	{
		Test t1 = new Test1();
		Test t2 = new Test1();
	}
}

最后的a的值是多少呢,肯定会有一部分人认为是2,但其实答案是1。每实例化一个对象,就会新创建一个a,并且a的值是0。怎么理解呢,就相当于生孩子的话,每个孩子都有一个自己的头。它们的头只属于自己,是不能共享的。
可如果把a给改为protected staitc int a = 0;后,在输出a的值,就会使2。这个时候a可以理解为接生的医生,无论生多少个小孩,接生的医生就这一个。它是凌驾于实例也就是对象的,无论有没有对象,这个a都是存在的。无论有没有人生孩子,接生的医生都是存在的。
静态的变量是共享的。
同一个类的所有的实例共享一份静态变量。
实例变量:每个实例一个。
静态变量:每个类一个。

那么可能有人会问了,静态变量的初始化实在什么时候?
其实静态变量是在类被加载时初始化。
静态项目的初始化是有两个保证的:
1,静态变量会在该类的任何对象创建之前就完成初始化
2,静态变量会在该类的任何静态方法执行之前就初始化

二、常量

静态的final变量是常数。
static+final修饰的变量,叫做静态常量,编译期常量,在编译的时候就确定值。这是真正的常量。为什么这么说呢,因为在编译的时候就已经将常量的值确定并放入常量池中。它的值是已经确定下来并且不能更改。无论它是指向基本数据类型还是引用类型的变量。
但对于final变量来说,如果它指向的是基本数据类型,那么它是常量,但当它指向引用类型的变量时,它的值就不再时确定了。可以这么理解final变量,它是只能初始化一次的变量,所以如果它指向了引用类型的变量,如果引用类型内部的东西改变,final的值也是会变的。

接下来说一点初始化,对于static+final的变量初始化,有两种方法

publuc static final int a = 10;
public static final int a;

static{	
	a = 10;
}

对于final变量初始化,也可以在定义时初始化,或者在构造函数中初始化。

final并不一定得用在变量上,还可以用来修饰方法和类。
final的变量代表你不能改变它的值。
final的方法代表你不能覆盖该方法。
final的类代表你不能继承该类。

如果一个类已经标了final那么方法就不需要在多余的去写final了,因为都没办法继承了还怕什么被覆盖。

final会也是一种折中的方法,为什么这么说呢,面向对象三大特征,继承,封装,多态,一用final,继承整个失效了,为什么还要有呢,因为防止了一些更严重问题的发生。例如如果有人重写了String类,并将它改的很不舒服,那么对于一个项目来说都是致命的。所以权衡利弊的话,才有了这个折中的方法。

一个问题出现,一定会想办法解决它,但办法又会带来一定的问题,然后再去解决它。这也是一个完善的语言的产生过程。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值