this和static

this和static关键字、拓展方法 public Student(string name, int age):this() //调用此函数之前执行默认构造函数。//student调用了Studnet(name,age)构造函数,那么构造函数了的this就代表他。//静态构造函数,在第一次使用类名访问的时候,是会执行一次默认静态构造函数的,后面出现的不会。{ //定义静态函数,this代表这个函数是拓展方法,self就相当于实例化了一个对象。⑤当一个类中以上的都是静态,那么自己也是静态类,所以当定义了静态类,那么其成员只能是静态类型。 阅读详情

this和static

1 this

1.1 this概述

  1. this是一个关键字,全部小写。
  2. 一个对象是一个this。this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身。所以严格意义上来说,this代表的就是“当前对象”,this存储在堆内存当中对象的内部。
  3. this只能使用在实例方法中。谁调用这个实例方法,this就是谁。所以this代表的是:当前对象。
  4. this大部分情况下是可以省略的。
  5. this不能用在静态方法中,因为this代表当前对象,静态方法中不存在当前对象。

1.2 this在实例方法中

/**
 * @author wcs
 * @date 2021/8/7 10:27
 */
public class ThisTest01 {
    public static void main(String[] args) {
        Student stu1 = new Student();
        stu1.setNo(111111);
        stu1.setName("张三");
        System.out.println(stu1.getNo());
        System.out.println(stu1.getName());

        Student stu2 = new Student(222222, "李四");
        System.out.println(stu2.getNo());
        System.out.println(stu2.getName());
    }
}

class Student {
    private int no;
    private String name;

    public Student() {
    }

    public Student(int no, String name) {
        this.no = no;//this不能省略
        this.name = name;// this不能省略
    }

    public int getNo() {
        return no;//其实返回的是this.no,这里的this可以省略
    }

    public void setNo(int no) {
        this.no = no;//this不能省略
    }

    public String getName() {
        return name;//其实返回的是this.name,这里的this可以省略
    }

    public void setName(String name) {
        this.name = name;//this不能省略
    }
}

以上代码当中this.name = name,其中this.name表示实例变量name,等号右边的name是局部变量name,此时如果省略“this.”,则变成name = name,这两个都是局部变量,和实例变量name无关了,显示是不可以省略“this.”的。

最终结论是,this不能出现在static的方法中,可以出现在实例方法中,代表当前对象,大部分情况下this可以省略,只有当在实例方法中区分局部变量和实例变量的时候不能省略。

1.3 this在构造方法中

this还有另外一种用法,使用在构造方法的第一行,通过当前构造方法调用本类当中其他的构造方法,其目的是为了代码服用。调用时语法格式:this(实际列表参数)。

示例:调用无参构造方法时默认日期为1970-1-1。

//创建日期类
/**
 * @author wcs
 * @date 2021/8/7 11:06
 */
public class Date {
    private int year;
    private int month;
    private int day;

    public Date() {
        this.year = 1970;
        this.month = 1;
        this.day = 1;
    }

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}



//测试类
/**
 * @author wcs
 * @date 2021/8/7 11:09
 */
public class DateTest {
    public static void main(String[] args) {
        Date d1 = new Date();
        System.out.println(d1.getYear() + "年" + d1.getMonth() + "月" + d1.getDay() + "日");
        Date d2 = new Date(2020, 2, 2);
        System.out.println(d2.getYear() + "年" + d2.getMonth() + "月" + d2.getDay() + "日");
    }
}

运行结果:

image-20210807111519438

无参数构造和有参数构造对比:

image-20210807112017116

以上程序中无参构造方法中的代码和有参构造方法中的代码是一样的,代码没有得到复用性,这个时候就可以在无参构造方法中使用“this(实际参数列表);"来调用有参数的构造方法,这样可以让代码得到复用性。

    public Date() {
        this(1970,1,1);//使用this()调用有参构造方法
    }
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

