java 笔记 chapter4 关键字static,final,内部类,内存管理
关键字static
静态块 static block
关键字final
内部类inner classes
内存分配:
关键字static
1,关键字static表示静态,能够与属性,方法,内部类一起使用。
2,static属性的内存分配:
1),类一装载就分配了内存空间给static。static 的变量是在类装载的时候就会被初始化。也就是说,只类被装载,不管你是否使用了这个static 变量,它都会被初始化。2),一个类中,一个static 变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static 变量会共享同一个内存空间。
3,static 的基本规则
1),一个类的静态方法只能访问静态属性public class StaticTest01{public static void main(String [] args) {A a = new A();A.a1(); //一个类的静态方法只能访问静态属性}}class A{public static int i = 110;int j = 120;public static void a1() {System.out.println("非静态变量i==" + i);System.out.println("非静态变量j==" + j); //报错}}2),一个类的静态方法不能够直接调用非静态方法public class StaticTest02{public static void main(String [] args) {A a = new A();A.a1(); //报错,a1()是非静态方法a.a1();}}class A{public static int i = 110;int j = 120;public void a1() {System.out.println("静态变量i==" + i);}public static void a2() {System.out.println("静态变量i==" + i);}}
3),如访问控制权限允许,static 属性和方法可以使用对象名加 ‘.’方式调用;当然也可以使用实例加 ‘.’方式调用。
4),静态方法中不存在当前对象(因为没有new),因而不能使用 “this ”,当然也不能使用”super”;
5),静态方法不能被非静态方法覆盖;
6),构造方法不允许声明为static 的
5),静态方法不能被非静态方法覆盖;
6),构造方法不允许声明为static 的
static块:
静态块是一个存在于类中,方法外面的带有static修饰的块。
静态块只在类装载的时候(第一次使用类的时候)执行一次。
一般是用来初始化静态的类属性。
关键字final
1,final表示最终的,可以修饰类,方法和属性。
2,final 的规则:
final 标记的类不能被继承。final 标记的方法不能被子类重写。final 标记的变量 (成员变量或局部变量)即成为常量,只能赋值一次。 static不能修饰局部变量final 标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。final 标记的局部变量可以只声明不赋值,然后再进行一次性的赋值。final 一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分,以避免被误用,
static和final的联系:
同一个方法或者属性,可以同时使用static和final修饰,一般static写前面,final写后面
public static final String NAME = "java开发"; (比较常用)
public final static String NAME = "java开发";
内部类:
允许在一 个类(或方法、语句块)的内部定义另一个类,后者称为内部类
分类:
类级对象级匿名内部类
内存分配:
Java 程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。
方法区:每个类装载进来后,分成3部分,定义部分,常量池和静态变量
栈内存:存放变量名,基本数据,少量的字符串,
栈的特点:栈是等长的,栈里面的值是不可以改变的,
堆内存:存放由new 创建的对象和数组
本地方法栈:Java 通过Java 本地接口JNI (Java Native Interface)来调用其它语言编写的程序,