关键字 构造函数 this static final Object

本文详细解析了构造函数的作用及特点,包括初始化过程、构造函数与构造代码块的区别,以及this关键字的使用。同时深入探讨了静态成员的概念、特点与应用场景,并介绍了final关键字的用法。

1.构造函数

构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。

对象在一建立时就会调用与之对应的构造函数。

 

构造函数特点:

1.该函数名称与所在类名称相同。

2.不用定义返回值类型。

3.该函数没有具体的返回值,不可以写return语句。

作用:给对象进行初始化。                     所有对象创建时,都需要初始化才可以使用。

 

注意:

1.默认构造函数的特点。

2.多个构造函数是以重载的形式存在的。

构造函数的小细节:当一个类在定义时,如果没有定义构造函数,那么该类系统会自动生成一个空参数的构造函数,这是为了方便该类创建对象,完成初始化。如果在类中定义了构造函数,那么默认的构造函数就没有了。

 

构造函数和一般函数有什么区别呢?

1.在写法上不同,也就是两个函数定义格式不同。

2.构造函数是在对象创建时就被调用、执行,给对象初始化。而一般函数是对象创建后,在需要调用时才执行,是给对象添加具备的功能。

3.在一个对象建立,构造函数只运行一次。而一般函数可以被该对象调用多次。

 

什么时候定义构造函数呢?

当分析事物时,该事物一出现就具备一些特性或行为,那么将这些内容定义在构造函数中。

 

构造函数和构造代码块有什么区别?

构造函数:给对应的对象初始化,具有针对性。

构造代码块:给所有的对象进行初始化,也就是所有对象都会调用一个代码块。只要对象一建立就会调用这个代码块。

格式:

[java] view plain copy  在CODE上查看代码片派生到我的代码片

  1. <span style="font-size:14px;">{  
  2.  构造代码块//定义不同对像共性的初始化内容  
  3. }</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  在CODE上查看代码片派生到我的代码片

  1. <span style="font-size:14px;">class A  
  2. {  
  3.       private A(){}  
  4.       private A a = new A();  
  5. }</span>  


静态代码块:就是一个有静态关键字标识的一个代码块区域。定义在类中。

格式示例:

[java] view plain copy  在CODE上查看代码片派生到我的代码片

  1. <span style="font-size:14px;">static  
  2. {  
  3.     静态代码块中的执行语句。  
  4. }</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())。

为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值