1.final 关键字
final关键字可以用来修饰类,方法,变量
(一)修饰类
表示类不能被继承,
(二)修饰方法
表示方法不能被重写,也不能被重载
(三)修饰变量
当修饰成员变量/类变量的时候,变量在声明的时候必须要被赋初值。
当修饰局部变量的时候,变量可以在声明的时候不赋初值。
无论是修饰成员变量还是局部变量,当他们被赋初值之后,他们的值就不能在改变了。
2.this关键词
this关键字用以表示"引用类"的实例
this关键词还可以用来调用本类当中的其他构造器,但是要放在第一行,与super()用法差不多
this关键字是可以选择的,这个关键字的作用主要是是代码更加的清晰明了。
需要注意的是this只能在方法当中使用(构造器除外),有this为属性,无this为参数名
1.this关键字表示当前类的实例
package com.xd.map;
public class Test5 {
public static void main(String[] args) {
Test5 test5=new Test5();
test5.test();
}
public void test() {
//注意this关键词不能出现在static方法当中,因为this可以省略
this.mp();
}
public void mp() {
System.out.println("zheshi ");
}
}
2.this表示当前引用它的那个类的实例
package com.xd.map;
public class Test5 {
Child[] child;
void manageEmployees() {
//this表示当前引用它的child所在类的实例
int totalEmp = this.child.length;
System.out.println("Total child: " + totalEmp);
//this表示当前引用它的report方法所在类的实例
this.report();
}
void report() {
}
}
3.this关键词用来调用本类当中的其他构造器(注意此时this必须在构造器当中)
package com.xd.map;
public class Test5 {
public Test5() {
this(2);
System.out.println("无参构造器...........");
}
public Test5(int a) {
System.out.println("含有一个参数的构造器"+a);
}
public static void main(String[] args) {
Test5 test5=new Test5();
}
}
3.super关键字
super关键字用来从父类访问子类的方法与变量
1.调用父类的变量与方法(注意此时super可以处于普通方法当中)
class Parent {
public int a;
public void test() {
System.out.println("a="+a);
}
}
public class Child extends Parent {
public static void main(String[] args) {
Child child=new Child();
child.mp();
}
public void mp() {
System.out.println("super关键词测试...");
super.a=10;
super.test();//10
}
}
2.调用父类的构造器(此时super必须要位于构造器当中的第一行)
class Parent {
public Parent() {
System.out.println("无参构造器...");
}
public Parent(int a) {
System.out.println("有参构造器:a"+a);
}
}
public class Child extends Parent {
public Child() {
//调用父类的构造器,必须要在第一行
super(10);
System.out.println("调用父类的有参构造器");
}
public static void main(String[] args) {
Child child=new Child();
}
}
总结
使用 this 和 super 要注意的问题:
super 调用父类中的其他构造方法时,调用时要放在构造方法的首行!this 调用本类中的其他构造方法时,也要放在首行。
this、super不能用在static方法中。
为什么super与this不能出现在static修饰的方法当:
被 static 修饰的方法属于类,不属于单个这个类的某个对象,被类中所有对象共享。而 this 代表对本类对象的引用,指向本类对象;而 super 代表对父类对象的引用,指向父类对象;所以, this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西。
即:this谁调用他,他就指向谁,super指向父类,然而被static修饰的成员只是属于本类的。
4.static关键字
1.static关键词主要有如下的几种用法
修饰成员变量和成员方法
静态代码块
修饰类(只能修饰内部类)
静态导包(用来导入类中的静态资源,1.5之后的新特性)
2.修饰成员变量与方法:
被static修饰的成员属于类,随着类的记载而加载,被static 声明的成员变量属于静态成员变量,静态成员变量存储在java内存区域的方法区当中,方法区与堆区一样,都是一个内存的共享区域,在java虚拟机当中将方法区看做是堆的一部分,他用来存储被jvm加载的类信息,常量,静态变量,即时编译的代码。
3.静态代码块
静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
package com.xd.map;
public class Test5 {
public Test5(){
System.out.println("这个是构造器");
}
{
System.out.println("这是非静态代码块");
}
static {
System.out.println("这是静态代码块");
}
public static void main(String[] args) {
Test5 t5=new Test5();
}
}
这是静态代码块
这是非静态代码块
这个是构造器
静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问.
4.静态导包
格式为:import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
Math. --- 将Math中的所有静态资源导入,这时候可以直接使用里面的静态方法,而不用通过类名进行调用
如果只想导入单一某个静态方法,只需要将换成对应的方法名即可
import static java.lang.Math.;
换成import static java.lang.Math.max;具有一样的效果
public class Demo {
public static void main(String[] args) {
int max = max(1,2);
System.out.println(max);
}
}
5.静态方法与非静态方法
静态方法与非静态方法都是在调用的时候才执行的,为调用的时候是加载在方法区里面的
6.静态代码块与非静态代码块
静态代码块是在加载类的时候执行的,非静态代码块是在创建的对象的实例的时候执行的,静态代码块与非静态代码块都是构造器之前执行的,静态代码块只能执行一次,非静态代码块执行多次
package com.xd.map;
public class Test5 {
{
System.out.println("这是非静态代码块");
}
static {
System.out.println("这是静态代码块");
}
public static void main(String[] args) {
}
}
这是静态代码块
非静态代码块与构造器的区别:非静态代码块是不对所有的对象进行初始化,构造器是对调用他的那个对象进行初始化
public class Test {
public Test() {
System.out.print(默认构造方法!--);
}
非静态代码块
{
System.out.print(非静态代码块!--);
}
静态代码块
static {
System.out.print(静态代码块!--);
}
public static void test() {
System.out.print(静态方法中的内容! --);
{
System.out.print(静态方法中的代码块!--);
}
}
public static void main(String[] args) {
Test.test();-
}
结果:
静态代码块!--静态方法中的内容! --静态方法中的代码块!-
public class Test {
public Test() {
System.out.print(默认构造方法!--);
}
非静态代码块
{
System.out.print(非静态代码块!--);
}
静态代码块
static {
System.out.print(静态代码块!--);
}
public static void test() {
System.out.print(静态方法中的内容! --);
{
System.out.print(静态方法中的代码块!--);
}
}
public static void main(String[] args) {
Test test = new Test();
}
结果
静态代码块!--非静态代码块!--默认构造方法!--
非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。