Java对象创建的过程及相关概念

Java中对象实例化的相关讲解:

1.在子类构造对象时,访问子类的构造函数,父类的构造函数也运行,这是因为在子类的构造函数中第一行有一个默认的隐式语句,super();调用父类中空参数的构造函数

构造函数不会覆盖,函数名不会相同。构造函数不能继承。

子类的实例化过程:子类的所有构造函数默认都会访问父类的空参的构造函数。

2.子类实例化时为什么要访问父类的构造函数?因为子类继承父类,获取到了父类中的内容,所以在使用父类内容之前要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时必须要访问父类的构造函数
为了完成这个必须的动作,就在子类前添加了super()语句,如果父类中没有定义空参数的构造函数,那么子类的构造函数就必须用super明确调用父类中的某个构造函数。
注意:super语句必须定义在子类构造函数的第一行,因为父类的初始化动作必须要先完成。同时子类的构造函数中使用了this()调用本类的构造函数时,那么默认的super()就没有了,因为super和this都必须定义在第一行,所以只能存在一个,但可以保证的是子类中肯定会有其他的构造函数来访问父类中的构造函数。

3.java中的自定义的任何类都是子类。在构造函数中,第一句默认存在super()(明确存在this,super除外),因为在java中,默认任何类都是Object的子类。任何类都默认继承另外一个类。子类初始化时,通过构造函数,调用super进行父类初始化时子类成员变量仅进行了默认初始化,而没有进行显示初始化。当父类初始化完成后子类变量才立即进行显示初始化。在类中,函数的运行顺序是数据(变量,成员函数)的定义——语句块——构造函数。但任何对象,变量都是先定义再使用,在小的方向上顺序执行。主类中的静态代码块——主方法,在主方法中创建对象时运行顺序:创建对象类的静态代码块——创建对象类的构造代码块——构造函数。
需要注意:主类不需要创建对象,所以主类中的构造代码块不会执行。

4.任何类创建对象都需要借助于构造函数,当没有定义构造函数时,系统就调用默认的构造函数。一旦自己定义了构造函数,系统就不再创建默认的构造函数。当一个对象在一创建时就需要具有某些功能,这时候就需要使用构造函数来给其初始化。构造函数可以带参数
构造函数与一般函数的区别:
构造函数是对象创建时调用,构造函数只在对象创建时调用一次。构造函数可以直接调用成员函数。
一般成员函数是对象创建完成后才能被调用,一般函数在对象创建完成后可以调用多次。一般情况下成员函数不能直接调用当前对象的构造函数,如果必须调用构造函数,则需要重新创建对象。
注意:构造函数没有返回值,一旦在构造函数前添加返回值类型(包括空值)时,构造函数降级变成成员函数,但构造函数中也可以存在return ,用来标志程序执行结束。
5.this关键字:代表当前对象。即:所在所在函数所属的对象的引用,也就是哪个对象调用了this所在的函数,this就是指那个对象。只要在本类中用到本类的对象就需要使用到this.
类中调用非静态方法时都需要使用对象调用或者this。this也可以用于在构造函数中调用其他构造函数。但是需要注意此时对this的定义必须放到构造函数的的第一行。因为初始化动作需要先执行。作为关键字的this可以放在类中的任何地方使用,但是作为初始化对象调用其他构造函数的this必须放在类的第一行。

6.static:修饰的数据对象可以被类的所有对象共享。
特点:
static是一个修饰符,用于修饰成员(变量,函数)
static修饰的成员被所有的对象共享
static优先于对象存在,因为static的成员随类的加载而存在
static修饰的成员可以直接使用类名调用,里也可以使用对象调用。类名.静态成员名或对象.静态成员名
static修饰的数据是共享数据,对象中的存储是特有数据。
注意:
静态变量不是成员变量!!以类存在而存在。叫类变量。
成员变量又叫实例变量!!以对象存在而存在。
类类型变量是类的对象。

