1.构造函数
构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
对象在一建立时就会调用与之对应的构造函数。
构造函数特点:
1.该函数名称与所在类名称相同。
2.不用定义返回值类型。
3.该函数没有具体的返回值,不可以写return语句。
作用:给对象进行初始化。 所有对象创建时,都需要初始化才可以使用。
注意:
1.默认构造函数的特点。
2.多个构造函数是以重载的形式存在的。
构造函数的小细节:当一个类在定义时,如果没有定义构造函数,那么该类系统会自动生成一个空参数的构造函数,这是为了方便该类创建对象,完成初始化。如果在类中定义了构造函数,那么默认的构造函数就没有了。
构造函数和一般函数有什么区别呢?
1.在写法上不同,也就是两个函数定义格式不同。
2.构造函数是在对象创建时就被调用、执行,给对象初始化。而一般函数是对象创建后,在需要调用时才执行,是给对象添加具备的功能。
3.在一个对象建立,构造函数只运行一次。而一般函数可以被该对象调用多次。
什么时候定义构造函数呢?
当分析事物时,该事物一出现就具备一些特性或行为,那么将这些内容定义在构造函数中。
构造函数和构造代码块有什么区别?
构造函数:给对应的对象初始化,具有针对性。
构造代码块:给所有的对象进行初始化,也就是所有对象都会调用一个代码块。只要对象一建立就会调用这个代码块。
格式:
[java] view plain copy ![]()
- <span style="font-size:14px;">{
- 构造代码块//定义不同对像共性的初始化内容
- }</span>
作用:给所有对象进行初始化。
对象的初始化过程
示例:Person p = new Person("赵二",18);
该段代码都做了什么呢,创建一个对象都在内存中做了什么呢?
1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。也就是先将硬盘上指定位置的Person.class文件加载进内存。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
4.在堆内存中开辟一个实体空间,分配了一个内存地址。也就是new。
5.在堆内存中建立对象的特有属性。并进行默认初始化。
6.对空间中的属性进行显示初始化。
7.对对象进行构造代码块初始化。
8.调用该实体对应的构造函数,进行构造函数初始化。
9.将内存地址赋给栈内存中的p变量,p变量就引用了该实体。也就是指向了该对象。
2.this
是区分成员变量和局部变量同名的情况。
this到底代表什么呢?
this代表本类的对象。
但是到底代表本类中哪一个对象呢?
this代表它所在函数所属对象的引用。简单说就是哪个对象在调用this所在的函数,this就代表哪个对象。
开发时,什么时候使用this呢?
当定义类中功能时,如果该函数内部要用到调用该函数的对象,用this表示这个对象。但凡本类功能内部使用本类对象,都用this表示。
注意:构造函数间的调用只能用this语句。用this调用构造函数,必须定义在构造函数的第一行。因为构造函数是用于初始化的,初始化要先执行,而且只执行一次。如果不放到第一行会报错。编译会失败。
一般函数是不能直接调用构造函数的,因为this语句是不能用在一般函数中的,只能用在构造函数间。但要防止死循环情况。就是构造函数互相调用。
示例:A(){
this("aaa");
}
A(String name){
this();
}
调用格式:this(实际参数);
1.this.成员属性或成员方法(一般方法);
2.this(本类中的对应参数的构造函数);
3.static
static关键字:是一个修饰符。
用法:用于修饰成员(成员变量和成员函数),不能修饰局部。
被修饰后的成员具备的特点:
1.随着类的加载而加载 也就是说:静态会随着类的消失而消失。说明它的生命周期最长。
2.优先于对象存在 明确一点:静态是先存在。对象是后存在。
3.被所有对象所共享。
4.除了可以被对象调用外,还可以直接被类名调用 格式:类名.静态成员;
使用注意:
1.静态方法只能访问静态成员,不可以访问非静态成员。而非静态方法既可以访问静态也可以访问非静态。
因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。
2.静态方法中不可以使用this,super(代表父类引用,也就是父类对象)关键字。
因为静态方法加载时,优先于对象存在,所以静态方法中不可以出现this。
3.有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。
这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。
4.主函数是静态的。
静态的利弊:
利:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。
弊:生命周期过长。访问出现局限性。(静态虽好,只能访问静态,而非静态谁都能访问)
什么时候使用静态呢?
从两方面来看:因为静态修饰的内容有成员变量和成员函数。
什么时候定义静态变量(类变量)?
当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(也就是对象特有数据),那么该功能可以定义成静态函数。
成员变量与静态变量(类变量)的区别:
1.成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。
2.存放位置
成员变量随着对象的建立而存在于堆内存中。
静态变量随着类的加载而存在于方法区中。
3.生命周期
成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。
4.成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。
所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
方法区(也叫共享区或数据区)。里面放的是类中的方法,类中的共享数据
如:String name;//这样的叫成员变量,也叫实例变量(对象的变量)。
static String person;//这样的叫静态的成员变量,也叫类变量。
静态的应用:
每一个应用程序中都有共性的功能,我们可以将这些共性功能进行抽取,独立封装,以便复用。
这个抽取出来共性功能的类我们可以称为工具类,虽然我们可以通过建立工具类的对象使用里面的方法。
但就有了问题:
1.对象是用于封装数据的,可是工具类对象并未封装特有数据。
2.我们操作的每一个方法都没有用到工具类对象中的特有数据。
这时就要考虑,让程序更严谨是不需要对象的。
我们就可以将工具类中的方法都定义成static的,直接通过类名调用即可。
通常情况下工具类都定义成静态方法
好处是:将方法都静态后,可以方便于使用。
注意:但是该类还是可以被其他程序建立对象的,所以为了更为严谨,可以强制让该类不能建立对象。
可以通过将构造函数私有化完成。
构造函数私有化示例:
[java] view plain copy ![]()
- <span style="font-size:14px;">class A
- {
- private A(){}
- private A a = new A();
- }</span>
静态代码块:就是一个有静态关键字标识的一个代码块区域。定义在类中。
格式示例:
[java] view plain copy ![]()
- <span style="font-size:14px;">static
- {
- 静态代码块中的执行语句。
- }</span>
作用与特点:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象也就只执行一次)。如果和主函数在同一类中,优先于主函数执行。
4.final
final:最终,作为一个修饰符。
1.final可以修饰类,方法,变量。
2.final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
3.final修饰的方法不可以被覆盖。被复写。
4.final修饰的变量是一个常量。只能被赋值一次,既可以修饰成员变量,又可以修饰局部变量。
5.内部类只能访问被final修饰的局部变量。也就是说内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
什么时候用final呢?
当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便阅读。而这个值不需要改变,所以加上final修饰。
作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过"_"连接。 被 public static final修饰的常量可以叫做全局常量。
5.Object
Object:是所有对象的直接或者间接父类,也可以说是所有对象的超类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的肯定是所有对象都具备的功能。
Object类里的一些方法
equals():Object里的方法,指示其他某个对象是否与此对象"相等"。用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
hashCode():返回该对象的哈希码值。也就是内存地址,支持此方法是为了提高哈希表的性能。
Integer.toHexString():转十六进制
getClass():返回此Object的运行时类。返回值类型是Class
toString():返回该对象的字符串表示,默认返回的格式:类名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())。
为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
本文详细解析了构造函数的作用及特点,包括初始化过程、构造函数与构造代码块的区别,以及this关键字的使用。同时深入探讨了静态成员的概念、特点与应用场景,并介绍了final关键字的用法。
520

被折叠的 条评论
为什么被折叠?