DateTest测试结果:

image-20210807111519438

注意:this()语法只能出现在构造方法的第一行,在其他位置都会报错。

2 static

2.1 static概述

  1. static翻译为“静态”。

  2. 所有static关键字修饰的都是类相关的,类级别的。

  3. 所有static修饰的,都是采用“类名.”的方式访问。

  4. static修饰的变量:静态变量

  5. static修饰的方法:静态方法

2.2 静态变量

变量的分类:

​ 变量根据声明的位置进行划分:

​ 在方法体当中声明的变量叫做:局部变量。

​ 在方法体外声明的变量叫做:成员变量。

​ 成员变量又可以分为:

​ 实例变量

​ 静态变量

/**
 * @author wcs
 * @date 2021/8/6 17:36
 */
public class VarTest01 {
    //以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。
    //实例相关的,必须先有对象才能访问,可能会出现空指针异常。
    //成员变量中的实例变量
    int i;

    //实例方法
    public void m1() {

    }

    //以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象
    //成员变量中的静态变量
    static int j;

    //静态方法
    public static void m2() {

    }
}

未使用静态变量的程序:

/**
 * @author wcs
 * @date 2021/8/6 19:06
 */
public class VarTest02 {
    public static void main(String[] args) {
        //创建m1对象并为m1对象设置属性值
        Man m1 = new Man(20, "张三", true);
        System.out.println("年龄:" + m1.age + " 姓名:" + m1.name + " 性别:" + (m1.sex ? "男" : "女"));

        //创建对象m2
        Man m2 = new Man(18, "李四", true);
        System.out.println("年龄:" + m2.age + " 姓名:" + m2.name + " 性别:" + (m2.sex ? "男" : "女"));

    }

}

class Man {
    int age;
    String name;
    Boolean sex;

    public Man(int _age, String _name, Boolean _sex) {
        age = _age;
        name = _name;
        sex = _sex;
    }
}

JVM内存图:

image-20210806195641940

“男人类”创建的所有“男人对象”,每个“男人对象”的年龄、姓名都不一样,该属性应该是每个对象都持有一份,所以应该定义为实例变量,而每一个“男人对象”的性别都是“男”,不会随着对象的改变而变化,性别值永远都是“男”,这种情况下,如果定义为实例变量,每个“男人对象”都有一份,在堆内存当中浪费空间,所以应该将“sex=男”属性定义为类级别,声明为静态变量,这样的变量不需要创建对象直接使用“类名.”访问。

public class VarTest02 {
    public static void main(String[] args) {
                //直接类名.进行访问
        System.out.println(Man.sex);
        
        //创建m1对象并为m1对象设置属性值
        Man m1 = new Man(20, "张三");       
        //使用引用来访问静态变量也是可以的(不建议)
        System.out.println("年龄:" + m1.age + " 姓名:" + m1.name + " 性别:" + (m1.sex ? "男" : "女"));

        //创建对象m2
        Man m2 = new Man(18, "李四");
        System.out.println("年龄:" + m2.age + " 姓名:" + m2.name + " 性别:" + (m2.sex ? "男" : "女"));


    }


}

class Man {
    int age;
    String name;
    //使用静态变量赋初始值
    static Boolean sex = true;

    public Man(int _age, String _name) {
        age = _age;
        name = _name;
    }
}

静态变量内存图:

image-20210806201412068

当一个类的所有对象的某个“属性值”不会随着对象的改变而改变的时候,建议将该属性定义为静态属性(也就是静态变量),静态变量在类加载的时候初始化,存储在方法去当中,不需要创建对象,直接通过“类名.”来访问。

上段代码中静态变量也使用了“引用”来访问静态变量,但实际执行过程中,“引用”所指的对象并没有参与。如果是空引用访问实例变量,程序也不会发生空指针异常,表面看起来是“引用”去访问,实际上还是直接通过”类“去访问。静态方法也是如此。