成员变量与静态变量的区别:
1,成员变量随着对象的创建而创建,随着对象的回收而消失。
静态变量随着类的加载而创建,随着类的消失而消失。(类的回收是垃圾回收机制)
两个变量的生命周期不同。
2,调用方式不同。
成员变量只能被对象调用。
而静态变量也可以被类名调用。但不建议使用对象调用,尽量使用类名调用。
3,别名不同
成员变量也叫实例变量!
静态变量也叫类变量。
4,存储位置不同
成员变量数据存放在堆内存中(堆内存存放的是对象,栈内存存放局部内存),所以也叫对象的特有数据
静态变量数据存放在方法区(数据区,共享区)的静态区中。所以也叫对象的共享数据。

静态使用需要注意:
1,静态方法只能访问静态成员(变量,方法)(注:非静态即可访问静态,也可访问非静态)(访问局限性)
2,静态方法中不可以使用this,super关键字。
3,主函数是静态的。

什么时候使用静态?
静态变量:
当分析对象中所具备的成员变量的值都是相同的,这时这个成员就可以被静态修饰。需注意:该成员不再变化(一变全变)。
只要数据在对象中存在不同的,那么数据就是特有数据,必须存储在对象中,是非静态的。
如果数据全部相同,并且对象不需要做修改而仅需要使用,那么数据不需要存储在对象中,可以是静态的。
静态函数:
函数是否用静态修饰,就参考一点:该函数功能是否有访问对象中的特有数据
简单来说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要该功能就是非静态的。
如果不需要,就可以经该功能定义成静态的。

静态代码块:随着类的加载而执行。多次创建对象,类仅加载一次,也就是说,静态代码块仅在第一次创建对象时执行。其作用是给类初始化。
构造代码块:没有关键字修饰的独立代码块。每次创建对象均会执行。给所有对象进行通用的初始化。
构造函数:给对应的对象进行针对性的初始化。
局部代码块:在方法内部,限定变量的生命周期。

7.主函数的特别之处:1,有固定格式 (权限最大,不需要对象,没有具体的返回值,main不是关键字,只是被虚拟机所识别的保留字,参数类型是个字符串数组)2,备JVM所识别和调用。
注意:在类中也可以声明新的main()方法,但必须与主方法参数类型,个数不同!即:对主方法进行重载。

8.final关键字:
继承的弊端:打破了封装性。
final是一个修饰符,可以修饰类,方法,变量。
final修饰的类不可以被继承。
final修饰的方法不能被覆盖。
final修饰变量是一个常量,只能赋值一次。通常常量都定义成static,共享。final定义的变量必须显示初始化。

为什么用final修饰变量?在程序中,如果一个数据是固定的,那么可以直接使用该数据。但是这样使用阅读性差。所以就给该数据起个名称,并且所起名的变量的只是不能变的,所以就用final修饰。

变量和函数取名规则相同,第一个单词小写后面的首字母大写。
常量取名全部大些,如果单词不唯一,则单词与单词间用下划线连接。
累取名每个单词的首字母大写。

9.一个对象实例化过程:
1.JVM读取指定(默认)路径下的字节码文件,并加载至内存。并且先加载该类的直接父类(Object除外)。
2.在堆内存中开辟空间,分配内存地址。
3.在对象空间中,对对象中的属性进行默认初始化
4.调用对应的构造函数,进行初始化。
5.在构造函数中第一行会先调用父类中的构造函数进行初始化。
6.父类初始化完毕后,再对子类变量进行显示初始化。
7.紧接着在进行子类构造函数的特定初始化。
8.运行构造函数中的其他内容。
9.初始化完毕后,将地址支付给引用变量。

下面一个实例说明对象的实例化过程:

//继承执行的顺序演示,下面代码执行顺序按照注释顺序注释
class Fu
{
	Fu()//4
	{
		System.out.println("Fu run!");//5
		show();//6
	}
	void show()
	{
		System.out.println("Fu show run!");
	}
}
class Zi extends Fu
{
	int a=100;//2,前半部分,默认初始化<span style="white-space:pre">	</span>//9,后半部分,显示初始化
	Zi()
	{
		super();//3
		System.out.println("Zi run!"+a);//10
	}
	void show()//7
	{
		System.out.println("Zi show run!"+a);//8
	}
}
class J6302
{
	public static void main(String[] args) 
	{
		Zi z = new Zi();//1
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值