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

前言编程

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

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

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

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

构造方法的定义语法:this

构造方法是在建立对象时被编译器自动调用,因此编译器应该知道构造方法的名字而后去调用它,为构造方法任意取名均可能会与类的某个成员冲突。因而Java采用了同C++中同样的方法: 构造方法采用与类相同的名称 。代码规范

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

构造方法通常定义为以下三种方式:对象

class Student{
  public Student(){     //①
    ...
  }
  ...
}
class Student{
  Student(){      //②
    ...
  }
  ...
}
class Student{
  private Student(){    //③
    ...
  }
  ...
}

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

第①种方式,构造方法采用了public修饰表示该类的对象是能够被不一样包的其余类建立。

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

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

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

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

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

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

范围 private default(什么都不写) protected public
同一个类 O O O O
同一个包中的子类 X O O O
同一个包中的其余类 X O X O
不一样包中的子类 X X O O
不一样包中的非子类 X X X O

构造方法的调用时机:

前面一直在说构造方法的调用是在类建立时,与普通方法不一样,构造方法在实例化新对象(使用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程序初始化的顺序。最后介绍了匿名对象,即没有栈指向的对象。

相关文章
相关标签/搜索