2.3 静态代码块

静态代码块在类加载时执行,并且只执行一次。

一般用于记录类加载的日志信息。

静态代码块语法格式:

类{
    //静态代码块
    static{
        Java语句;
    }
}

静态代码块测试1:

/**
 * @author wcs
 * @date 2021/8/6 20:55
 */
public class StaticTest01 {
    static {
        System.out.println(3);
    }

    public static void main(String[] args) {
        System.out.println("hello world");
    }

    static {
        System.out.println(2);
    }

    static {
        System.out.println(1);
    }
}

运行结果:

image-20210806205721425

通过以上的测试可以得知一个类当中可以编写多个静态代码块(尽管大部分情况下只编写一个),并且静态代码块遵循自上而下的顺序依次执行,所以有的时候放在类体当中的代码是有执行顺序的(大部分情况下类体当中的代码没有顺序要求,方法体当中的代码是有顺序要求的,方法体当中的代码必须遵守自上而下的顺序依次逐行执行),另外静态代码块当中的代码在 main 方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次。

静态代码块测试2:

/**
 * @author wcs
 * @date 2021/8/6 21:01
 */
public class StaticTest02 {
    //静态变量在方法区,类加载时初始化
    static int i = 10;

    //静态代码块也在方法区,类加载时执行
    static {
        System.out.println(i);
    }

    //在main方法执行前执行了以上代码
    public static void main(String[] args) {

    }
}

输出结果为:10

类体当中的代码也是有顺序要求的,静态代码块在类加载时执行,静态变量在类加载时初始化,它们在同一时间发生,所以必然会有顺序要求,如果在静态代码块中要访问 i 变量,那么i 变量必须放到静态代码块之前。

当然也是不可以访问实例变量,实例变量必须先创建对象才能访问,静态代码块在类加载时执行,那个时候对象还没有创建,所有不可以访问实例变量。

实例语句块

除了静态代码块之外,还有一种语句块叫做:实例语句块

实例语句块在类加载时并没有执行。

实例语句块语法格式:

类体{
    {
        Java语句;
    }
}

实例语句块在什么时候执行?

​ 只要是构造方法执行,必然在构造方法执行之前,自动执行”实例语句块“中的代码。

实例语句块测试:

/**
 * @author wcs
 * @date 2021/8/6 21:17
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("main begin");
        new Test();
        new Test();

        new Test("hello");
        new Test("world");
    }

    {
        System.out.println("实例语句执行");
    }

    public Test() {
        System.out.println("无参构造方法");
    }

    public Test(String test) {
        System.out.println("有参构造方法");
    }
}

运行结果:

image-20210806212529436

2.4 静态方法

方法实际上描述的是行为动作,我认为当某个动作在触发的时候需要对象的参与,这个应该定义为实例方法。例如:每个人都会考试,但是考试的分数不一样,显然这是因人而异,这个考试方法应该定义为实例方法。

示例:

/**
 * @author wcs
 * @date 2021/8/6 21:34
 */
public class StaticTest {
    public static void main(String[] args) {
        Student stu1 = new Student("张三");
        stu1.exam();
        Student stu2 = new Student("李四");
        stu2.exam();
    }
}

class Student {
    String name;

    public Student(String _name) {
        name = _name;
    }

    public void exam() {
        System.out.println(name + "在考试");
        Count();
    }
    public void Count(){
        System.out.println(name+"可能没考好");
    }
}

上段代码中张三、李四都参加考试,两个人的水平当然是不一样的,所以说最终结果也不同。所以考试这个方法应该为实例方法。

在实际开发中,”工具类“当中的方法一般定义为静态方法,因为工具类就是为了方便大家使用,将方法定义为静态方法,方便调用,不需要创建对象,直接类名就可以访问。比如”System.out.println()“。

仿照System.out.println()”写个工具类:

/**
 * @author wcs
 * @date 2021/8/7 8:56
 */
