zoukankan      html  css  js  c++  java
  • 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();的样式,传递来。

  • 相关阅读:
    1,300萬像素Xperia TX K.O.相機 東方日報
    信息检索Reading List
    雷军:小米二为何不用1300万像素相机_TechWeb
    1300万像素高清双核旗舰 索尼LT30p评测_手机_科技时代_新浪网
    Darts: DoubleARray Trie System海 的 声音我的搜狐
    说说底层架构之实体类的设计
    不忘本~枚举
    两种底层数据层操作时的架构方式,你喜欢那种?
    说说C#中的global
    JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7774931.html
Copyright © 2011-2022 走看看