构造方法
对象的属性进行初始化
在创建对象的同时,初始化属性的值
如何定义构造方法
构造方法的形式:
------------------------------
权限修饰符 类名([参数列表]){
语句;
}
------------------------------
特点:
- 构造方法没有返回值,就算void也不能有,这点与Java方法(或叫函数)不一样;
- 一个类中默认无参构造方法,但是当定义了一个有参构造方法时,则默认无参构造方法隐藏,即会报错;
- 构造方法不允许final和static修饰;
- 一个类中根据需要可以定义多个构造方法,这是重载的体现。
- 为了简化代码,类中构造方法可以互相调用,this(实参列表),但必须置于有效代码的第一行
注意:在Java中,当我们定义了一个类之后,如果没有定义构造方法,则JVM在运行时会自动生成 如果我们定义了构造方法,则不会在生成无餐构造
最佳实践:在java中,当定义了一个类后,不管有没有写其他的构造函数,无参的构造一定要写一个
public class Student {
public String name; // 成员变量
public int age; // 成员变量
// //有参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 方法重载
public Student(String name) {
this.name = name;
}
public static void main(String[] args) {
Student st1 = new Student("小赵", 16);
Student st2 = new Student("小赵");
System.out.println(st1.name); // 小赵
System.out.println(st1.age); // 16
System.out.println(st2.name); // 小赵
System.out.println(st2.age); // 0 ---- age属性的(int类型)默认值为0
}
}
this关键字
在Java中,this的关键字,this关键字是一个指针
在类中,this默认指向当前类
如果构造对象,当对象构造完成后,会有一个this指向当前对象
1.通过this关键字可以明确的访问一个类的成员变量,解决与局部变量名称冲突问题
public class Student {
public String name; // 成员变量
public int age; // 成员变量
// //有参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
2.通过this关键字调用成员方法
public class Student {
public void A(){
System.out.println("A方法执行了......");
}
//在B()方法中通过this.A()访问A()方法,注意此处的this关键字可以不写,效果是一样的
public void B(){
this.A();//调用A()方法
A();//此处的this也可也省略
}
}
3.在构造方法中访问构造方法使用this([参数1,参数2,…])
public class Student {
String name;//成员变量name
// 无参构造方法
public Student() {
System.out.println("这是无参构造方法....");
}
public Student(String name) {
this();//调用无参构造方法
this.name = name;
}
public void print(){
System.out.println("姓名:" + name);
}
public static void main(String[] args) {
Student student = new Student("小赵");
student.print();
}
}
---输出---
这是无参构造方法....
姓名:小明
----------
在使用this调用构造方法时有以下注意几点
- 只能在构造方法中使用this()调用其他的构造方法,不能在成员方法中使用
- 在构造方法中使用this()调用构造方法的语句必须位于第一行,而且只能出现一次
- 不能在一个类中的两个构造方法中使用this()互相调用
static关键字的使用
static : 静态的
Static的特点
1、static是一个修饰符,用于修饰成员
2、static修饰的成员被所有的对象所共享
3、static优先于对象存在,因为static的成员随着类的加载就已经存在了
4、static修饰的成员多了一种调用方式,即可以直接被类名调用。类名.静态变量
5、static修饰的数据是共享数据,对象中的存储的是特有数据
public class Student {
// 非静态变量
public String name;
// 静态变量
public static int age = 22;
public static void main(String[] args) {
//通过先建对象调用
Student st1 = new Student();
System.out.println(st1.age);
//直接通过类名调用
System.out.println(Student.age);
}
}
static可以修饰java的类、属性、方法
static如果修饰类,只能修饰内部类,等我们讲解内部类的时候再说
static可以修饰属性,如果使用static修饰属性,该属性就是静态属性属于类
static可以修饰方法,静态方法,属于类。
------
static可以直接单独使用,被static单独使用的语法块,静态块
静态块:静态块,会最先被类加载,而且只加载一次!!!
-----
static也可以修饰import
import static 包.*
static修饰的东西,提前加载内存中
在类中:
正常的属性和方法,都是为对象提供的,都是属于对象
类型 对象名称 = new 构造函数();
对象名称.属性
对象名称.方法()
如果类里面的属性或者方法被static,那这些就属于类
类的成员
属性
方法
构造方法
静态代码块
静态方法
静态属性
构造代码块
构造代码块
直接定义在类中 { }
在类中没与任何的前缀或后缀,并使用"{}"括起来的代码片段.
相当于构造函数,在构造函数调用前会被触发
举个例子
public class Student {
{//构造代码块
System.out.println("执行构造代码块");
}
public Student() {
System.out.println("执行无参构造函数");
}
public Student(String string) {
System.out.println("执行有参构造函数");
}
}
等同于
public class Student {
public Student() {
System.out.println("执行构造代码块");
System.out.println("执行无参构造函数");
}
public Student(String string) {
System.out.println("执行构造代码块");
System.out.println("执行有参构造函数");
}
}
编译器会把构造代码块插入到每个构造函数的最前端
java中类成员在构造(对象创建的时候)的调用顺序
参考博客:https://blog.csdn.net/anticlql/article/details/74011018
- 属性
- 静态方法
- 构造方法
- 静态代码块
- 构造代码块
当一个类被初始化时
首先执行的是被static修饰部分:
根据顺序依次执行:
静态属性会被初始化
静态代码块(只加载一次)被触发
当static修饰的部分结束后:
开始执行普通属性和构造代码块
谁先执行,还是看顺序
构造函数开始构造对象