public class Tool {
    public static void p(int data) {
        System.out.println(data);
    }

    public static void p(Long data) {
        System.out.println(data);
    }

    public static void p(float data) {
        System.out.println(data);
    }

    public static void p(double data) {
        System.out.println(data);
    }

    public static void p(boolean data) {
        System.out.println(data);
    }

    public static void p(char data) {
        System.out.println(data);
    }

    public static void p(String data) {
        System.out.println(data);
    }

    public static void main(String[] args) {
        p("hello");
        p(true);
        p(2.34);
        p('A');
    }
}

运行结果:

image-20210807090212258
保姆级教程:用Java和HslCommunication库搞定三菱PLC数据读写(附完整代码) 本文提供了一份详细的Java与三菱PLC通信教程,通过HslCommunication库实现高效数据读写。内容涵盖环境配置、通信模式选择、数据类型操作、异常处理及性能优化,并附有完整代码示例,帮助开发者快速掌握工业自动化中的PLC数据交互技术。 阅读详情

相关推荐

ARKit面部动画实战:如何用blend shape让数字人表情更自然(附中文对照表)

本文深入探讨了如何利用ARKit的blend shape技术驱动数字人面部动画,以实现更自然生动的表情。文章提供了详细的blend shape中文对照表,并分享了实战技巧,包括构建复合表情动画序列、处理不对称性与微表情,以及性能优化策略,旨在帮助开发者高效提升数字人的表情表现力。

weixin_29292535的博客 327

this 和 static 详解

.....

lwj_07的博客 1351

SolidWorks参数化建模实战:从规则定义到智能装配

本文深入探讨SolidWorks参数化建模的实战技巧,从规则定义到智能装配的全流程。通过实际案例展示如何提升设计效率300%,确保一致性,并加速系列化开发。重点解析草图阶段植入设计意图、装配体级参数化及高级技巧,帮助工程师掌握三维建模的核心竞争力。

weixin_29306317的博客 417

this和static关键字的用法及定义和代码块及包的用法

(1)this关键字代表当前对象;(2)使用this关键字引用成员变量(3)使用this关键字引用成员方法或者构造方法,(说明:在一个类的方法或构造方法内部,可以使用“this成员变量”这样的格式引用成员变量名,常常来区分车成员变量名和局部变量名)

2301_76460223的博客 216

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

新版股票配资系统源码/股票分析系统技术方案

新版股票配资系统;全套源码支持新股申购功能,包含C#+MySQL开发的后台系统及Spring框架,采用C/S架构。注意:本源码仅限技术学习、功能测试及模拟交易使用,严禁用于非法用途,违者责任自负。

q318136906的博客 1647

java知识总结(四)this与static详解

java总结四 this与static详解 一、this this:代表对象。就是所在函数所属对象的引用。 this到底代表什么呢?哪个对象调用了this所在的函数。this就代表哪个对象。就是哪个对象的引用。 开发时,什么时候使用this呢? 在定义功能时,如果该功能内部使用到了调用该功能的对象。这时就用this来表示这个对象。 同时this 还可以用于构造函

代码搬运工 718

写给开发人员的实用密码学 - Hash算法

说到Hash(哈希),开发人员应该不陌生,比如Hash表是一种非常常用的数据结构,通过Hash表能够根据键值快速找到数据。哈希函数将文本(或其他数据)映射为整数,从而能够提高检索效率。密...

云水木石 1503

this和super的总结 static的总结

1、this和super的总结; this关键字只能用于方法的方法内,表示对“调用方法的那个对象”的引用。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的引用,这个引用的名字就是this。 super关键字有时会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类的成员变量或方法名优先级高,所以子类的同名成员变量或方法就隐藏了父类的成员变量或方法,如果想要使用父类中的成员变量或方法,就需要用到super,总之super关键字用于指代父类。 通俗点来说 this 就是 我

