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、修饰成员变量

java中,static最常用的就是用于修饰类的成员函数与属性,让他们成为类的成员函数与属性。这是相对于对象的方法和对象来说的。

 

2、修饰成员方法

修饰成员方法也是修饰成员变量的一种,因为成员方法也同样属于成员变量。
 
当某个成员函数被申明成是static函数以后,该函数便属于该类的一个函数,可以通过  类名.方法名的方式调用这个方法。
 
避免了提前通过new出一个新的对象的繁琐和资源消耗。
 
可是同时,static修饰的方法中不能调用非static成员函数或者成员变量,因为使用static修饰过的方法事实上属于当前这个类的,如果现在调用某个对象的方法或者某个对象的成员变量,它是不是会有点不知所措的呢。

 

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代码块中进行。

 

 

 

 

==========================================================================

 

===========================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   小白龙白龙马  阅读(11)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 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 ——简单示例
点击右上角即可分享
微信分享提示