当前位置:网站首页 > Java基础 > 正文

Java如何自定义基础数据类型



目录
  • 1.四个组成部分
  • 2.可见范围
  • 3.其他关键字
  • 4.类和对象的生命周期
    • 类的生命周期
    • 对象的生命周期

java中除了8种

基本数据类型

byte、short、int、long、float、double、boolean、char,可以使用类-关键字class来

自定义数据类型

 

1.四个组成部分

类中主要包括四个部分:

  • 类变量:类型本身具有的属性,也叫静态(成员)变量,使用static修饰
  • 类方法:类型本身可以进行的操作,也叫静态(成员)方法,使用static修饰
  • 实例变量:类型实例具有的属性,也叫成员变量,实例就是一个实际的例子
  • 实例方法:类型实例可以进行的操作,也叫成员方法

其中类方法只能访问类变量,调用类的其他方法。实例方法既能访问实例变量、调用实例方法,也能访问类变量、调用类方法。

“通过类实现自定义数据类型,封装该类型的数据所具有的属性和操作,隐藏实现细节,从而在更高的层次(类和对象的层次,而非基本数据类型和函数的层次)上考虑和操作数据,是计算机程序解决复杂问题的一种重要的思维方式”

2.可见范围

public、private、protected、default等关键字,用来修饰类、构造函数、成员变量、成员方法,来表示可见范围,范围的大小是private < 默认(包) < protected < public,如下:

修饰符 类内部可见 同一个包内 子类可见 任何地方 private yes default yes yes protected yes yes yes public yes yes yes yes

如果子类和父类不在同一个包中,protected修饰的变量和方法会被子类继承,但子类无法访问父类对应的变量和方法。

3.其他关键字

  • static:修饰类变量和类方法,也可修饰类的内部类。可以修饰代码块,用静态代码块初始化静态变量,在类加载的时候执行,在对象创建之前只执行一次。
  • this:表示当前实例,可以访问其他构造方法,访问实例变量和实例方法
  • final:修饰变量时表示常量,即变量赋值后就不能再修改了,只能赋值一次,也可以修饰方法
  • extend:子类继承父类时使用,会继承父类的protected和publie变量和方法,只能单继承
  • implement:实现接口,可以实现多个接口

4.类和对象的生命周期

类的生命周期

类的生命周期是class文件装载到卸载的过程,有装载、验证、准备、解析、初始化、使用、卸载7个阶段,前三个过程称为连接过程。
(1) 装载
类装载没有明确触发条件,但需要在类初始化之前完成,主要有三个步骤:

  • 根据类名获取类的二进制字节流
  • 将字节流的内容转存到方法区
  • 在内存中生成一个Class对象作为该类方法区数据的访问入口

其中通过类名获取类的二进制字节流,是通过类加载器来完成。使用了双亲委派模型(当一个类加载器收到类加载请求时,不会直接加载这个类,而是把这个加载请求委派给自己父加载器去完成。如果父加载器无法加载时,子加载器才会去尝试加载)避免同一个类被多个类加载器重复加载。

(2) 验证
验证类是否合法。如有效的类型、合理的继承和实现、方法和变量是否重复等,来保证加载的类能够被jvm运行。

(3) 准备
主要是对类变量在方法区分配内存,并初始化。

(4) 解析
把常量池中的符号引用解析为直接引用:根据符号引用所作的描述,在内存中找到符合描述的目标并把目标指针指针返回。

(5) 初始化
按照顺序自上而下运行类中的静态变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的静态变量赋值语句和静态语句。其他没有static修饰的变量赋值和语句在实例化对象的时候才会运行。

(6) 使用
类的使用有主动引用和被动引用,主动引用会触发类的初始化,被动引用不会。

 

主动引用

  • 通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法
    • new InitClass();
    • InitClass.a;
    • InitClass.method();
  • 通过反射方式执行以上三种行为
    • Class cls = InitClass.class; cls.newInstance();
    • Filed f = cls.getDeclaredFiled("a"); f.get(null);
    • Method md = cls.getDeclaredMethod("method"); md.invoke(null, null);
  • 初始化子类的时候,会触发父类的初始化
    • new SubInitClass();
  • 虚拟机启动时,初始化一个执行主类,运行main方法触发。
  • jvm1.7使用动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发其初始化

被动Java如何自定义基础数据类型引用

  • 引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化。
    • String a = SubInitClass.a;
  • 定义类数组,不会引起类的初始化。
    • SubInitClass[] sc = new SubInitClass[10];
  • 引用类的常量,不会引起类的初始化
    • String b = InitClass.b;

(7) 卸载
当以下条件均被满足时,类会被卸载,即清空方法区中的类信息

  • 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例
  • 加载该类的ClassLoader已经被回收
  • 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法
对象的生命周期

对象的生命周期是类的生命周期中使用阶段的主动引用的一种情况,比类的生命周期短的多,也包含7个阶段:创建阶段、应用阶段、不可视阶段、不可达阶段、可收集阶段、终结阶段和释放阶段。
创建阶段

  • 注意:避免在循环体中创建对象,即使该对象占用内存空间不大。不要对一个对象进行多次初始化,这同样会带来较大的内存开销,降低系统性能

应用阶段

  • 系统至少维护着对象的一个强引用
  • 所有对该对象的引用全部是强引用(除非我们显式地使用了:软引用(Soft Reference)、弱引用(Weak Reference)或虚引用(Phantom Reference))

不可视阶段
在一个对象经历了应用阶段之后,那么该对象便处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用它,其强引用已经消失,例如,本地变量超出了其可视范围。

不可达阶段
在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)的引用

可收集阶段、终结阶段与释放阶段
(1)垃圾回收器发现该对象已经不可到达。
(2)finalize方法已经被执行。
(3)对象空间已被重用。

版权声明


相关文章:

  • 有java基础转行做什么好2024-11-09 09:42:03
  • 0基础入行java2024-11-09 09:42:03
  • 零基础java与python2024-11-09 09:42:03
  • 0基础java知乎2024-11-09 09:42:03
  • 玉溪java编程基础入门机构2024-11-09 09:42:03
  • JAVA 牛客补基础2024-11-09 09:42:03
  • java零基础学习班2024-11-09 09:42:03
  • java基础教学2542024-11-09 09:42:03
  • java面向对象基础类2024-11-09 09:42:03
  • 大一java零基础学习2024-11-09 09:42:03