Java基础---this关键字,final关键字,Java值传递流程

目录

前言

一、this关键字 

1.this.属性 

2.this.方法名  

3.this()

二、final关键字

1.修饰变量

①全局变量

②局部变量

③基本数据类型所定义的变量

④引用数据类型所定义的变量 

总结


前言

this关键字的使用方法和解释

final关键字的使用方法和解释

Java的值传递例题讲解


一、this关键字 

在方法调用之前加上一个对象的名称,代表你调用的是哪个对象里面的方法 

 

1.this.属性 

        

其中aaaa为局部变量,name为本类的全局变量,在java当中只有值传递

this代表当前对象,this.name调用的是当前对象的全局变量name

把aaaa代表的值赋给此对象的name

2.this.方法名  

 

 

static修饰的代码被所有对象共享,所有this可以调用static修饰的方法

因为static修饰的代码存放在静态常量池中,有自己的独立空间,即使没有实例创建,仍然可以被调用。

 

static修饰的代码当中不能出现this关键字,因为类是构建对象的模板,有类不一定有对象

如何理解这句话呢:在未从堆内存开辟空间的时候,被static修饰的代码已经存放进入方法区的静态常量池中,当static修饰的代码当中出现this关键字时,内存空间中并无对象所被this指向。

3.this()

  •  this()不能在普通方法中使用,只能在构造方法中使用
  • this()在构造方法中使用必须时第一条语句
  • 在一个类下两个构造方法中不能通过this()互相调用
  • 不能与super()同时使用

示例: 

 this("b")指的是此对象当中签名为String类型的构造器

 

 在一个类下两个构造方法中不能通过this()互相调用

二、final关键字

 

final所修饰的变量叫做常量

常量的变量名必须大写 

常量是只能赋值一次的变量

1.修饰变量

①全局变量

给全局变量用final修饰必须赋初始值

全局变量是有默认值的

引用数据类型:null

整型:0

浮点型:0.0

布尔类型:false

字符型: (空)

未赋值报错

赋值后不报错,给String类型的name赋值为空也是赋值 

 

②局部变量

给局部变量用final修饰,在使用的时候必须赋初始值 

 局部变量a如果不被使用不报错

被使用报错 

赋值后再使用不报错 

 

③基本数据类型所定义的变量

对于基本数据类型而言,final固定的是值,如引用类型的地址值一样,被修饰之后无法被赋值

 

④引用数据类型所定义的变量 

对于引用数据类型而言,final固定的是对象的地址,变量无法改变其执行对象的地址,而对象中的内容是可以被改变的

一旦被final修饰之后就无法被赋值

2.修饰方法 

final所修饰的方法不能被重写 

3.修饰类 

final所修饰的类无法被继承 

 三、java的值传递

Java当中只进行值传递 

1.例题1 

public class A {
    public static void main(String[] args) {
        String nameString = "张三";
        name(nameString);
        System.out.println("main--->"+nameString);
    }
    public static void name(String name){
        name="李四";
        System.out.println("name--->"+name);
    }
}

输出的结果为

name--->李四
main--->张三

 

 被static修饰的数据存放在静态常量池中

  1. main()方法入栈,给main()中的nameString变量赋静态常量池中张三所在的地址值
  2. 执行name(nameString);调用name()方法入栈,给name()方法中的局部变量name赋值静态常量池中李四的地址值,然后输出        name--->李四
  3. 输出main--->张三

2.例题2

public class Person {
    private String nameString;
    private int age;
    public Person(String nameString,int age){
        this.age=age;
        this.nameString=nameString;
    }
    public String toString(){
        return "Person[nameString]="+nameString+",age="+age+"]";
    }

    public static void name(Person person) {
        person.age=20;
        person.nameString="李四";
        person=null;
    }

    public static void main(String[] args) {
        Person person=new Person("张三",18);
        System.out.println(person.toString());
        name(person);
        System.out.println(person.toString());
    }

}

输出结果为

Person[nameString]=张三,age=18]
Person[nameString]=李四,age=20] 

 

静态常量池中有 张三 0x2,18 0x4,李四 0x3,20 0x5

  1. main方法入栈,执行 Person person(0x1)=new Person("张三",18);创建实例,并把张三的地址值 0x2和18的地址值 0x4赋给此对象的age和nameString
  2. 输出此对象下age和nameString所指向的值
  3. 执行name(person); name()方法入栈,并把person地址值 0x1 赋给此方法中的person
  4. person.age=20;person.nameString="李四";person=null;的含义为把20的地址值 0x5 赋给地址值0x1下的age,把李四的地址值0x3 赋给此地址值0x1下的names 然后把person原指向的0x1 改为null 
  5. 输出此对象下age和nameString所指向的值

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值