第三章 3.1 面向对象

面向对象概述

对象的创建语法

实例变量属于成员变量,成员变量如果没有手动赋值,系统会赋默认值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值