文章目录
关键字
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);这里之后的执行过程:
- name()方法入栈
- 传的是person对应的值:0x1
- 然后改变了0x1地址对应的一些值:age=20,nameString=李四
- 这里之后还有个person=null,这个是把name()方法里面的person对应的值,也就是它的地址值变为null了,但是不影响mian里面的person的地址值。
- 之后name()方法出栈
- 输出:(值已经改变了)
题③
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
- mian方法入栈
- 创建对象:student(在main方法中)
- 在堆内存中开辟空间
- 类是构成对象的模板,给对象值初始化,所以空间里面是类的变量和方法的初始值
- 调用start()方法,方法入栈
- 创建对象:two(在start方法中)
- 在堆内存中开辟空间
- 类是构成对象的模板,给对象值初始化,所以空间里面是类的变量和方法的初始值,所以x变量初始化自动赋值为0
- 输出:0
- 调用fix()方法,传two的值——即0x2,返回0x2。
- fix()方法出栈,把值赋给(在start方法中)创建的对象two2——》所以two2对应的地址值就是0x2
- 输出two对象的x和two2对象的x:42,42
需要反复强调的知识点
- 对象是堆里面的一块内存空间
- this代表着当前对象