MangFu_M的博客 503

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 633

MIPI CSI-2

来源:公众号瓜大三哥版权归三哥所有1 MIPI简介2 MIPI CSI-2简介2.1 MIPI CSI-2 的层次结构2.2 CSI-2协议层2.3 打包/解包层2.4 ...

OpenFPGA的博客 2114

PHP static与self和this的区别

static 使用static::对当前类进行静态引用时,代表的是运行时最初调用的类。static::不能对不属于方法的类的私有方法进行调用。 self 使用self::或者__class__对当前类进行静态引用时,代表的是当前方法所在的类。 this 该方法所从属的类的对象,PHP5中,如果是从第二个对象静态调用时,$this也可能引用的是另一个对象。PHP7中则没有此问题。 <?p...

m0_37477061的博客 372

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2625

static和this关键词浅析

static和this关键字static关键字static关键字最基本的用法是:static的调用this关键字(1)如果成员变量和局部变量(参数)重名(2)构造器之间相互调用(3)返回对象的值 static关键字 static关键字最基本的用法是: 1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来 1、不使用static修饰的属性,我们叫实例变量。 2、不使用sta

qq_43803695的博客 375

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java中this关键字和static关键字

文章目录1 this关键字1.1 this表示本类属性1.2 this调用本类方法1.2.1 this调用普通方法1.2.2 this调用构造方法1.2.3 this表示当前对象2 static关键字2.1 static属性(类属性)2.2 static方法(类方法) 1 this关键字 this关键字主要有三个方面的用途: this表示本类属性。 this表示本类方法。 this...

zhao_miao的博客 3038

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

static、this和super

static、this和super的对比学习

cry30867的博客 750

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

this和static关键字

文章目录1.this关键字1) this关键字在内存中的位置2) this在实例方法和实例变量中的使用3) this在构造方法中的使用2.static关键字1) static介绍2)静态变量(1)变量在什么情况下会声明为静态变量(2) 可以用引用来访问静态变量吗?可以的话,这个访问和具体的对象有什么关系?3)静态代码块4)静态方法3.this与static相关案例题 1.this关键字 1) this关键字在内存中的位置 先看一段代码 public class Customer { private Str

qq_46603402的博客 1149

this和static的理解

##this和static的理解 -this用汉语对英语的理解,就是【这】的意识–也就是替身 -static用汉语对英语的理解,就是【静态】的意识–静态方法属性对同僚那是大大滴好,但对非静态方法属性,那是非常排斥滴。偏偏非静态方法属性,心胸宽广,对静态方法属性那是相当的呵护 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链...

qq_43445162的博客 638

Java学习 -- this和static

函数的重载 (1)同名的函数通过不同的形参做类似的事情,这就叫函数的重载 (2)函数重载的要求: 1. 函数的形参个数 2. 函数的形参顺序 3. 函数的形参数据类型 这三个至少有一个是不一样的 (3)如果两个函数只是函数的返回值不一样,其他都一样,这构不成函数的重载,并且编译时会报错! int add(int a, int b) { return a + b; } double add(dou...

水里的鱼 298

this和super、static的总结

super关键字: super是直接父类对象的引用。 可以通过super来访问父类中被子类覆盖的方法或属性。 this关键字: this的作用: this表示的是当前对象本身, 更准确的说,this代表当前对象的一个引用。 普通方法中使用this。 区分类成员属性和方法的形参 调用当前对象的其他方法 位置:任意 构造方法中使用this 使用this来调用其他构造方法 位置:必须是第一条语句。 this不能用于static方法 static关键字: 在类中,用static声明的成员变量为静态成员变量 对于该类

Mr_Dracy的博客 614

java this static_java的static和this

1>static:静态修饰符static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它...

weixin_42501077的博客 247
上一篇: Java封装
下一篇: Java继承
wcs_csdn
博客等级 码龄5年 3粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值