构造方法
Student student = new Student(); // Student()就是构造方法
.java(程序员写代码的文件)
// 先定义一个类
public class A {
}
.class(经过编译后生成)
// 这个类实际编译的代码
public class A {
// 默认带一个无参的构造方法
public A () {
}
}
// 可以自己定义构造方法
.java
public class A {
A(int a) {
...
}
A(int a, int b) {
...
}
}
.class
public class A {
// 无参的构造方法没有了,被有参的覆盖了
public A(int a) {
...
}
public A(int a, int b) {
...
}
}
-
与类名相同、没有返回值的方法叫构造方法。(普通方法也可以与类名一样)
-
每个类都有构造方法,不写默认为无参的构造方法。
-
若自己指定构造方法,那么构造方法可重载;没有指定无参构造方法时,有参的构造方法会覆盖之前默认附带的无参构造方法。
静态方法
public class student{
static int id; // 静态变量/类变量
// static int id = test(); // √ -> static调用static
int age; // 实例变量
// int age = test(); // × -> 只能static调用static
string name;
// 代码块
{
...
}
// 静态块
static {
...
}
// 静态方法/类方法
static int test() {
...
}
public static void main(String[] args) {
System.out.println(Student.id); // 通过类名访问静态变量
Student.test(); // 通过类名调用静态方法
}
}
-
由static修饰的变量、方法叫静态变量、静态方法;因为是类特有的属性,所以也叫类变量、类方法。
-
静态变量、静态方法可通过类名访问。
-
static内容是类共有的;
static内容会在类加载时分配,而不是对象创建时;
sttaic内容会在第一个对象初始化之前完成,后续对象初始化不再执行(只执行一次)。
-
静态变量的赋值只能调用静态方法。
以下情况会加载类:
-
访问类的静态变量,或为静态变量赋值。
-
new创建类的实例。
-
调用类的静态方法。
-
子类初始化。
-
反射。
构造方法、静态内容执行顺序
public class Student {
static int id;
String name;
int age;
Student(int a){
System.out.println("1个参数的构造方法");
}
Student(){
System.out.println("0个参数的构造方法");
}
static void test1() {
// 类方法可操作类变量
id = 1;
// age = 5; 类方法不可操作实例变量
System.out.println("静态方法1");
}
static void test2() {
System.out.println("静态方法2");
}
{
System.out.println("代码块");
}
static {
System.out.println("静态块");
}
// 实例方法可以调用类变量
void test3() {
id = 5;
}
public static void main(String[] args) {
Student student = new Student();
Student student2 = new Student(1);
}
}
执行结果:
静态块
代码块
0个参数的构造方法
代码块
1个参数的构造方法
执行顺序:
-
静态块和静态变量初始化,二者顺序与代码顺序决定(只执行一次)。
-
代码块和实例变量初始化,二者顺序与代码顺序决定。
-
构造方法。
两个面试的笔试题
1.以下说法正确的是()
A.class中的constructor不可省略
B.constructor必须与class同名,但方法不能与class同名
C.constructor在一个对象被new时执行
D.一个class只能定定义一个constructor
答案:C
2.以下说法正确的是()
A.实例方法可以通过类名调用
B.类方法可以通过类名调用
C.实例方法可以操作实例变量、类变量
D.类方法可以操作实例变量、类变量
答案:BC