zoukankan      html  css  js  c++  java
  • 聊聊Java中面向对象的this指针以及static修饰符

    1、this指针

    1.1、什么是this 指针

    • JAVAthis 是指代类 自身实例化的一个对象。
    • 可以理解为 对象本身的一个指针。更准确的说, this 代表当前对象的一个引用。

    1.2、this的作用用法:

    • 普通的直接引用
      • 区分类成员属性和方法的形参
      • 调用当前对象的其他方法
      • 位置:在该类的任意位置都可以使用
    • 区分形参与成员名字重写, 用this来区分
    • 引用构造函数
      • 使用this来调用其他的构造方法
        • 当构造方法中需要使用其他构造方法,直接使用 this(..)
        • 且需要注意 java: 对this在构造方法中调用调用构造方法时 必须是构造器中的第一个语句
      • 位置必须是第一条语句
    • this 不能用于 static 方法。

    package com.study.Java面向对象;
    
    public class Teacher {
    
        String name;
        int age;
    
        /**
         * 无参构造方法
         */
        public Teacher() {
            System.out.println("无参构造");
            System.out.println(name);
            System.out.println(age);
        }
    
    
        public Teacher(String name){
            this.name =name;
        }
        /**
         * 有参构造方法
         */
        public Teacher(String name, int age) {
            // java: 对this的调用必须是构造器中的第一个语句
    //        System.out.println("有参构造");
            this(name);
            this.age = age;
            System.out.println(this.name);
            System.out.println(this.age);
    
        }
    
    
    
        public static void main(String[] args) {
            System.out.println("---无参的情况---");
            Teacher teacher1 = new Teacher();
            System.out.println("----有参数的情况----");
            Teacher teacher2 = new Teacher("qzk", 28);
        }
    }
    

    2、static 关键字

    1、static 声明的类属性

    • 在类中, static关键字 声明的成员变量为静态成员变量,或者叫做: 类属性 、类变量
    • 类变量 (类属性) 属于类, 被该类的所有实例共享,在类被载入时,显式的初始化。
    • 对该类的所有对象来说,static 成员变量 只有一份,被该类的所有变量共享。
    • 可以使用 "对象.类属性"来调用, 不过,一般使用 "类名.类属性"调用
    • static 类属性, 放置在 方法区中。
    • 注意:
      • 静态变量,即 类属性、类方法 , 在类被载入之前就被初始化了。
      • 成员变量,放在堆中, 而静态变量放在方法区中。
      • 定义静态变量时候, 必须在方法外,不能再成员方法内 ,也不能在静态方法内。
    package com.study.Java面向对象;
    
    /**
     *
     * static  修饰成员变量的时候, 表示 静态成员变量, 或者类成员变量。
     *  - 普通变量在使用的时候必须 必须对类进行实例化后生成对象调用
     *  - 类变量或静态变量可以使用 类名直接调用,也可以使用对象来调用
     *  - 在定义对象的时候, static 定义的成员变量在方法区中
     * @Author:qzk
     * @Date: 2021/11/9 7:41 下午
     */
    public class StaticDemo {
    
        String name = "张三";
        static int age = 18;
    
        public static void main(String[] args) {
            StaticDemo staticDemo = new StaticDemo();
            System.out.println(staticDemo.name);
            //  这样其实也可以使用 静态变量, 也就是对象也可以使用 类的静态变量, 只是一般不这么写, 而是在在整个类中直接引用。
            System.out.println(staticDemo.age);
            System.out.println(age);  // 10
            System.out.println(StaticDemo.age); // 10
    //        java: 无法从静态上下文中引用非静态 变量 name
    //        System.out.println(StaticDemo.name);
    
            staticDemo.age = 20;
            System.out.println(StaticDemo.age); // 20
            System.out.println(staticDemo.age); //  20
    
            StaticDemo.age = 40;
            System.out.println(staticDemo.age);  // 40
            System.out.println(StaticDemo.age); // 40
    
    
            StaticDemo staticDemo1 = new StaticDemo();
            System.out.println(staticDemo1.age); // 40
            System.out.println(StaticDemo.age); // 40
        }
    
        /**
         * 下面这么写是报错的, 原因是 静态变量的声明不能在实例化的类中声明,下面的方法的调用是需要实例化对象, 实例化对象的方法中不能声明静态变量。
         * */
    //    public void  test(){
    //        static int a =10;
    //    }
      
    //    public static void  test(){
    //        static int a =10;
    //    }
            
    }
    
    

    2、static 声明的类方法

    • static 声明的静态方法, 不需要实例化对象, 就可直接调用。 类名.静态方法
    • 在调用的时候, 不会将对象的引用传递给他
      • 所以 static 方法中, 不可访问 非 static 成员
      • 静态方法 不可以以任何方法引用thissuper 关键字。
        • static 申明的 变量和方法在对象被创建之前就有了
        • 一般工具类中的方法定义时, 使用 static
    package com.study.Java面向对象;
    
    import java.util.Stack;
    
    /**
     *
     * static  修饰成员变量的时候, 表示 静态成员变量, 或者类成员变量。
     *  - 普通变量在使用的时候必须 必须对类进行实例化后生成对象调用
     *  - 类变量或静态变量可以使用 类名直接调用,也可以使用对象来调用
     *  - 在定义对象的时候, static 定义的成员变量在方法区中
     * @Author:qzk
     * @Date: 2021/11/9 7:41 下午
     */
    public class StaticDemo {
    
        String name = "张三";
        static int age = 18;
    
        public static void test1(){
            //  静态方法中不能直接调用 非静态方法
            // test2();
            // 静态方法中不能调用  静态变量
    //        this.name = "李四";
            //  静态方法中可以调用静态变量
            System.out.println(StaticDemo.age);
            // 如果真的想用 非静态方法需要new一个对象出来再调用
            StaticDemo staticDemo = new StaticDemo();
            staticDemo.test2();
            System.out.println("static - test");
        }
    
        public void test2(){
            //  非静态方法中可以调用静态方法
    //        test1();
            System.out.println("no - static -test");
        }
    
    
        public static void main(String[] args) {
            StaticDemo staticDemo = new StaticDemo();
            // 一般不这么写
    //        staticDemo.test1();
            StaticDemo.test1();
        }
    
    }
    
    

    3、常见错误集锦

    3.1、错误示例一: 在静态方法中使用类this

    3.2、错误示例二: 在方法中不能声明静态变量

    4、static 修饰 与 非 static 修饰的区别

  • 相关阅读:
    IP地址
    ACL访问控制列表
    DHCP原理及配置
    VRRP原理及配置
    ASP.NET CORE RAZOR :向 Razor 页面应用添加模型
    HBuilder + PHP开发环境配置
    添加相关功能
    基于stm32的水质监测系统项目基础部分详细记录
    表单数据验证方法(二)——ASP.NET后台验证
    表单数据验证方法(一)—— 使用validate.js实现表单数据验证
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/15530836.html
Copyright © 2011-2022 走看看