面向对象概述
对象的创建语法
实例变量属于成员变量,成员变量如果没有手动赋值,系统会赋默认值
JVM内存图
public class StudentTest01 {
String name;
String age;
boolean gender;
public void eat(){
System.out.println(this.name + "在吃饭");
}
}
public class example {
public static void main(String[] args) {
// 局部变量;
i = 10;
//s1保存的是堆中 new出来实例对象的地址
StudentTest01 s1 = new StudentTest01();
s1.name = "张三";
s1.age = "20";
s1.gender = true;
s1.eat();
}
}
方法调用时参数是如何传递的?
将变量中保存的值复制一份传递过去。(非常重要,万变不离其宗,记住一个词:复制)
前提知识回忆
在Java中,操作数栈(operand stack)和局部变量表(local variable table)是用于存储数据的两个重要的数据结构。
操作数栈用于执行方法的操作。它用来存储方法执行过程中所需的操作数和中间结果。当一个方法被调用时,会创建一个新的帧(frame),其中包含了局部变量表和操作数栈。操作数栈的大小是提前确定的,它可以存储各种类型的数据,如整数、浮点数、引用等。
局部变量表是用于存储方法中定义的局部变量的表格。每个局部变量都有一个对应的槽位(slot),它可以存储一个值。局部变量表的大小是在编译期确定的,并且根据方法的需求进行分配。局部变量可以是任何Java数据类型,如基本类型(int、float、boolean等)或引用类型(对象引用)。
当方法被调用时,局部变量表会被初始化,并且根据方法的参数和局部变量的定义顺序进行填充。方法执行过程中,局部变量可以被读取和修改。当方法执行结束时,局部变量表的内容会被释放。
方法中局部变量为数据类型
i的两个输出值
i属于局部变量,作用只限于局部
public class ArgsTest01 {
public static void main(String[] args){
int i = 10;
add(i);
system.out.println("main--->" +i);
}
1 usage
public static void add(int i){
i++;
system.out.println("add--->" +i);
}
方法中局部变量为引用类型
public class ArgsTest02 {
public static void main(String[] args) {
User u = new UserO;
u.age = 10;
// u是怎么传递过去的。实际上和i原理相同:都是将变量中保存的值传递过去。//只不过这里的u变量中保存的值比较特殊,是一个对象的内存地址。
add(u);
system.out.println("main-->" + u.age); 1l 11
}
1 usage
1
public static void add(User u){
// u是一个引用。
u.age++;
System.out.println( "add-->" + u.age); // 11
}
this关键字
类中方法的局部变量表中0槽位永远存储的是this
public class StudentTest {
public static void main(String[] args){
//创建学生|
Student zhangsan = new student();
// zhangsan是引用。通过“引用.”来访问实例变量。zhangsan.name =“张三";
System.out.println("学生姓名:" +zhangsan.name);//让张三去学习。
zhangsan.study();
}
常见问题
- 不能用类名.来直接访问:因为类中的变量是实例变量,顾名思义先有对象后才是实例变量,堆中的变量是只能先创建实例才有上图的椭圆;
- dog = null 使栈里边存储的堆的地址为空,空指针异常,找不到堆实例出来对象的地址了。
public class PetTest02 {
public static void main(String[ ] args){
//创建宠物对象
Pet dog =new Pet();
//给属性赋值
dog.name ="国";
dog.birth = "2012-10-11";dog.sex ='雄';
//读取属性的值
System.out.println("狗狗的名字:" +dog.name);System.out.println("狗狗的生日:" +dog.birth);System.out.println("狗狗的性别:" +dog.sex);
dog = null;
System.out.println(“狗狗的名字:" + dog.name);
}
}