Java类和对象的一些要点

零散的几个要点

  • 类中的成员变量分为实例变量(非静态成员变量)、类变量(静态成员变量),且被定义时均有其对应类型的默认值。
  • 在堆区new一个对象时,如 Person p = new Person(); 赋值号左侧的引用存放在栈区,右侧new出来的对象及其实例变量存放在堆区
  • 若一个引用数据类型的初始值为null,如 String str = null; 为一个空引用,即此String对象引用为空,不指向任何确定的堆区空间。
  • 类中的非静态成员方法/属性为该类的每个对象所独有。
    类中的静态成员方法/属性为该类的所有对象共享(包括null空对象),在类中只有唯一的一份。
  • 使用null空对象调用类中的非静态方法/属性,会报空指针异常。原因:对象为空,则其对应的方法/属性不存在。
    使用null对象调用类中的静态方法/属性,程序可以正常执行。原因:被static修饰过的方法/属性为该类的所有对象(包括空对象)所共有,可以通过此类的任意对象进行访问。

变量存放的内存区

  • 方法中的变量(基本类型变量、引用变量)均为局部变量,存放在栈区
    int num = 0; num为基本类型变量,存放在栈区
    String str = “abc“; str为引用变量,存放在栈区(右侧的对象实体存放在堆区
  • 堆区对象的实例变量为其实例对象所独有,存放在堆区。但仅当该对象被new出来时,其实例变量才会被存放到堆区。
  • 类中的类变量为所有对象所共享,一经定义,就会被存放到方法区
    【类中的方法、类变量都存放在方法区中,实例变量存放在堆中】

static相关的几个要点

  • 方法中不能定义static静态变量,无论静态方法 / 非静态方法。
    原因:方法中的变量都是局部变量,存放在栈区,而static静态变量存放在方法区。
  • 静态方法中只能访问静态变量/方法,不能访问非静态变量/方法。
    非静态方法可以访问静态变量/方法。
  • 在类中定义常量时,通常定义为全局常量,由static final同时修饰。且在定义时即赋值。
    全局常量的命名规则:所有单词大写,以下划线分隔。
    如:static final String BLOG_NAME=“bubble”;
  • static final修饰的全局变量是为所有对象共享的、不可修改的值。若未被final修饰,则每个对象都可以对此唯一的类变量进行修改,且各对象访问该变量时会同步看到此修改。

final修饰的变量 —— 常量,只能被赋值一次,赋值后不可修改。
final修饰的类 —— 最终类,不能被继承,没有子类。final类中的方法默认也被final修饰。
final修饰的方法 —— 不能被子类的方法重写,但可以被继承和重载。

实例变量与构造方法

  • 当new出类的一个对象时,才会在堆区分配空间存放该对象的实例变量。
  • 给实例变量定义好的初值就是在构造方法中完成赋值的。

new出一个对象会干的两件事:
1) 在堆区开辟一个空间用于存放此对象,此空间的大小由其实例变量(对应类型)决定
2)调用构造方法给所有的实例变量赋值

-无论有参构造 / 无参构造,在进入构造方法前,实例变量的值都为其对应类型的默认值。
-进入构造方法后,才会将定义好的初值赋给实例变量。
-对于有参构造,下一步还会执行赋值语句,将实参传入的指定值赋给实例变量。
(单步调试结果)
在这里插入图片描述

构造方法的几个要点

  • 构造方法可以重载,但重载形式仅以“参数的个数”作区分。语义上“参数的类型”在定义变量时就已经指定好了,与“参数的顺序”也无关。
  • 若根据“参数个数”的不同实现重载的构造方法中若出现了重复性代码,则可以在一个构造方法中使用 this(参数) 调用其他的构造方法。在这里插入图片描述
    但需注意:
    1)this(参数); 调用其他构造方法的语句必须置于当前构造方法的首行
    2)this(参数); 在多个构造方法之间的相互调用不能成“环”
    在这里插入图片描述

Java中的四种代码块

  • 普通代码块
    定义在方法中,使用{}括起来的代码块。
    1)普通代码块内的变量为局部变量,作用域仅为{}内部,出了{}即销毁。
    2)普通代码块内的定义与外部是互相独立的,同名变量在普通代码块内外可各定义一次。
    在这里插入图片描述
  • 构造代码块
    定义在类中,使用{}括起来的代码块。
    1)优先于构造方法被执行。
    执行顺序:构造块 > 构造方法
    如:对于实例变量name:创建对象时被存放到堆区;执行构造块被赋值为“小猫”;执行构造方法被赋值覆盖为“小狗”。在这里插入图片描述
    2)每产生一个对象就会调用一次构造块,有多少个对象就调用多少次构造块。
  • 静态代码块
    定义在类中,被static修饰的{}代码块。
    1)静态代码块随类的加载而执行,且只执行一次,与对象无关。
    2)优先于构造块被执行。
    执行顺序:静态代码块 > 构造块 > 构造方法
    如:根据单步调试查看,当主方法中执行到第7行创建Animal对象时,先执行了静态代码块,才执行构造块,再执行构造方法。
    在这里插入图片描述
    静态变量number的值变化过程:在定义时即存放到方法区中,初值为10;主方法执行到第9行时用到了Animal类则进行类加载,静态代码块随之执行,number的值覆盖为100。

3)若主方法main所在的主类中也有静态代码块,虽然主方法为程序的入口,但仍然先执行静态代码块。原因:先有主类才有主方法。静态代码块在类加载时即执行。
执行顺序(主类中):静态代码块 > 主方法

4)多个静态代码块在编译后会合并成一个。

  • 同步代码块
    后续补充。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值