Java08--构造方法+构造代码块和局部代码块+this

1 构造方法

1.1 概念

构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法。

构造方法和其他方法一样也可以重载。

1.2 形式

可以无参也可以有参

修饰符  类名(【参数】){

       代码……

}

1.3 练习1:构造方法创建对象

创建对象时的两种方法

package day006;
public class Test2_构造方法 {
       String name;
//当存在一个含参的构造方法时,无参构造将不再自动生成...    
//public Test2_构造方法(){}

              //含参构造
       public Test2_构造方法(String n){
              name=n;
       }
       void eat(){
              System.out.println("Test2_构造方法.eat()");
       }
}
class tt{
       public static void main(String[] args) {
//注释掉无参的构造也可以运行,说明系统会自动提供一个无参的构造方法
              Test2_构造方法 t2 = new Test2_构造方法();
              t2.eat();        
//t是引用变量,引用的是对象的地址值。
              //根据地址值找到对象,并获取对象的数据
              Test2_构造方法 t = new Test2_构造方法("张三");
              System.out.println(t.name);
       }
}

1.4 练习2:构造方法赋值

package day006;
public class Test3_成员变量赋值 {
       String name;
       int age;
       //赋值方式1:通过含参构造方法赋值
       public Test3_成员变量赋值(String name,int age){
              this.name=name;
              this.age=age;
       }
       //赋值方式2:通过setXxx()方法赋值
       public void setName(String name){
              this.name=name;
       }
       public void setAge(int age){
              this.age=age;

       }
}

class Test3Demo{

       public static void main(String[] args) {

              //赋值方式1:通过无参构造方法赋值

              Test3_成员变量赋值 t1= new Test3_成员变量赋值();

              System.out.println(t1.name);

              System.out.println(t1.age);
             
              //赋值方式1.1:通过含参构造方法赋值

              Test3_成员变量赋值 t2= new Test3_成员变量赋值("zhangsan",30);

              System.out.println(t2.name);

              System.out.println(t2.age);

              //赋值方式2:通过setXxx()方法赋值

              Test3_成员变量赋值 t3= new Test3_成员变量赋值();

              t3.setName("rose");

              t3.setAge(25);

              System.out.println(t3.name);

              System.out.println(t3.age);

       }

}

2 构造代码块和局部代码块

2.1 构造代码块

1、 在类的内部,方法外部,的代码块。

2、 通常用于抽取构造方法中的共性代码。

3、 每次调用构造方法前都会调用构造代码块

4、 优先于构造方法加载

class c{
       String country;
       {
              country="中国";
       }
       public c() {
              System.out.println("1号选手,来自"+country);
       }
       public c(int a) {
              System.out.println("2号选手,也来自"+country);
       }
}

2.2 局部代码块

1、 在方法里面的代码块

2、 通常用于控制变量的作用范围,出了括号就失效

3、 变量的范围越小越好,成员变量会有线程安全问题

4、 总结:执行顺序:

构造代码块是最优先的,局部代码块顺序执行

2.3 练习1:代码块加载顺序

package day99999;
public class TT {
       public static void main(String[] args) {
              Student s = new Student();
              s.init();
       }
}

class Student{
       {
              System.out.println("构造代码块1");
       }
       public void init(){
              {
                     System.out.println("局部代码块");

              }
       }
       {
              System.out.println("构造代码块2");
       }
}

3 this 关键字

3.1 概念

this代表本类对象的一个引用对象。

构造函数中,this()必须放在第一行。

3.2 形式

//name=name;

//age=age;

其实是想把Student类的局部变量name的值赋值给成员变量,相当于你想操作是这样的:

//Student.name=name;

但是你不能直接写类名,这时候就用代表本类的对象this来完成。代码变成了:

this.name=name;

3.3 练习1:当变量名相同时

当局部变量和成员变量同名时,用于区分。

如果附近有同名变量,会遵从变量的就近原则,那么怎么调用成员变量呢?

package day99999;
public class T {
       public static void main(String[] args) {
              Animal a = new Animal();
              a.run("大黄");
              System.out.println(a.name);
       }
}

class Animal{

       String name;

       /*

       //当局部变量的名字和成员变量不一样时简单,拿着局部变量的值直接给成员变量赋值就行了

       public void run(String n){

              name=n;

       }*/

       //问题来了,当局部变量和成员变量同名时呢??

       public void run(String name){

//name=name;//变量的就近使用原则,这样用的都是最近的也就是一直在用局部变量的

              this.name=name;//this调用成员变量

       }

}

3.4 练习2:构造方法间的调用

package day99999;
public class T {
       public static void main(String[] args) {
              Animal a = new Animal();

//           Animal a2 = new Animal("旺财");
       
       }
} 
class Animal{
       public Animal(){
              this("来福");//调用本类中的含参构造
              System.out.println(name);
       }

      
       public Animal(String name){
              System.out.println(name);
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值