【Java基础】类的基础

  • 类是函数的容器,是自定义数据类型。
  • 类型本身具有的属性,类变量
  • 类型本身可以进行的操作,类方法
  • 类型实例具有的属性,实例变量
  • 类型实例可以进行的操作,实例方法
  • 类变量和实例变量都叫做成员变量,类变量也叫作静态变量或静态成员变量
  • 类方法和实例方法都叫做成员方法,类方法也叫静态方法。

类方法和实例方法的部分区别:

  • 类方法只能访问类变量,不能访问实例变量,可以调用其他的类方法,不能调用实例方法。
  • 实例方法技能访问实例变量,又能访问类变量,既可以调用实例方法,又可以调用类方法。

声明和赋值:

Point P;
P = new Point();
  • 声明变量本身只会分配存放位置的内存空间,这块空间吗诶呦指向任何实际内容。
  • p = new Point();创建了一个实例或对象,然后赋值给了Point类型的变量P,它至少做了两件事:
    1. 分配内存,以存储新对象的数据,对象数据包括这个对象的属性,具体包括其实例变量x,y;
    1. 给实例变量设置默认值,int类型默认值为0
  • 一般而言,不应该将实例变量声明为public,而只应该通过对象的方法对实例变量进行操作。

静态代码块,代码块

  • {} 新建一个对象时,会先调用这个初始化代码块,然后才会执行构造方法中的代码。
  • static {} 静态初始化代码块,在类加载时执行,这是在任何对象创建之前,且只执行一次。
int y;
{
	y = 2
}
static int STATIC_ONE;
static 
{
	STATIC_ONE = 1;
}

私有构造方法:

  • 不能创建类的实例,类只能被静态访问,,如Math和Arrays类,他们的构造方法就是私有的
  • 能创建类的实例,但只能被类的静态方法调用。有一种常见的场景:类的对象有但只能有一个,即单例(单个实例)。在这种场景中,对象是通过静态方法获取的,而静态方法调用私有构造方法创建一个对象, 如果对象已经创建过了,就重用这个对象。
  • 只能用来被其他多个构造方法调用,用于减少重复代码的。

类和对象的声明周期

  • 当第一次通过new创建一个类的对象时,或者直接通过类名访问类变量和类方法时,Java会将类加载进内存,为这个类分配一块空间, 这个空间会包括类的定义、它的变量和方法信息,同时还有类的静态变量,并对静态变量赋初始值。
  • 类加载到内存后,一般不会释放,直到程序结束。一般情况下, 类只会加载一次,所以静态变量在内存中只有一份。
  • 通过new创建一个对象时,对象产生,在内存中,会存储这个对象的实例变量值,每做new操作一次,就会产生一个对象,就会有一份独立的实例变量。
  • 每个对象除了保实例变量的值外,可以理解为还保存着对应类型即类的地址,这样,通过对象能直到它的类,访问到类的变量和方法代码。
  • 实例方法可以理解为一个静态方法,只是多了一个参数this。通过对象调用方法,可以理解为就是调用这个对象的静态方法,并将对象作为参数传给this。
  • 对象和数组一样,有两块内存,保存地址的部分分配在栈中,实际内容的部分分配在堆中。栈中的内存时自动管理的,函数调用入栈就会分配,出栈就会释放。
  • 堆中的内存是垃圾回收机制管理的,当没有活跃变量指向对象时,对应的堆空间就可能被释放,具体释放时间是Java虚拟机自己决定的。活跃变量就是已加载的类的类变量,以及栈中所有的变量。

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

jar包

  • 打包方式:jar -cvf <包名>.jar <最上层包名>
  • 使用jar包:加入类路径(classpath)

程序的编译与连链接

  • java源代码到运行的程序,有编译和链接两个步骤。
  • 编译是将源代码.java文件变成扩展名是.class的字节码文件,这个工作由javac命令完成。
  • 链接是在运行时动态执行的,.class文件不能直接运行,运行的是Java虚拟机,解析.class文件,转换为机器能够识别的二进制代码,然后运行。链接就是根据引用到的类加载相应的字节码并执行。
  • Java编译和运行时,都需要以参数指定一个classpath,即类路径。类路径可以有多个,对于直接的.class文件,目录是class文件的根目录;对于jar包,路径是jar包的完整名称(包括路径和jar包名)。
  • Java源代码编译时,Java编译器会确定引用的每个类的完全限定名,确定的方式是根据import语句和classpath。如果导入的是完全限定类名,则可以直接比较并确定。如果是模糊导入(带*),则根据classpath找对应父包,再在父包下寻找是否有对应的类。
  • Java运行时,会根据类的完全限定名寻找并加载类,寻找的方式就是类路径中寻找,如果是class文件的根目录,则直接查看是否有对应的子目录及文件,如果是jar文件,则首先在内存中解压文件,然后再查看是否有对应的类。
    import是编译时概念,用于确定完全限定名,在运行时,只根据完全限定名寻找并加载类,编译和运行时都依赖类路径,类路径中的jar文件会被解压用于寻找和加载类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值