JAVA-初步认识-第七章-this不明白的点(补录)

Posted 照破山河万朵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-初步认识-第七章-this不明白的点(补录)相关的知识,希望对你有一定的参考价值。

一.

截图是想要说明,我在构造函数中调用一般函数时,用this.speak(); 居然可以运行,省略this.也是可以的。但是如果是构造函数之间调用,写成this.Person(String name); 就不行。

我知道无论是构造函数调用一般函数,还是构造调用构造函数,p.调用绝对是不可以的,对象还没建成。但是为什么构造函数调用一般函数就可以

二.

this的知识点是从区分对象的成员和构造函数的形参,以及标定哪个对象调用的成员函数开始的。(这就相当于this的两个应用了)

之前构造函数横向和一般进行了比较,它们之前有显著的区别。同时,构造函数纵向进行了比较,不同形式的构造函数间有什么区别。

其实还有一个知识点,是构造函数可以横向和纵向展开的,就是调用,不同的函数互相间进行调用。

我是觉着调用存在的原因有两个:一是为了使用方法所具有的功能,进行调用。二是,为了提高复用性。两者也可以统一起来,调用一个方法,自己就可以不用再次进行书写,这在形式上就提高复用性。

当类中有多个函数存在时,从函数这个层面来看,可能就会存在两个知识点,函数的重载和函数的调用

三. 详述描述类中函数的调用问题

有一个原则要先交代,一般函数不可以调用构造函数,(构造函数是在对象创建时,才被调用的,不是随便调用的,而且只可调用一次)

但是构造函数可以调用一般函数。构造函数也可以相互间调用,这就意味着分步构造函数初始化。

现在讨论的就是在这些调用中,格式是怎么个写法,有什么需要的

(1)构造函数中调用一般函数

看上面的截图,构造函数中调用了一般函数,但是调用的一般函数前面没有任何的修饰,直接写了个speak(); 我的想法是调用必须有个对象来调用,这里前面怎么没有对象调用?只是单纯地一个被调用的函数,很奇怪。也可能是由this,但是省略了

我接着在speak()方法前面,加上this. 看结果具体如何。

加上this.是没有错的,也许调用就是针对对象来说的,每一个被调用的方法前面都有一个对象,符合对象.成员的调用形式

这里还诞生一个问题,speak()方法中输出的是对象中的变量,构造还没结束,就可以直接使用堆内存中还没创建完对象中的变量了么?

(2) 一般函数中调用构造函数

我先在要明确一点调用函数都是对象来进行的,对象调用的同时要符合相应的意义。构造函数是不能随便调用的。只有创建对象时,才能调用,而这里是创建好的对象来调用,也就是说初始化好的对象再次来初始化,这是没有意义的。

因此,禁止一般函数调用构造函数。

(3) 构造函数中调用构造函数

对于构造函数中调用构造函数,相当于将构造初始化分成了两步构造初始化。

这里需要注意的是调用的时候,对象怎么表示?一定要牢记,这个时候,对象还没有创建完成。

重点就集中在对象.成员形式中,对象的表示上,用引用类型变量绝对不行。还有两种,一个是this.构造函数,另一个是this.(参数列表),后者是前者的简化写法。

A:第一种写法

DOS显示错误。

B:

稍微变动一下,就可以了。为什么这么改就可以,为什么对象.成员的传统调用方式就不行。

通过阅读打印的资料,我发现写成this(name),很想传递。我们解析一下这几句代码,以下图为例,将代码补全。

先是有创建对象这句话,Person p=new Person("旺财", 20),堆中开辟空间后,分配地址值,对象空间中载入变量并且进行默认初始化。由于"旺财"和20的出现,导致了基本数据类型的传递,给属性初始化用的。依据实参的类型,个数,顺序,找到Person(String name, int age)构造函数载入栈中,给定指示this,this=0xxx。同时,对Person(String name, int age)中的形参进行赋值,name="旺财",age=20; 接着在name="旺财"的情况下,执行this(name),这句话很像传递。可以理解为this("旺财"),这样又调用了Person(int age)构造函数。在对象没有创建完成的情况下,用对象.成员调用成员是不可以的,但是采用传递的方法是可以的。

流程基本就是下面这个样子。

注意:在构造函数调用构造函数的过程中还有一点,this(name)要在this.age=age语句的前面。这很好理解,this(name)依旧是构造函数,将this.age=age视为普通的调用,初始化肯定要在前面。以下面截图中的例子讲解,

本意是将name和age,设置成旺财和30,但是由于this初始化在最后一句,导致name变成了haha,这就违背了初衷了。

四. this关键字在描述类中的总结

在描述类中函数的调用,有这么几种,构造函数调用一般函数,构造函数之间互调,一般函数之间互调。一般函数之间互调不做讲解。

构造函数之间互调时this的使用方法,和构造函数调用一般函数时this的书写完全不一样。

构造函数互调,this的书写:this(name),且要写在第一行。

构造函数调用一般函数,this的书写:this.speak(); 

这里的问题就是为什么调用一般函数可以写成this.speak(),而调用构造函数就不能写成this.Person(String name)?

首先要明确一点,对象.成员是必须的。类中的成员要想被执行,必须被对象调用,除了静态。那为什么分布构造中,又不行了呢?因为这是属于对象初始化,要按照初始化的格式来,就想new Person();的样式,传递来。

 

以上是关于JAVA-初步认识-第七章-this不明白的点(补录)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第七章-this关键字特点

JAVA-初步认识-第七章-this关键字内存图解

JAVA-初步认识-第七章-构造函数重载

课时练第七单元《小数的初步认识》(含答案)人教版数学三年级下册

JAVA-初步认识-第六章-成员变量和局部变量的显示初始化

JAVA-初步认识-第二章-算术运算符2续