1.代码块
代码块,简单来讲,就是用“{}”括号括起来的一段代码,根据位置及声明关键字的不同,代码块可以分为4种:普通代码块、构造块、静态代码块、同步代码块。
普通代码块
public class Example12 {
public static void main(String[] args) {
{
int age = 18;
System.out.println("这是普通代码块。age:"+age);
}
int age = 30;
System.out.println("age:"+age);
}
}
构造块
public class Student {
String name;
{
System.out.println("我是构造代码块");
}
public Student(){
System.out.println("我是Student的构造方法");
}
}
public class Example12 {
public static void main(String[] args) {
Student stu1=new Student();
Student stu2=new Student();
}
}
静态代码块
在Java类中,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常使用静态代码块对类的成员变量进行初始化。
public class Student {
String name;
{
System.out.println("我是构造代码块");
}
static {
System.out.println("我是静态代码块");
}
public Student(){
System.out.println("我是Student类的构造方法");
}
}
public class Example16 {
public static void main(String[] args) {
Student stu1=new Student();
Student stu2=new Student();
Student stu3=new Student();
}
}
从运行结果可以看出,代码块的执行顺序为静态代码块、构造代码块、构造方法。 static修饰的量会随着class文件一同加载,属于优先级最高的。在main()方法中创建了3个Student对象,但在3次实例化对象的过程中,静态代码块中的内容只输出了一次,这就说明静态代码块在类第一次使用时才会被加载,并且只会加载一次。
静态属性
如果在Java程序中使用static修饰属性,则该属性称为静态属性(也称全局属性),静态属性可以使用类名直接访问,访问格式如下:
类名.属性名
public class Student {
String name;
int age;
static String school="A大学";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void info(){
System.out.println("姓名"+this.name+",年龄"+this.age+",学校"+school);
}
}
public class Test {
public static void main(String[] args) {
Student stu1=new Student("张三",18);
Student stu2=new Student("李四",19);
Student stu3=new Student("王五",20);
stu1.school="B大学";
stu1.info();
stu2.info();
stu3.info();
}
}
在运行结果中可以发现,只修改了一个stu1对象的学校属性,stu1和stu2对象的school属性内容都发生了变化,说明使用static声明的属性是对所有对象共享的。
静态方法
如果想要使用类中的成员方法,就需要先将这个类实例化,而在实际开发时,开发人员有时希望在不创建对象的情况下,通过类名就可以直接调用某个方法,要实现这样的效果,只需要在成员方法前加上static关键字,使用static关键字修饰的方法通常称为静态方法。
同静态变量一样,静态方法也可以通过类名和对象访问,具体如下所示。
类名.方法
或
实例对象名.方法
使用示例
public class Student {
private String name;
private int age;
private static String school="A大学";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static String getSchool() {
return school;
}
public static void setSchool(String school) {
Student.school = school;
}
public void info(){
System.out.println("姓名"+this.name+",年龄"+this.age+",学校"+school);
}
}
public class Example15 {
public static void main(String[] args) {
Student stu1=new Student("张三",18);
Student stu2=new Student("李四",19);
Student stu3=new Student("王五",20);
stu1.setAge(20);
stu2.setName("小明");
Student.setSchool("b大学");
stu1.info();
stu2.info();
stu3.info();
}
}
ps:静态方法只能访问静态成员,因为非静态成员需要先创建对象才能访问,即随着对象的创建,非静态成员才会分配内存。而静态方法在被调用时可以不创建任何对象。