文章目录
- 1.概念
- 2.形式
- 3.练习
- 4.关于构造函数的总结
- 5.构造代码块与局部代码块
- 5.1 形式
- 5.2 构造代码块的特点
- 5.3 局部代码块
- 5.4 练习
- 5.5 静态/构造/局部代码块的比较
1.概念
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
构造方法的主要功能就是完成对象创建或者初始化
当类创建对象(实例化)时,就会自动调用构造方法
构造方法与普通方法一样也可以重载.
2.形式
与类同名,且没有返回值类型,可以含参也可以不含参
3.练习
练习:构造方法创建对象/构造方法赋值
package partTwo;
/*本类用于测试构造方法*/
public class TestConstructor {
public static void main(String[] args) {
//4.创建Person类的对象进行测试
/* 每次new(实例化)对象时,都会自动触发对应类的构造方法*/
/* 每个类都会默认存在一个没有参数的构造方法
* 但是,如果你提供了其他的构造函数,默认的无参构造会被覆盖
* 所以,我们要手动的提供无参构造,这样才能不传参数,也能创建对象*/
Person p = new Person();
System.out.println(p.age);
System.out.println(p.name);
System.out.println(p.address);
p.eat();
//6.创建Person类的第二个对象
/*每次创建对象时,都会执行构造方法;
* 构造方法的作用就是用来创建对象的*/
Person p2 = new Person();
//7.触发含参构造
Person p3 = new Person(88);
//触发全参构造
Person p4 = new Person("张三",18,"柳树下");
System.out.println(p4.name);
System.out.println(p4.age);
System.out.println(p4.address);
}
}
//1.创造Person类,用来描述人这一事物
class Person{
//2.属性--成员变量
String name; //姓名
int age; //年龄
String address; //住址
/*构造方法的格式:没有返回值类型并且与类名同名的方法*/
//5.创造本类的无参构造
public Person(){
System.out.println("我是Person无参构造");
}
//6.创建本类的含参构造
public Person(int n){
System.out.println("我是Person的含参构造"+n);
}
//8.创建本类的全参构造
public Person(String name, int age, String address) {
this.name = name; //局部变量name的值赋值给this指定的成员变量name
this.age = age; //局部变量age的值赋值给this指定的成员变量age
this.address = address; //局部变量name的值赋值给address指定的成员变量address
System.out.println("我是Person的全参构造");
}
//3.功能--方法
public void eat(){
System.out.println("干饭不积极,思想有问题");
}
}
4.关于构造函数的总结
- 特点:方法名与类名相同,且没有返回值类型
- 执行时机:创建对象时立即执行
- 默认会创建无参构造,但是,如果自定义了含参构造,默认的无参构造会被覆盖,注意要手动添加
- 构造方法可以重载,根据其参数的不同分为无参构造,含参构造及全参构造
5.构造代码块与局部代码块
5.1 形式
{局部代码块}
5.2 构造代码块的特点
- 位置: 在类的内部,在方法的外部
- 作用: 用于抽取构造方法中的共性代码
- 执行时机: 每次调用构造方法前都会调用构造代码块
- 注意事项: 构造代码块优先于构造方法加载
5.3 局部代码块
- 位置: 在方法里面的代码块
- 作用: 通常用于控制变量的作用范围,出了花括号就失效
- 注意事项: 变量的作用范围越小越好,成员变量会存在线程安全的问题
5.4 练习
测试代码块的加载顺序
package partTwo;
/*
本类用于测试代码块
执行顺序:构造代码块>构造方法>对象创建成功>普通婆方法>局部代码块
1.当创建对象时,会触发构造函数
2,创建对象时,也会触发构造代码块,而且构造代码块优先于构造方法执行
3.我们通过创建好的对象来调用普通的方法
4.如果代用的普通方法里有局部代码块,对应的局部代码块才会执行
*/
import jdk.nashorn.internal.ir.CatchNode;
//本类用于测试代码块
public class TestBlock {
public static void main(String[] args) {
//创建小猫类对象
Cat c1 = new Cat();
Cat c2 = new Cat("缅因猫");
Cat c3 = new Cat();
c3.jump();
}
}
//创建小猫类用来测试
class Cat{
//2,定义属性
String food;
//创建代码块
{
/*构造代码块:
* 位置:类里方法外
* 执行时机:每次创建对象时,都会执行构造代码块,并且构造代码块优先于构造方法执行
* 作用:用于提取所有构造方法的共性功能 */
System.out.println("我是一个构造代码块");
System.out.println("今天的你真好看");
food = "小鱼干";
}
//3.1创建无参构造
public Cat(){
System.out.println("我是Cat的无参构造"+food);
}
public Cat(String s){
System.out.println("我是小猫的含参构造"+s+food);
}
//4.创建普通方法
public void jump(){
System.out.println("小猫跳的老高了");
//创建局部代码块
{
/*
局部代码块
位置:方法里
执行时机:代用本局部代码块所处的方法时才会执行
作用:控制变量的使用范围,变量的作用范围要越小越好
*/
System.out.println("我是一个局部代码块");
int i = 100;
System.out.println(i);
}
//System.out.println(i);局部变量i只能在局部代码块里用
}
}
执行顺序为:构造代码块>构造方法>对象创建成功>普通婆方法>局部代码块
5.5 静态/构造/局部代码块的比较
- 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
- 局部代码块:方法里的代码块,限制局部变量的范围