前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面向对象基础(4)this关键字和static关键字

Java面向对象基础(4)this关键字和static关键字

作者头像
徐建国
发布2021-08-03 15:46:58
2120
发布2021-08-03 15:46:58
举报
文章被收录于专栏:个人路线

this关键字

对象创建的过程和this的本质

  构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步:

  1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显示初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

  this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

  this最常的用法:

  1. 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。

  2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。

  3. this不能用于static方法中。

代码语言:javascript
复制
package javastart;
/**
 * 通过this 调用构造器
 * @author 玖点夜谈
 *
 */
public class TestThis {
    int a, b, c;
 
    TestThis() {
        System.out.println("正要初始化一个Hello对象");
    }
    TestThis(int a, int b) {
        // TestThis(); //这样是无法调用构造方法的!
        this(); // 调用无参的构造方法,并且必须位于第一行!
        a = a;// 这里都是指的局部变量而不是成员变量
// 这样就区分了成员变量和局部变量. 这种情况占了this使用情况大多数!
        this.a = a;
        this.b = b;
    }
    TestThis(int a, int b, int c) {
        this(a, b); // 调用带参的构造方法,并且必须位于第一行!
        this.c = c;
    }
 
    void sing() {
    }
    void eat() {
        this.sing(); // 调用本类中的sing();
        System.out.println("你妈妈喊你回家吃饭!");
    }
 
    public static void main(String[] args) {
        TestThis hi = new TestThis(2, 3);
        hi.eat();
    }
}

static 关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:

  1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。

  2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!

  3. 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)

  4. 在static方法中不可直接访问非static的成员。

核心要点:

static修饰的成员变量和方法,从属于类。

普通变量和方法从属于对象的。

代码语言:javascript
复制
package javastart;
/**
 * 测试 static关键字用法
 * @author 玖点夜谈
 *
 */

public class Teststatic {
    int id; // id
    String name; // 账户名
    String pwd; // 密码
     
    static String company = "玖点夜谈"; // 公众号名称
     
     
    public Teststatic(int id, String name) {
        this.id = id;
        this.name = name;
    }
     
    public void login() {
        printCompany();
        System.out.println(company); 
        System.out.println("登录:" + name);
    }
     
    public static void printCompany() {
//         login();//调用非静态成员,编译就会报错
        System.out.println(company);
    }
     
    public static void main(String[] args) {
        Teststatic u = new Teststatic(101, "萌小肆");
        Teststatic.printCompany();
        Teststatic.company = "玖点夜谈";
        Teststatic.printCompany();
    }
}

静态初始化块

构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。

注意事项:

  静态初始化块执行顺序(学完继承再看这里):

  1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。

  2. 构造方法执行顺序和上面顺序一样!!

代码语言:javascript
复制
package javastart;

/**
 * static初始化块
 * @author 玖点夜谈 
 *
 */
public class Teststatic01 {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
    static String company; //公司名称
    static {
        System.out.println("执行类的初始化工作");
        company = "玖点夜谈";
        printCompany();
    }   
    public static void printCompany(){
        System.out.println(company);
    }   
    public static void main(String[] args) {
        Teststatic01  u3 = new Teststatic01();
    }
}

参数传值机制

 Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。

· 基本数据类型参数的传值

  传递的是值的副本。副本改变不会影响原件。

· 引用类型参数的传值

  传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”

代码语言:javascript
复制
package javastart;

/**
 * 测试参数传值机制
 * @author 玖点夜谈
 *
 */
public class Test12 {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
       
    public Test12(int id, String name) {
        this.id = id;
        this.name = name;
    }
      
    public   void   testParameterTransfer01(Test12  u){
        u.name="萌小肆";
    }
     
    public   void   testParameterTransfer02(Test12  u){
        u  =  new  Test12(200,"雨露");
    }
      
    public static void main(String[] args) {
        Test12   u1  =  new Test12(100, "科技");
         
        u1.testParameterTransfer01(u1); 
        System.out.println(u1.name);
 
        u1.testParameterTransfer02(u1);
        System.out.println(u1.name);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 明天也要加油呀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档