java基础:关键字(final,this)+ java值传递的执行流程


关键字

2024/8/23下午课
重难点:
final修饰引用数据类型所定义的变量
java值传递的执行流程


1. this关键字

引入:
在这里插入图片描述

①this.属性

在类当中调用全局变量
this代表着当前对象
this.name,调用的是全局变量,而不是局部变量,为什么
因为全局变量属于对象,而局部变量不属于对象
在这里插入图片描述
所以也反复强调:this代表当前对象。

②this.方法

static修饰的代码中不能出现this关键字,因为类是构建对象的模板,有类不一定有对象。
static修饰的代码被所有对象共享。
所以this.被static修饰的方法是可以的
在这里插入图片描述

③this()

了解即可

  • 不能再普通方法中使用,只能在构造方法中使用
  • 指的是构造器的调用
  • this()在构造方法中使用必须是第一条语句
    在这里插入图片描述
  • 在一个类下两个构造方法中不能通过this()相互调用
    在这里插入图片描述
  • 不能与super()同时使用

2.final关键字

在这里插入图片描述

在这里插入图片描述
(以下代码中小写的常量均改为大写的变量)

①final修饰变量

final修饰的变量叫做常量
常量的变量名称要大写
常量是指只能被赋值一次的变量

全局变量

在类里面定义的变量
作为final修饰的全局变量的时候必须赋初始值
因为对于全局变量来说,全局变量是有初始值的
如果是:引用数据类型,初始值是null
如果是:
整型: 0
浮点型:0.0
布尔型:false
char字符型:空,什么都不写的空
又因为常量只能被赋值一次,所以需要一上来就给全局变量赋值
在这里插入图片描述

局部变量

在方法里面定义的变量
一开始可以不赋值,但用的时候需要赋值
在这里插入图片描述
在这里插入图片描述

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

引用数据类型包含
类、数组、接口
(举例数组:)
在这里插入图片描述

加final和不加final之间的区别:
在这里插入图片描述
画图解释:
在这里插入图片描述

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

final修饰的基本数据类型所定义的变量,不能被改变
在这里插入图片描述
在这里插入图片描述

②final修饰方法

final修饰的方法不能被重写
在这里插入图片描述

③final修饰类

final修饰的类不能被继承
在这里插入图片描述
String是被final修饰的,所以没有一个类可以继承final

3. java值传递的执行流程(题④有具体流程解释)

题①

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—>张三

java只有值传递
在这里插入图片描述

题②

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]

在这里插入图片描述
String 变量对应的值,放在字符串常量池里面(),以下的题就简写了。

写一下执行到name(preson);这里之后的执行过程:

  1. name()方法入栈
  2. 传的是person对应的值:0x1
  3. 然后改变了0x1地址对应的一些值:age=20,nameString=李四
  4. 这里之后还有个person=null,这个是把name()方法里面的person对应的值,也就是它的地址值变为null了,但是不影响mian里面的person的地址值。
  5. 之后name()方法出栈
  6. 输出:(值已经改变了)

题③

public class Student {
    private String name;
    private int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){
    return "Student [name="+name+",age="+age+"]";
    }
    public static void change(Student s1 ,Student s2){
    Student temp = new Student("王五",20);
    temp=s1;
    s1=s2;
    s2=temp;
    }

    public static void main(String[] args) {
        Student zhangsan=new Student("张三",18);
        Student lisi =new Student("李四",20);
        Student.change(zhangsan,lisi);
        System.out.println(zhangsan.toString());
        System.out.println(lisi.toString());
    }
}

Student [name=张三,age=18]
Student [name=李四,age=20]

在这里插入图片描述
(tips:地址确实是交换了,但是是在change方法里面,之后change方法又出栈,没有影响main方法里面的对象所对应的地址)

题④

class Two{
    byte x;
}
public class Student {
    public static void main(String[] args) {
        Student student = new Student();
        student.start();
    }
    void start(){
        Two two = new Two();
        System.out.println(two.x+" ");
        Two two2=fix(two);
        System.out.println(two.x+" "+two2.x);
    }
    Two fix(Two tt){
        tt.x=42;
        return tt;
    }
}

0
42 42
在这里插入图片描述

  1. mian方法入栈
  2. 创建对象:student(在main方法中)
  3. 在堆内存中开辟空间
  4. 类是构成对象的模板,给对象值初始化,所以空间里面是类的变量和方法的初始值
  5. 调用start()方法,方法入栈
  6. 创建对象:two(在start方法中)
  7. 在堆内存中开辟空间
  8. 类是构成对象的模板,给对象值初始化,所以空间里面是类的变量和方法的初始值,所以x变量初始化自动赋值为0
  9. 输出:0
  10. 调用fix()方法,传two的值——即0x2,返回0x2。
  11. fix()方法出栈,把值赋给(在start方法中)创建的对象two2——》所以two2对应的地址值就是0x2
  12. 输出two对象的x和two2对象的x:42,42

需要反复强调的知识点

  • 对象是堆里面的一块内存空间
  • this代表着当前对象
  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值