前言

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

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

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

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

构造方法的定义语法:

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

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

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

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

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

第①种方式,构造方法采用了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)
*/

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

  • 在任何其他事情发生之前,会将分配给对象的存储空间初始化成二进制零。
  • 调用基类的构造函数。
  • 按照声明顺序调用属性的初始化方法。在Person中先将pid赋值为1234556789然后在返回到构造函数中将123456赋值给pid。
  • 调用导出类的构造函数。若是Student中属性有给定初始值,那么依旧如第三步后再进入构造函数进行其他初始化操作。

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

什么是匿名对象?

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

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

①:规定了对象的类型

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

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

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

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

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

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

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

匿名对象的使用:

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

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

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

小结


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

Java——构造方法和匿名对象的更多相关文章

  1. 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象

    1.点    构造方法的作用以及定义要求    匿名对象的使用    构造方法:        只要出现()的都表示方法        构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...

  2. Java学习(匿名对象、内部类、包、import、代码块)

    一.匿名对象 概念:匿名对象是指在创建对象时,只有创建的语句,却没有把对象地址值赋给某个变量. 特点: (1)匿名对象直接使用,没有变量名.当做形参使用. new Person().name=&quo ...

  3. Java中的匿名对象

    匿名对象就是没有明确给出名字的对象.一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用. 一个普通的常量字符串就可以表示一个匿名String对象. 比如可以 int len ...

  4. Java中的匿名对象代码实例

    /* 匿名对象:就是没有名字的对象. 匿名对象的应用场景: A:调用场景,仅仅只调用一次的时候. 注意:调用多次的时候,不合适. 那么,这种匿名调用有什么好处吗? 有,匿名对象调用完毕就是垃圾.可以被 ...

  5. Java常用API(Scanner,Random)匿名对象

    API:即Application programming Interface,应用编程接口. Java中封装了许许多多的API供用户使用,Scanner与Random便是其中之一,API实际就是类,已 ...

  6. Java深入分析类与对象

    深入分析类与对象 1,成员属性封装 在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装 ...

  7. JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

    JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买 ...

  8. JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象

    public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...

  9. Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static

    package com.swift; //使用无参构造方法自动生成对象,序号不断自增 public class Person { private static int count; //如果在定义类时 ...

随机推荐

  1. Codeforces Round #536 (Div. 2) F 矩阵快速幂 + bsgs(新坑) + exgcd(新坑) + 欧拉降幂

    https://codeforces.com/contest/1106/problem/F 题意 数列公式为\(f_i=(f^{b_1}_{i-1}*f^{b_2}_{i-2}*...*f^{b_k} ...

  2. vue-element 动态单选多选全选

    实现效果如图 数据格式如下: pps: [{"code":"6","createTime":"2018-09-07 00:00:0 ...

  3. cp/tar/用c语言编写程序 实现cp命令的效果

    1.cp (拷贝) 已存在文件路径  要拷贝的文件路径 实现cp命令的代码如下: #include <stdio.h> //因为要在命令中得到两个路径,所以要用到main函数的两个参数 i ...

  4. 排序算法(sorting algorithm)之 插入排序(insertion sort)

    https://en.wikipedia.org/wiki/Insertion_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 loop2: 4,6,1,3,7 -> ...

  5. BAT:文件中替换字符(保留空格和换行)

    @echo off rem CMD:"color --help" :: setting color:back white,content blue color f9 ::old s ...

  6. form编码方式application/x-www-form-urlencoded和multipart/form-data的区别

    form元素有个enctype属性,可以指定数据编码方式,有如下三种: 1. application/x-www-form-urlencoded: 表单数据编码为键值对,&分隔 2. mult ...

  7. macOS终端开启TAB键自动补全功能(不区分大小写)

    1.在当前用户根目录(~)下,修改~/.inputrc这个文件(如果文件不存在,则新建该文件),文件内容如下: set show-all-if-ambiguous on set completion- ...

  8. JAVA程序CPU 100%问题排查

    做JAVA开发的同学一定遇到过的爆表问题,看这里解决  https://www.cnblogs.com/qcloud1001/p/9773947.html   本文由净地发表于云+社区专栏 记一次Ja ...

  9. html5之上的图片处理

    在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 像我这么为用户着想的程序员,绝对不会让这种事情发生的, ...

  10. CSS常见布局问题整理

    实现div的水平居中和垂直居中 多元素水平居中 实现栅格化布局 1. 实现div的水平居中和垂直居中 实现效果: 这大概是最经典的一个题目了,所以放在第一个. 方法有好多, 一一列来 主要思路其实就是 ...