执行顺序
构造代码块->构造方法->对象创建成功->调用方法(局部代码块)
构造方法
概念
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
构造方法的主要功能就是完成对象创建或者初始化
当类创建对象(实例化)时,就会自动调用构造方法
构造方法与普通方法一样也可以重载.
形式
方法格式:修饰符 返回值类型 方法名(参数列表){方法体;}
构造方法格式:修饰符 类名(参数列表){方法体;}
- 每个类中默认存在无参构造方法
普通方法格式:修饰符 返回值类型 方法名(参数列表){方法体;}
构造方法格式:修饰符 类名(参数列表){方法体;}
- 每次创建对象时,都会自动触发对象的构造方法来创建对象
方法重载:在同一个类中,存在多个方法名相同但参数列表不同的方法
- 构造方法也存在重载的现象:无参构造、含参构造、全参构造
- 如果提供了含参构造,默认的无参构造会被覆盖
如果想继续使用无参构造创建对象,就必须手动提供无参构造
public class TestConstructor { public static void main(String[] args) { //4.创建对象进行测试 People p = new People(100); People p1 = new People(); System.out.println(“姓名:” + p.name + “,性别:” + p.gender + “,年龄:” + p.age);//查看p对象属性值 p.eat();//通过p对象调用eat()方法 } }
//1.创建一个People类,把人的相关特征与行为封装为一个类组件 class People{ //2.属性/字段—成员变量 String name; int age; String gender; / 1.每个类中默认存在无参构造方法 方法格式:修饰符 返回值类型 方法名(参数列表){方法体;} 构造方法格式:修饰符 类名(参数列表){方法体;} 2.每次创建对象时,都会自动触发对象的构造方法来创建对象 方法重载:在同一个类中,存在多个方法名相同但参数列表不同的方法 3.构造方法也存在重载的现象:无参构造、含参构造、全参构造 4如果提供了含参构造,默认的无参构造会被覆盖 如果想继续使用无参构造创建对象,就必须手动提供无参构造 /
public People(){
System.out.println("我是People类的无参构造方法!");
}
//3.功能--方法
public void eat(){
System.out.println("干饭人,干饭魂");
}
//创建一个含参构造方法
public People(int a){
System.out.println("我是People类的含参构造方法" + a);
}
}
<a name="FjNpz"></a>
# 代码块
<a name="vP4RI"></a>
## 构造代码块
<a name="XkiKg"></a>
### 语法结构
{代码}
<a name="vI2G4"></a>
### 特点
_位置:类里方法外<br />执行时机:创建对象时执行,并且优先于构造方法执行<br />作用:用于提取所有构造方法的共性功能_
<a name="lh85X"></a>
## 局部代码块
<a name="lVcVi"></a>
### 语法结构
{代码}
<a name="D9Yix"></a>
### 特点
_位置:方法里<br />执行时机:调用该代码块所在的方法时执行<br />功能:控制变量的适用范围,变量只能在局部使用,在局部代码块之外会失效_
<a name="Qqlzs"></a>
## 示例
```java
package cn.tedu.oop;
/**
* 用于测试代码块
*/
public class TestBlock {
public static void main(String[] args) {
Teacher t = new Teacher();
Teacher t1 = new Teacher("计算机组成原理");
t.sleep();
}
}
//创建一个老师类用于测试数据
class Teacher{
String subject;
String country;
/*
创建一个构造代码块
位置:类里方法外
执行时机:创建对象时执行,并且优先于构造方法执行
作用:用于提取所有构造方法的共性功能
*/
{
country = "华夏";
System.out.println("构造代码块");
}
public Teacher(){
System.out.println("我是一个没有感情的无参构造方法。" + country);
}
public Teacher(String subject) {
this.subject = subject;
System.out.println("我是一个感情丰富的全参构造方法。" + country);
}
public void sleep(){
/*
创建一个局部代码块
位置:方法里
执行时机:调用该代码块所在的方法时执行
功能:控制变量的适用范围,变量只能在局部使用,在局部代码块之外会失效
*/
{
System.out.println("局部代码块");
}
}
}
this
概念
this代表本类对象的一个引用对象
this代表的是本类,指定的也是本类的资源,例如成员变量
- 当成员变量与局部变量重名时,用于指定成员变量
- 可以实现构造方法间的调用
(1)格式
无参构造调用—this();
含参构造—this(参数); - 注意事项:构造方法的调用不能互相调用,是单向的,不然会报错
- 构造方法的调用必须出现在第一行
形式
this.name = name;
示例
this在变量名相同时使用
```java package cn.tedu.oop;
/**
- 用于测试成员变量与局部变量同名是,this的使用情况 */
public class TestThis1 { public static void main(String[] args) { Cat c = new Cat(); c.jump(); } }
// class Cat{ int sum = 100; String s = “书读千遍,其意自见”;
public void jump(){
int sum = 10;
System.out.println(sum);
System.out.println(this.sum);
System.out.println(this.s);
}
}
<a name="YaDni"></a>
### this在构造方法间的调用·
_**构造方法的调用只能是单项调用,不能互相调用**_<br />_**this调用构造方法的语句必须在第一行**_
```java
package cn.tedu.oop;
/**
* 用于测试构造方法间的互相调用
*/
public class TestThis2 {
public static void main(String[] args) {
Game g = new Game();
Game g1 = new Game("马里奥制造");
//不能按照调用普通方法的格式去调用构造方法
}
}
class Game{
public Game() {
/*
在无参构造中调用含参构造的格式
构造方法的调用只能是单项调用,不能互相调用
this调用构造方法的语句必须在第一行
*/
this("任天堂明星大乱斗");
System.out.println("无参构造");
}
public Game(String name){
/*
在含参构造中调用无参构造的格式
*/
//this();
System.out.println(name);
}
}