代码块
1、代码块的作用:用来初始化类,对象。
2、代码块如果有修饰,只能是static
3、分类:静态代码块&非静态代码块
4、静态代码块
- 随着类的加载而执行,只执行一次
- 作用:初始化类信息
- 如果定义了多个静态代码块,则按照声明先后顺序执行
- 静态代码块的执行要先于非静态代码块的执行
- 静态代码块内只能调用静态属性,静态方法,不能调用非静态结构
5、非静态代码块 - 随着对象的创建而执行
- 每创建一个对象,就执行依次非静态代码块
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果定义了多个非静态代码块,则按照声明先后顺序执行
- 非静态代码块内可以调用静态的属性,静态的方法,或者非静态属性,非静态方法
class Person{
String name;
int age;
static String desc = "i am a person";
public Person(){
}
public Person(String name, int age){
this.name = name;
this.age =age;
}
//static代码块
static{
System.out.println("hello,static block-1");
//调用静态结构
desc = "我是一个爱学习的人";
info();
//不可以调用非静态结构
// eat();
// name = "Tom";
}
//非static代码块
{
//调用非静态结构
System.out.println("hello, block");
age = 2;
eat();
//调用静态结构
desc = "我是一个爱玩的人";
info();
}
public void eat(){
System.out.println("吃饭");
}
public static void info(){
System.out.println("i am a happy boy");
}
}
public class Test {
public static void main(String[] args) {
String dd = Person.desc;
System.out.println(dd);
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.age);
Person.info();
}
}
static关键字
一、使用static修饰属性:静态变量(或类变量)
按照是否使用static修饰,又分为:静态属性 and 非静态属性(实例变量)
二、static可以修饰:属性,方法,代码块,内部类。
- 实例变量:当创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值被修改。
- 静态属性:当创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
1.静态变量随着类的加载而加载,可以通过"类.静态变量"的方式进行调用
2.静态变量的加载要早于对象的创建
3.由于类只会加载一次,则静态变量在内存中也只会存在一份(存在方法区的静态域中)
二、使用static修饰方法:静态方法
- 随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
- 静态方法中,只能调用静态方法或者属性;非静态方法中,既可以调用非静态方法或属性,也可以调用静态方法的方法或属性
- 在静态方法内,不能使用this关键字,super关键字
final关键字
package C_final;
import org.junit.Test;
final:
1.final可以修饰结构,类,方法,变量。
2.final用来修饰一个类:此类不能被其他类所继承。
比如:String类、System类、StringBuffer类
3.final修饰的方法不能被重写
4.final用来修饰变量:此时的“变量”称为一个常量
5.final修饰属性,可以考虑的位置有:显示初始化,代码块中初始化,构造方法初始化
6.final修饰局部变量:final修饰形参时,表明形参是常量。当调用此方法时,给常量形参赋值一个实参,一旦赋值后,
就只能在方法体内使用此形参,但是不能重新赋值。
7.static final 用来修饰属性:全局常量
public class FinalTest {
int width = 10;
final int length = 20;//显示初始化
final int X1;
final int X2;
public void doWidth(){
width = 20;
}
/*public void doLength(){//错误
length = 30;
}*/
{//代码块中初始化
X1 = 10;
}
public FinalTest(){//构造方法初始化
X2 = 80;
}
public void show(){//final修饰局部变量
final int NUM = 10;//常量
//NUM += 20;
}
public void show(final int num){//final修饰形参,在方法体内不能改变
//num = 30;//错误
System.out.println(num);
}
}
复习:P336-P340