java基础——随笔03
java中this的用法:
一. this关键字
1.this的类型:哪个对象调用就是哪个对象的引用类型
二.用法总结
1.this.data; //访问属性
2.this.func(); //访问方法
3.this(); //调用本类中其他构造方法
三.解释用法
1.this.data
这种是在成员方法中使用
让我们来看看不加this会出现什么样的状况:
class MyDate{ public int year; public int month; public int day; public void setDate(int year, int month,int day){ year = year;//这里没有加this month = month;//这里没有加this day = day;//这里没有加this } public void PrintDate(){ System.out.println(year+"年 "+month+"月 "+day+"日 "); } } public class TestDemo { public static void main(String[] args) { MyDate myDate = new MyDate(); myDate.setDate(2000,9,25); myDate.PrintDate(); MyDate myDate1 = new MyDate(); myDate1.setDate(2002,7,14); myDate1.PrintDate(); } }
而当我们加上this时:
class MyDate{ public int year; public int month; public int day; public void setDate(int year, int month,int day){ this.year = year; this.month = month; this.day = day; } public void PrintDate(){ System.out.println(this.year+"年 "+this.month+"月 "+this.day+"日 "); } } public class TestDemo { public static void main(String[] args) { MyDate myDate = new MyDate(); myDate.setDate(2000,9,25); myDate.PrintDate(); MyDate myDate1 = new MyDate(); myDate1.setDate(2002,7,14); myDate1.PrintDate(); } }
2.this.func()
这种是指在普通成员方法中使用this调用另一个成员方法
class Student{ public String name; public void doClass(){ System.out.println(name+"上课"); this.doHomeWork(); } public void doHomeWork(){ System.out.println(name+"正在写作业"); } } public class TestDemo2 { public static void main(String[] args) { Student student = new Student(); student.name = "小明"; student.doClass(); } }
(3)this()
这种指在构造方法中使用this调用本类其他的构造方法
这种this的使用注意以下几点
1.this只能在构造方法中调用其他构造方法
2.this要放在第一行
3.一个构造方法中只能调用一个构造方法
===============================================================================
java中super的用法:
super只在子类中出现,super有三种用法:
【1】 super.xxx;
xxx可以是类的属性。
例如super.name;即从子类中获取父类name属性的值
【2】 super.xxx();
xxx()可以是类中的方法名。
super.xxx();的意义是直接访问父类中的xxx()方法并调用
【3】 super();
此方法意义是直接调用父类的构造函数。
super(无参/有参)即调用父类中的某个构造方法,括号里的内容根据你所调用的某个构造函数的变化而改变
==================================================================================
============================================================================
java中final的用法——final关键字——final修饰类、成员变量、成员方法、局部变量
常见的四种用法:
① 可以用来修饰一个类
② 可以用来修饰一个方法
③ 可以用来修饰一个局部变量
④ 可以用来修饰一个成员变量
1、final关键字用于修饰类
格式如下:
作用:使当前这个类不能有任何子类。(“太监类”)
注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写
2、final关键字用于修饰成员方法
格式如下:
作用:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,不能够被覆盖重写
注意:对于类、方法来说,abstract关键字和final关键字不能同时使用,因为作用相互矛盾
3、final关键字用于修饰局部变量
格式如下
作用:当final关键字用于修饰局部变量的时候,这个局部变量就不能更改,“一次赋值,终生不变”
注意:对于 基本类型 来说,不可改变指的是变量当中的数据不可改变,但是对于 引用类型 来说,不可改变的指的是变量当中的地址值不可改变
4、final关键字用来修饰成员变量
对于成员变量来说,如果使用了final关键字修饰,那么这个变量也照样是不可变的
① 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了
② 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值,只能二选一
③ 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值
=====================================================================================
java中static的用法
static关键字在JAVA语言中的四种含义
1、修饰成员变量
2、修饰成员方法
3、静态块
4、静态导包
=====================================================================
=====================================================================
1、static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
2、static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:
在上面的代码中,由于print2方法是独立于对象存在的,可以直接用过类名调用。假如说可以在静态方法中访问非静态方法/变量的话,那么如果在main方法中有下面一条语句:
MyObject.print2();
此时对象都没有,str2根本就不存在,所以就会产生矛盾了。同样对于方法也是一样,由于你无法预知在print1方法中是否访问了非静态成员变量,所以也禁止在静态成员方法中访问非静态成员方法。
而对于非静态成员方法,它访问静态成员方法/变量显然是毫无限制的。
因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
3、static代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。下面看个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Person{ private Date birthDate; public Person(Date birthDate) { this .birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf( "1946" ); Date endDate = Date.valueOf( "1964" ); return birthDate.compareTo(startDate)>= 0 && birthDate.compareTo(endDate) < 0 ; } } |
isBornBoomer是用来这个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Person{ private Date birthDate; private static Date startDate,endDate; static { startDate = Date.valueOf( "1946" ); endDate = Date.valueOf( "1964" ); } public Person(Date birthDate) { this .birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate)>= 0 && birthDate.compareTo(endDate) < 0 ; } } |
因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
==========================================================================
===========================================================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2021-09-23 测试开发进阶——常用中间件概念——消息中间件ActiveMQ使用详解(转载)
2021-09-23 测试开发进阶——常用中间件概念——JMS(Java消息服务)
2021-09-23 测试开发进阶——常用中间件概念——web容器——web 容器比较 tomcat 、jboss 、resin、 weblogic 、websphere 、glassfish
2021-09-23 测试开发进阶——常用中间件概念——web容器
2021-09-23 测试开发进阶——Servlet ——Servlet HTTP 状态码
2021-09-23 测试开发进阶——Servlet ——Servlet 客户端 HTTP 请求——Servlet 服务器 HTTP 响应
2021-09-23 测试开发进阶——Servlet ——简单示例