目录
一、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