修饰 类 不能被继承,没有子类,final类中的方法默认是final的。 在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
修饰 方法 不能被子类的方法覆盖重写,但可以被继承。如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 使用final方法的原因有二: 第一、把方法锁定,防止任何继承类修改它的意义和实现。 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
修饰 成员变量(基本类型) 表示常量,只能被赋值一次,赋值后值不再改变。
修饰 成员变量(对象引用) 一旦引用被初始化指向对象,就无法改为指向另一个对象。
修饰 参数 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
final不能用于修饰构造方法,父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。提高的性能,jvm会缓存final变量;可以安全的在多线程环境下共享,不需要额外的同步开销。final标记的局部变量可以只声明不赋值,然后再进行一次性的赋值
被static修饰的 成员变量 和 成员方法 独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的 方法区 内定找到他们。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块
修饰 变量 static修饰的叫做静态变量,无static的叫做实例变量区别:对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
修饰方法静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解! 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
修饰代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
static和final一块用 static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 对于方法,表示不可覆盖,并且可以通过类名直接访问。
对于被static和final修饰过的实例常量,实例本身不能再改变了,但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象,这一点在编程中用到很多。
PS:
final在修饰变量的时候是指变量所引用的变量不能变,而引用中的内容可以改变。例: final StringBuffer str = new StringBuffer(“123”); str.append(“456”); 这段代码是不会报错的。
之所以 final int i = 3; 不能改变值的内容是因为i存储在栈中,改变值等于改变其对应的引用变量。而上面的str存储在堆中,改变值不会改变引用变量。
static 1.修饰方法和变量(成为静态变量,静态方法),也可形成静态代码块(不能出现在方法内,其他地方都可以出现) 2.修饰变量,共享同一个变量 3.修饰方法,不能调用非静态的成员,不能含有抽象的对象(因为静态成员类一加载即生效,抽象的对象未实例生效矛盾) 4.静态代码块,不能调用非静态成员,不能含有抽象的对象,可以再任何位置(除了不能再方法内部) 5.直接通过类名.方法名/变量名调用 final 1.修饰类,变量,方法 2.修饰类表示不能被继承,没有子类 3.修饰变量表示常量 4.修饰方法表示可以被继承不能被覆盖,不能修饰构造方法 5.fianl方法参数 void f1(final int i){}表示在方法内i是常量 static final 1.修饰变量表示全局常量 2.修饰方法表示,不可被覆盖的静态方法,里面不能有非静态成员和未实例化对象)
Static修饰的成员变量(局部变量不可),方法,实例化类,代码块。 1.静态变量,会存放在“方法区”,变为共用 2.静态方法,不用生成类的实例就可以访问,直接从内存中获取,可以共享使用。 (减少了不同实例调用时,对内存的开销,以及构造对象时的消耗。但从另一方面讲,如果你new了一个,然后一直用他来调用,那么你知道有什么后果吗?在多线程里面,多个线程共用一个类的实例,是很危险的。如果你的方法不依赖类的实例,那么他就是一个static得。)
一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。 static的变量是在类装载的时候就会被初始化,即,只要类被装载,不管是否使用了static变量,都会被初始化。 static的基本规则 1.一个类的静态方法只能访问静态属性 2.一个类的静态方法不能直接调用非静态方法 3.如访问控制权限允许,static属性和方法可以使用类名加“.”的方式调用,也可以使用实例加“.”的方式调用 4.静态方法中不存在当前对象,因而不能使用this,也不能使用super 5.静态方法不能被非静态方法覆盖 6.构造方法不允许声明为static的 注,非静态变量只限于实例,并只能通过实例引用被访问。 静态初始器(静态块)是一个存在与类中方法外面的静态块,仅仅在类装载的时候执行一次,通常用来初始化静态的类属性。
