Java的编程逻辑(Java基础)(SE传)
类的基础
一. 类
1.类的基本概念:
类不仅仅只是函数的容器,也更多的代表着自定义数据类型。
1.1 函数的容器
JavaAPI中有一个Math类,在这个类中有一些数学的函数,使用这些函数可以使用Math.XXX
的方式来调用。
这些函数都有相同的修饰符public static
,static代表着类的方法,也叫做静态方法,
与类方法相对的是实例方法。实例方法没有static修饰符修饰,前面必须通过实例或者对象调用,而类方法可以直接通过类名进行调用,不需要创造实例。public代表着这些函数是公开的,可以在被外部调用。
Math类的常用函数
public与private相对比,private表示私有的,这个函数只能在同一个类中被别的函数调用,不可以被外部的类调用。
将函数声明为private可以避免该函数被外部类误用,操作者可以区分哪些是能调用的,哪些是不能的,
通过private的封装和隐藏内部实现细节,避免被误操作,这是计算机程序的一种基本思维方式。
Arrays 类的一些常用函数
这里将类看作函数的容器,从概念上来看Arrays和Math也可以看作自定义数据类型,其中public static 函数可以看作类型可操作函数。
1.2 自定数据类型
我们将类看作自定义数据类型,所谓自定义数据类型就是除开8种基本数据类型以外的其他类型,用于表示和处理基本类型以外的数据。
一个数据类型包括属性以及该类型可以进行的操作组成,属性又可以分为类型本身具有的属性,还是一个具体实例具有的属性,
同样,操作也可以分为是类型本身可以进行的操作,还是一个具体实例可以进行的操作。
有点点绕稍微多读几遍。
类变量和实例变量都叫做成员变量,也就是类的成员,类变量也叫做静态变量或者静态成员。
类方法和实例方法都叫做成员方法,也就是类的成员,类方法也叫做静态方法。
这样,一个数据类型就主要分为4个部分:
对于一个类不一定每个部分都有。
类型本身具有的属性通过类变量来体现。
实例变量表示具体的实例所具备的属性,
实例方法表示具体的实例可以进行的操作。
在实例方法种,有一个隐含的参数,这个参数就是当前操作的实例自己,直接操作实例变量,实际也是需要用参数进行。实例方法与类方法更多区别如下:
1.2.1 代码块设置默认值
实例都有初始的默认值,如果我们要修改初始的默认值,可以通过在定义变量的同时就进行赋值,或者通过将代码放入到初始代码块中。{ //初始化}
在型建立一个对象时,就会先调用这个初始化,然后才会执行构造方法中的代码。
若语句外面包了一个static{ },这叫做静态初始化代码块。静态初始化代码块在类加载的时候被执行,在任何对象创建的之前都会被也只会被加载一次。
1.3 构造法
在初始化对象的时候,有一种方法可以直接对实例变量赋初始值,就是构造方法。
public class point {
//设置两个私有化实例整数类型变量
private int x;
private int y;
//无参构造器
public point(){
}
//传参构造器
public point ( int x , int y ){
this.x = x;
this.y = y;
}
//x y分别的get和set方法
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
其中
//无参构造器
public point(){
}
//传参构造器
public point ( int x , int y ){
this.x = x;
this.y = y;
}
就是两个构造方法,构造方法可以有多个,不同于一般方法,构造方法有一些特殊的点:
- 名称是固定的,与类的名称相同。
- 没有返回值,也不能有返回值。构造方法中隐含的返回值就是实例本身。
与普通方法一样,构造方法也可以重载,第二个构造方法,使用this对实例变量赋值。
使用构造方法point p = new point(3,4);
至少做了几件事:
分配内存。
给实例变量设置默认值。
调用构造方法。
1.3.1 默认构造方法和私有构造方法
其中构造方法这有处细节,构造方法中有默认构造方法,也有私有构造方法。
1.默认构造方法:每个类都至少要一个构造方法,在通过new创建对象的时候被调用。但是构造方法如果无参可以被省略,Java的编译器会自动生产一个默认的构造方法,也就是无参的构造方法。
2.私有构造方法
构造器方法可以是私有的,也就是可以被private修饰的,一下几种场景下会被用到:
(1)不能创造类的实例,类只能通过静态访问,如Math 和 Arrays类,它们的构造方法就是私有的。
(2)能创建类的实例,但只能被类的静态方法调用。当类的对象有但只能有一个,即单例,在这张情况下对象时通过静态方法获取的,而静态方法调用的私有构造方法创建一个对象,如果被创建过了,那就会重用这个对象。
(3)只是用来被其他对各构造方法调用的,便于减少代码量。
1.4 类和对象的生命周期
- 在程序运行过程中,当第一次通过new 创建了一个对象时,或者之间通过类名访问类变量和类方法时,Java就会将类加载进内存,为这个类分配一个空间,这个空间包括它定义、变量、方法信息,同时还会加载类的静态变量,并对静态变量赋初始值。
- 类加载进内存后,一般不会释放,直到程序结束。一般情况下类只会加载一次,所以静态变量在内存中只会有一份,也就是只会加载一次。
- 当通过new 创建一个对象时,对象产生在内存中,会存储这个对象的实例变量值,每new一次就会产生一个新的对象,就会有一份独立的实例变量。
- 每个对象除了保存实例变量值外,可以理解还保存着对应类型即类的地址,这样通过对象能知道它的类,访问到类的变量和方法代码。
- 实例方法可以理解为一个静态方法,只是多了一个参数this。通过对象调用方法,可以理解为就是调用这个静态方法,并将对象作为参数传给this。
- 对象的释放是被Java用垃圾回收机制管理的当没有活跃变量指向对象的时候,对应的堆空间就可能会被释放。(方法区和堆是需要GC回收的区域,而堆是重点回收区域)
活跃变量就是已加载的类的类变量,以及栈中所以变量。
总结
通过对类的实现自定义数据类型,封装该类型的数据所具备的属性和操作,隐藏实现细节,从而在更高的层次(类和对象的层次,而非基本数据类型和函数的层次)上考虑和操作数据。一些上述被提到的关键词: