java的初始化

xiaoxiao2021-02-28  59

java的初始化和清理

说明:最近在看java编程思想,想着单纯的看书,收获可能是不大的。要是能结合书上的代码,顺便在写一些对于书中知识的理解(虽然这样可能会拖慢看书的速度),这样的话,书中的东西可能更容易转换成我自己的东西。那么,索性就写在这里吧!

一. 用构造器初始化

所谓的初始化,就是在使用某个对象之前,为对象的属性(成员变量)等进行赋值等 操作。举个栗子: 汽车厂现在造好了一辆车,但是众所周知,要想让汽车跑起来(使 用对象),是不是要加油?(加气的或者加电的车都是一个道理),那么这个加油这个动作就可以看做是对汽车对象的初始化。


使用上面这个例子可以很容易想象到,我们初始化的动作和创建对象的动作是完全分 开的。先创建好对象(造好汽车),再初始化(给汽车加油)。这要是放在面向对象的计算机语言中,似乎可以理解为,先创建好一个对象,然后使用该对象调用对象中的初始化方法。


java初始化的巧妙之处,就是使用构造方法进行初始化(沿用c++的方式)。 什么是构造方法?就是没有任何返回值,方法名和类名完全相同的方法; 为什么构造方法名和类名要完全相同?第一,我们知道,一个类中,所有的方法名是唯一的(这里不说方法重载),那么如果构造方法名和其他普通方法名采用同样的起法,是很容易冲突的。第二,构造方法时通过jvm调用的,采用这种命名方式,就够唯一标识调用那个类的构造方法。


下面我们继续言归正传: java采用 ” new 构造方法名(参数列表)1.”这样的方式,将创建对象和初始化对象绑定在一起 。强制初始化对象,避免由于没有初始化而带来的一系列错 误。不这样写,编译器会报错。当new之后返回一个对象的引用,之后编译器调用该对象对应的构造方法,进行对象的初始化。 开发者是不能手动调用构造方法的,构造方法是由jvm调用。但是,很多时候,为了避免重复代码的书写,开发者可以在构造方法的第一行,使用this语句,调用本类的其他构造方法,可以并且只可以调用一次。

二. this 关键字和this语句

众所周知,this只能在非静态方法中使用, 代表的是当前对象的引用。换个方式问一下,就是当我们创建一个类的两个对象,分别调用两个对象的同一个方法,那么编译器怎么确定,我们调用的是哪个对象的方法呢?

Class Test(){ public static void main(String[] args) { Student stu1 = new Student(); Student stu2 = new Student(); stu1.test("math"); stu2.test("math"); // 疑问? 编译器是如何知道调用的是哪个对象的test方法呢? } }

java编程思想中:这样说的,当我们调用一个对象的非静态方法时,会隐式的传递个当前对象的引用。 也就是说,向我们上面那样调用的方法,其实是这样的:

// 但是其实,内部是这样的。可是我们并不能这样写,编译器会报错。 //Student.test(stu1,subject); // Student.test(stu2,subject);

假如开发者想在方法内部拿到当前对象的引用,由于当前对象的引用被隐式的传递过来,没有标识符,所以使用this做标识符,就表示当前对象的引用。 当我们在一个方法的内部调用该对象的其他方方法时,其实默认的也使用了this。只是我们隐藏了,我们看不到。

三. 跟基本类型有关的方法重载

这里不再重复累赘的说明,什么是方法重载。 废话先不多说,上段代码,读者可以先观察一下:

public class BasicTypeOverLoad { public void f1(char a){ System.out.println("char"); } public void f1(byte a){ System.out.println("byte"); } public void f1(int a){ System.out.println("int"); } public void f1(long a){ System.out.println("long"); } public void f1(float a){ System.out.println("float"); } public void f1(double a){ System.out.println("double"); } public static void main(String[] args) { BasicTypeOverLoad overLoad = new BasicTypeOverLoad(); overLoad.f1(5); // 1,输出 int char a = 98; overLoad.f1(a); // 2.1,没有注释f1(char a)方法:输出char // 2.2,没有注释f1(char a)方法:输出int byte b = 1; overLoad.f1(b); // 3.1,没有注释f1(byte a)方法时 :输出 byte // 3.2,注释f1(byte a)方法时 :输出 int float f = 1; overLoad.f1(f); // 4 没有注释f1(float a) 输出float;注释之后,输出 double } }

从上面的代码中,可以很容易看出来:

当我们传递实参是常数时,jvm会当成int类型来处理;当传递对应的定义好基本类型的变量时,才会调用对应的方法。

当传递的实参类型比形参小时: 如果传递的是char类型,则直接自动提升为int;如果是其他类型,则自动提升到形参存在大于此类型的方法的形参的类型;

当传递的实参类型比形参大时,编译器会报错,需要强制将类型转化为对应的小类型;

声明:本文的所有知识点都只作讨论,欢迎指出缺点,一起进步。


new构造方法名(参数列表): 这里需要注意的是,构造方法并没有返回任何值。该语句结束后,会返回一个对象的引用,很多人以为是构造方法返回的,并不是 ,这是由于 new表达式会返回所创建对象的应用。. ↩
转载请注明原文地址: https://www.6miu.com/read-2631750.html

最新回复(0)