this关键字、final关键字、java值传递

目录

一、this关键字

1.是什么

2.怎么用

(1)this.属性

①这里有两个name,该给哪个赋值? 

②this.name调用的是全局变量,为什么不是局部变量?

(2)this.方法名

①为什么this可以调用run()方法

②如果给run()方法加上static还能调用吗?

③static修饰的方法里面不能出现this,为什么?

(3)this()

二、final关键字

1.修饰变量

(1)按变量的作用域分

①全局变量

②局部变量

(2)按数据类型分

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

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

2.修饰方法

3.修饰类

三、值传递

例1.

例2.

 例3.

例4


一、this关键字

1.是什么

this代表当前对象

2.怎么用

(1)this.属性

在类中调用全局变量

public class Student{
    public String name;
    public void run(String name){
        this.name=name;
    }
}
public class Test{
    public static void main(Stirng[] args){
        Student student1=new Studnet();
        student1.run("aaa");

        Student student2=new Student();
        student2.run("bbb");
    }
}

 其堆栈内存图为:

①这里有两个name,该给哪个赋值? 

这是就需要一个this,this就代表你要调用的对象,如果是student1调用的话,就给student1下面的name赋值,如果是student2调用的话,就给student2下面的name赋值。

this就代表当前对象,谁调用就代表谁

②this.name调用的是全局变量,为什么不是局部变量?

因为全局变量属于当前对象,而局部变量它不属于对象

(2)this.方法名

可以调用当前对象的方法、this可以调用static修饰的方法、static修饰的方法里面不能出现this

public class Client{
    public String name;    
    public void run(String name){
        this.name=name;
    }
    public void aaa(){
        this.run("ccc");
    }
}
①为什么this可以调用run()方法

 因为run()方法属于对象,this代表当前对象

②如果给run()方法加上static还能调用吗?

加上static之后,run()方法在方法区中,被所有对象共享,所以this可以调用static修饰的方法

③static修饰的方法里面不能出现this,为什么?

 因为类是构建对象的模板,有类不一定有对象,对象是在类之后创建的,调用static修饰的run()方法,调用了,但是没有生成对象,this代表当前对象,所以static修饰的方法里面不能出现this

(3)this()

指的是构造器的调用

1.this()不能在普通方法中使用,只能在构造方法中使用

2.This()在构造方法中使用必须是第一条语句

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

4.不能与super()同时使用

二、final关键字

用于修饰变量、方法、类

1.修饰变量

要分情况讨论

(1)按变量的作用域分

①全局变量

(1)全局变量是类里面定义的变量

(2)final修饰的全局变量必须赋值,因为final只能赋值一次

(3)全局变量是有默认值的,如果带着默认值的话是不对的,必须要赋值

(4)默认值:
 

数据类型默认值
引用数据类型null
整型0
浮点型0.0
布尔型false
字符型空(什么都没有)
public class Test{
    public final String name="aaa";//必须要先赋值
}
②局部变量

(1)局部变量是方法内部定义的变量

(2)要引用的话得赋值,而且final修不修饰都是这样

public class Test{
    public void run(){
        String name="张三";//要引用的话的赋值
        System.out.println(name);
    }
}

(2)按数据类型分

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

final修饰的基本数据类型,其值不能被改变

对基本数据类型来说,final固定的是真正的值

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

对引用数据类型数据磊说,final固定的是对象的地址

(1)堆栈内存图:

(2)change()方法中的arr=arr1;  这句话的意思是把arr1的地址赋给arr

(3)change1()这个方法没错,change()方法错了,表明对引用数据类型数据磊说,final固定的是对象的地址,变量无法改变其指向对象的地址,但是对象的内容是可以改变的

2.修饰方法

final修饰的方法不能被重写

3.修饰类

final修饰的类不能被继承

三、值传递

java只进行值传递

从下面几个例题说明java的值传递

例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); 
    }
}

运行结果:

原因:
堆栈内存图为:

先是main方法入栈,里面有一个nameString,它指向叫0x1的地址,然后调用name()方法,传的是nameString的值,java值进行值传递,传的是nameString地址的值0x1,所以name指向0x1,之后name指向0x2,所以先输出 name--->李四,然后name()出栈,这时候nameString指向的仍然是0x1,所以接着输出 main--->张三

例2.

public class Person {
    private String nameString;
    private int age;
    public Person(String nameString,int age){
        this.age=age;
        this.nameString=nameString;
    }
    @Override
    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}

然后执行下一条语句name(person);

之后name()方法出栈,输出 Person{nameString='李四', age=20}

 例3.

public class Client {
    private String name;
    private int age;
    public Client(String name,int age){
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString() {
        return "Client{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public static void change(Client s1, Client s2){
        Client temp=new Client("王五",20);
        temp=s1;
        s1=s2;
        s2=temp;
    }

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

运行结果:

原因:
堆栈内存图:

在change()方法中,s1和s2交换

之后change()方法出栈,zhangsan仍指向0x1,lisi仍指向0x2,所以输出:
Client{name='张三', age=18}
Client{name='李四', age=20}

例4

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;
    }
}

运行结果:

原因:
堆栈内存图:

调用start()之后,执行到 Two two=new Two(); 时,x=0(默认值),所以输出 0

之后执行  Two two2=fix(two); 调用fix()方法,让x=42,

所以第二个输出是 42 42

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值