JavaSE之面向对象(中)

1.static静态修饰符

使用static修饰的成员变量、常量、方法和代码块统称为静态成员。
静态成员归整个类所有,但不依赖于类的实例,只是别所有的实例所共享,只要这个类被JVM加载,就可以根据类名在全局数据区域中找到他们,因此,静态成员可以在任何实例对象创建之前访问。
1.1static变量——静态变量
static关键字修饰的成员变量称为静态变量,在没有创建实例对象之前就可以通过类名.变量名的格式访问。
没有static关键字修饰的成员变量就是实例变量,
实例变量与成员变量的区别

  1. 每创建一个实例,JVM就会为实例变量分配一次内存,实例变量可以在内存中有多个备份且互不影响。实例变量隶属于对象,在类的内部,非静态方法可以直接访问实例变量,而在静态方法中,要类似于在main方法中访问实例变量的形式一样,即创建本类的实例对象,通过实例对象访问实例变量。
  2. 对于静态变量,是在加载类的过程中完成静态变量内存的分配,且JVM只为静态变量分配一次内存,静态变量在内存中只有一个备份,静态变量可以被所有的实例对象共享,在任何方法中都可以访问静态变量,通过类名.静态变量名this.静态变量名(不推荐)的方式访问。

1.2satic方法——静态方法
静态方法是属于类的,但不依赖于类,静态方法在类创建以后就一直存在,其生命周期与类一样。
实例方法与静态方法的区别:

  1. 实例方法可以访问静态变量,静态常量,静态方法、实例变量、实例方法。
  2. 静态方法可以不通过本类的实例对象,而是通过类名.静态方法名();的方式调用。静态方法不能直接访问实例变量和方法,而是需要通过创建实例对象,通过实例对象调用的方法访问实例变量和实例方法(参见main方法中的访问调用)。静态方法中可以直接访问静态成员。静态方法中不能使用this和super关键字,因为这两个关键字与特点的实例相关。
    main()方法
    main方法是Java程序的入口,每一个Java程序都是从main方法开始执行的。

主方法必须有以下几点,缺一不可:

  1. 访问修饰符为public
  2. 必须为静态方法,有static修饰
  3. 返回值类型为void
  4. 方法参数列表必须为String类型的数组

主方法 main()是静态方法,JVM只需加载main()方法所在的类就可以执行main()方法,不需要创建实例对象, main()静态方法不能直接访问非静态成员。其他静态方法在理论上也可以调用静态方法。

this关键字:

this关键字的作用:

  1. 在类的方法或构造方法内部使用this调用本类属性this.成员变量名
  2. 在构造方法中使用this调用构造方法this([参数列表名])
  3. this表示当前对象this

在构造方法中使用this([参数列表])调用构造方法时,须有对应含有参数列表的构造方法,并且要将此语句放在当前构造方法的首行。

在类中的方法,如构造函数或setter方法中需对类中属性赋值,若不使用this.变量名=变量名的方法对成员变量赋值,虽然能通过编译,但是不能成功赋值。

2.代码块

在Java中使用{}括起来的代码就称为代码块,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、同步代码块。
1.普通代码块
直接在一个方法或语句中出现的代码块称为普通代码块,在普通代码块中定义的变量只在块中起作用。普通代码块和一般语句执行的顺序由他们在代码块中出现的顺序决定——“先出现先执行”。
普通代码块的作用:避免变量重名。
2.构造块
直接在类中定义的代码块就称为构造块。构造块在创建对象时会被调用,每创建一次对象就会调用一次构造块,并且构造块的执行次序优先于构造函数。
构造块的作用:在构造块中为静态属性初始化。
3.静态代码块
在Java类中使用static关键字声明的代码块称为静态代码块。
静态代码块的特点:

  1. 静态代码块不能存在于任何方法体内
  2. 静态代码块不能访问实例变量和实例方法,需要通过类的实例对象访问。
  3. JVM在加载类的同时就会执行代码块,因此静态代码块先于主方法执行,如果类中包含多个静态代码块,就按照“先定义的代码块先执行”的顺序执行。
  4. 每个静态代码块只能执行一次

所有代码块的执行优先级:
静态代码块>主方法>构造代码块>构造方法>普通代码块

普通代码块辨析:

public class CodeBlock{
public static void main(String[] args){
  {
		int x=7;// 局部变量出了代码块就会释放
		System.out.println(x);
	}
	int x =5;//ok
	System.out.println(++x);
}
}
public class CodeBlock{
public static void main(String[] args){
	int x =5;
	System.out.println(++x);
		{
		int x=7;  //error
//前面有在main()方法作用域中定义的变量,到此处还没有失效,因此不能重复定义变量
		
		System.out.println(x);
	}
}
}

猜你喜欢

转载自blog.csdn.net/weixin_42962924/article/details/83959977