下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

你该掌握的Java构造方法与匿名对象

作者:课课家教育     来源: http://www.kokojia.com点击数:1084发布时间: 2018-11-22 10:05:43

标签: Java构造方法Java匿名对象Java基础知识

大神带你学编程,欢迎选课

    课课家:本篇文章主要为大家介绍Java的构造方法和匿名对象,希望对你有所帮助!  java——构造方法和匿名对象 

  在编写程序时不安全的初始化会导致程序发生发生重大错误。为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。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)

  */

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

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

  调用基类的构造函数。

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

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

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

  什么是匿名对象?

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

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

  ①:规定了对象的类型

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

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

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

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

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

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

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

  匿名对象的使用:

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

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

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

  提示:想学习更多相关内容,请点击课课家提供的相关链接!

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程