Java-怎样构造方法和匿名对象

前言

在编写程序时不安全的初始化会导致程序发生发生重大错误。为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。Java中也采用了构造器,并且提供了“垃圾回收器”。对于不在使用的内存资源,垃圾回收器能自动将其释放。本篇文章主要介绍Java的构造方法以及匿名对象。

构造方法的定义语法与调用时机

什么是匿名对象以及匿名对象的基本使用

构造方法的定义语法与调用时机

构造方法的定义语法:

构造方法是在创建对象时被编译器自动调用,所以编译器应该知道构造方法的名字然后去调用它,为构造方法任意取名都可能会与类的某个成员冲突。于是Java采用了同C++中一样的方法:构造方法采用与类相同的名称。

在Java编程代码规范中要求:“每个方法首字母小写”,构造方法与类名是完全相同的,这个规范不适合构造方法,需要注意一下。

构造方法一般定义为如下三种方式:

class Student{

  public Student(){    //①

    ...

  }

  ...

}

class Student{

  Student(){      //②

    ...

  }

  ...

}

class Student{

  private Student(){    //③

    ...

  }

  ...

}

以上三种构造方式涉及到了访问权限的问题:

第①种方式,构造方法采用了public修饰表示该类的对象是可以被不同包的其他类创建。

第②种方式,默认为包访问属性,仅限于同包的类可以创建该类的对象。

第③种方式,使用private修饰使得构造方法对外不可见,该类的对象无法被创建。多用来实现单例模式。

在上面见了三种访问修饰符,如果学过C++那么还知道一种没有出现就是protected,本包中的子类可访问,不同包中的子类可以访问,不是子类不能访问。

所以需要注意:在子类中使用父类的对象或者使用其类对象访问父类的protected成员是不行的!

这里对包做一个解释:包类似于电脑中的文件夹,文件多了需要存于不同文件夹中方便管理,同样如此,类多了就需要放在不同的包里面方便管理。

关于被这四种修饰符修饰的属性会方法的可访问性做一个小结:

范围privatedefault(什么都不写)protectedpublic

同一个类OOOO

同一个包中的子类XOOO

同一个包中的其他类XOXO

不同包中的子类XXOO

不同包中的非子类XXXO

构造方法的调用时机:

前面一直在说构造方法的调用是在类创建时,与普通方法不同,构造方法在实例化新对象(使用new开辟空间后)调用一次。普通方法是在对象被实例化后可以调用多次。构造方法也可以重载(重载的概念在后面介绍)。

我们可以跟踪一下是如何调用类的构造方法的。

以下面这个程序进行跟踪:

class Person{

      private long pid=123456789;

      public Person(){

          System.out.println("Person()");

      }

      public Person(long pid){

        System.out.println("Person(long pid)");

        System.out.println("在使用传进来的pid赋值前:pid:"+this.pid);

        this.pid = pid;

        System.out.println("在使用传进来的pid赋值后:pid:"+this.pid);

      }

}

public class Student extends Person{  //extends 实现继承关系

  private String name;

  private int age=0;

  public Student(){

      System.out.println("Student()");

  }

  public Student(long pid, String name, int age){

    super(pid);        //调用父类的构造函数一定要写在最前面不然会报错

    System.out.println("Student(long pid, String name, int age)");

    this.name = name;

    this.age = age;

  }

  public getName(){

    return name;

  }

  public static void main(String[] args){

    Student stu1 = new Student();

    Student stu2 = new Student(123456,"Sakura",20);

  }

}

/*

output:

Person()

Student()

Person(long pid)

在使用传进来的pid赋值前:pid:123456789

在使用传进来的pid赋值后:pid:123456

Student(long pid, String name, int age)

*/在此我向大家推荐一个架构学习交流裙。交流学习裙号:821169538,里面会分享一些资深架构师录制的视频录像 

可以输出结果看出Java中的初始化顺序如下:

在任何其他事情发生之前,会将分配给对象的存储空间初始化成二进制零。

调用基类的构造函数。

按照声明顺序调用属性的初始化方法。在Person中先将pid赋值为1234556789然后在返回到构造函数中将123456赋值给pid。

调用导出类的构造函数。若是Student中属性有给定初始值,那么依旧如第三步后再进入构造函数进行其他初始化操作。

什么是匿名对象以及匿名对象的基本使用

什么是匿名对象?

我们来看一步就创建对象的语法:

①类名称 ②对象名称 = ③new ④类名称()

①:规定了对象的类型

②:对象的名字,唯一标识对象

③:开辟新的堆内存空间,存储对象的内容,若是没有new,则没有内存空间,对象也就无法实例化

④:调用构造方法初始化对象

④:在此我向大家推荐一个架构学习交流裙。交流学习裙号:821169538,里面会分享一些资深架构师录制的视频录像 

上面的这条语句在内存中开辟了两个空间,一个栈空间存储引用变量对象名称,一个使用new开辟的堆空间用于存储对象内容。

对象名称指向了在对堆中的对象,于是我们可以使用对象名称去操作对象。

若是我们只有"new 类名称();"这部分的话,那就是只是在堆中开辟了一个空间来保存对象信息,没有栈去指向它。也就是这个空间是没有名字的。

所以,没有栈指向的对象就叫做匿名对象。

匿名对象的使用:

new Student(123456,"Sakura",20).getName();

由此就创建了一个匿名对象,可以向操作有名对象一样操作它。

由于没有引用变量指向匿名对象,所以只能使用一次,然后就会成为垃圾对象等待被GC回收,

小结

本篇博文主要总结了Java中构造方法的定义和作用(为了在类对象实例化时设置属性初始化)由此涉及到到类访问权限,然后对类访问权限做了一个小结,以及Java程序初始化的顺序。最后介绍了匿名对象,即没有栈指向的对象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,572评论 18 399
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,417评论 1 24
  • 1. 小家伙今天又去上学了!竟然没有哭,表现得灰常好!看来是我们思想工作做的不错,他知道放假结束了,要上学了!哈哈...
    郭琳静Grace阅读 241评论 2 1
  • 2005年考上大学的那个夏天,我开始进入普通话模式。 接下来的这些年,我就在两种语言模式中转换:普通话和鲁山话。 ...
    王小常阅读 336评论 0 1
  • 嗯8拖阅读 130评论 0 0