目录
前言
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修饰的数据存放在静态常量池中
- main()方法入栈,给main()中的nameString变量赋静态常量池中张三所在的地址值
- 执行name(nameString);调用name()方法入栈,给name()方法中的局部变量name赋值静态常量池中李四的地址值,然后输出 name--->李四
- 输出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
- main方法入栈,执行 Person person(0x1)=new Person("张三",18);创建实例,并把张三的地址值 0x2和18的地址值 0x4赋给此对象的age和nameString
- 输出此对象下age和nameString所指向的值
- 执行name(person); name()方法入栈,并把person地址值 0x1 赋给此方法中的person
- person.age=20;person.nameString="李四";person=null;的含义为把20的地址值 0x5 赋给地址值0x1下的age,把李四的地址值0x3 赋给此地址值0x1下的names 然后把person原指向的0x1 改为null
- 输出此对象下age和nameString所指向的值