2020年8月17日 面向对象的高级特性

修饰符的学习围绕三个问题:

(1)单词的意思

(2)可以修饰什么?

(3)用它修饰后有什么不同?

7.1 关键字:final

final:最终的

用法:

(1)修饰类(包括外部类、内部类类)

表示这个类不能被继承,没有子类

(2)修饰方法

表示这个方法不能被重写

(3)修饰变量(成员变量(类变量、实例变量),局部变量)

表示这个变量的值不能被修改

注意:如果某个成员变量用final修饰后,也得手动赋值,而且这个值一旦赋完,就不能修改了,即没有set方法

7.2 关键字:native

native:本地的,原生的 用法:

只能修饰方法

表示这个方法的方法体代码不是用Java语言实现的。

但是对于Java程序员来说,可以当做Java的方法一样去正常调用它,或者子类重写它。

JVM内存的管理:

 

 

方法区:类的信息、常量、静态变量、动态编译生成的字节码信息

虚拟机栈:Java语言实现的方法的局部变量

本地方法栈:非Java语言实现的方法的局部变量,即native方法执行时的内存区域

堆:new出来的对象

程序计数器:记录每一个线程目前执行到哪一句指令

 

7.3 关键字:static

static:静态的

用法:

1、成员方法:我们一般称为静态方法或类方法

(1)不能被重写

(2)被使用

本类中:其他方法中可以直接使用它

其他类中:可以使用“类名.方法"进行调用,也可以使用"对象名.方法",推荐使用“类名.方法"

(3)在静态方法中,我们不能出现:this,super,非静态的成员

 

2、成员变量:我们一般称为静态变量或类变量

(1)静态变量的值是该类所有对象共享的

(2)静态变量存储在方法区

(3)静态变量对应的get/set也是静态的

(4)静态变量与局部变量同名时,就可以使用“类名.静态变量"进行区分

 

3、内部类:后面讲

4、代码块:静态代码块

 

7.4 静态代码块

1、语法格式:

【修饰符】 class 类名{
   static{
       静态代码块;
  }
}

2、作用:

协助完成类初始化,可以为类变量赋值。

 

3、类初始化<clinit>()

类的初始化有:

①静态变量的显式赋值代码

②静态代码块中代码

其中①和②按顺序执行

注意:类初始化方法,一个类只有一个

 

4、类的初始化的执行特点:

(1)每一个类的<clinit>()只执行一次

(2)如果一个子类在初始化时,发现父类也没有初始化,会先初始化父类

(3)如果既要类初始化又要实例化初始化,那么一定是先完成类初始化的

 

7.5 变量的分类与区别

1、变量按照数据类型分:

(1)基本数据类型的变量,里面存储数据值

(2)引用数据类型的变量,里面存储对象的地址值

int a = 10;//a中存储的是数据值

Student stu = new Student();//stu存储的是对象的地址值
int[] arr = new int[5];//arr存储的是数组对象的地址值
String str = "hello";//str存储的是"hello"对象的地址值

2、变量按照声明的位置不同:

(1)成员变量

(2)局部变量

 

3、成员变量与局部变量的区别

(1)声明的位置不同

成员变量:类中方法外

局部变量:(1)方法的()中,即形参(2)方法体的{}的局部变量(3)代码块{}中

(2)存储的位置不同

成员变量:

如果是静态变量(类变量),在方法区中

如果是非静态的变量(实例变量),在堆中

局部变量:栈

(3)修饰符不同

成员变量:4种权限修饰符、static、final。。。。

局部变量:只有final

(4)生命周期

成员变量:

如果是静态变量(类变量),和类相同

如果是非静态的变量(实例变量),和所属的对象相同,每一个对象是独立

局部变量:每次执行都是新的

(5)作用域

成员变量:

如果是静态变量(类变量),在本类中随便用,在其他类中使用“类名.静态变量"

如果是非静态的变量(实例变量),在本类中只能在非静态成员中使用,在其他类中使用“对象名.非静态的变量"

局部变量:有作用域

posted @ 2020-08-17 16:20  窦云鹏  阅读(132)  评论(0编辑  收藏  举报