Java-面向对象(基础篇)--构造方法与匿名对象

原创 2016年08月30日 20:32:39

一.构造方法
在实例化一个对象后,如果要为这个对象中的属性赋值,则必须用setter方法为属性分别赋值才可以,这显然不够方便。这时可以通过构造方法来完成这样的操作。在面向对象中构造方法的主要作用是为类中的属性初始化。
构造方法可以看成为一种特殊的方法:
【构造方法的定义格式】

class 类名称{
    访问权限 类名称(类型1 参数1,类型2 参数2,…….){
        …….//构造方法没有返回值
    }
}

在构造方法时要注意:
*构造方法的名称必须与类名称一致;
构造方法的声明处不能有任何返回值类型的声明;
不能在构造方法中使用return返回一个值;*

声明一个构造方法:

class Person{
    public Person(){        // 声明构造方法
        System.out.println("一个新的Person对象产生。") ;
    }
};
public class ConsDemo01{
    public static void main(String args[]){
        System.out.println("声明对象:Person per = null ;") ;
        Person per = null ; // 声明对象时并不去调用构造方法
        System.out.println("实例化对象:per = new Person() ;") ;
        per = new Person() ;//实例化对象
    }
};

运行结果:

声明对象:Person per = null ;
实例化对象:per = new Person() ;
一个新的Person对象产生。

程序实例化对象的过程与之前一样的,在类中定义一个person类的构造方法,但是从程序的运行结果来看,当调用关键字new实例化对象时才会调用构造方法。
在上例中,类中并没有构造方法,但是也可以调用,只是为什么?首先要说明的是,只要是类就必定存在构造方法,在Java中如果一个类中没有明确的声明一个构造方法时,则在编译时会直接生成一个无参数、什么都不做的构造方法,也就是说,如果以上的Person类中没有声明构造方法,实际上编译时会在动加上以下的构造方法:

class Person{
    public Person(){}
}

下面用构造方法进行复制

class Person{
    private String name ;
    private int age ;
    public Person(String n,int a){      // 声明构造方法,为类中的属性初始化
        this.setName(n) ;
        this.setAge(a) ;
    }
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        if(a>0&&a<150){
            age = a ;
        }
    }
    public String getName(){
        return name ;
    }
    public int getAge(){
        return age ;
    }
    public void tell(){
        System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
    }
};
public class ConsDemo02{
    public static void main(String args[]){
        System.out.println("声明对象:Person per = null ;") ;
        Person per = null ; // 声明对象时并不去调用构造方法
        System.out.println("实例化对象:per = new Person() ;") ;
        per = new Person("张三",30) ;//实例化对象
        per.tell() ;
    }
};

运行结果为:

声明对象:Person per = null ;
实例化对象:per = new Person() ;
姓名:张三;年龄:30

通过对比可以看出,通过构造方法进行赋值比通过setter方法更加方便。
与普通方法一样,构造方法也是可以重载的,只要每个构造方法的参数类型或参数个数不同,即可实现重载
【构造方法的重载】

class Person{
    private String name ;
    private int age ;
    public Person(){}                   // 声明一个无参的构造方法
    public Person(String n){            // 声明有一个参数的构造方法
        this.setName(n) ;
    }
    public Person(String n,int a){      // 声明构造方法,为类中的属性初始化
        this.setName(n) ;
        this.setAge(a) ;
    }
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        if(a>0&&a<150){
            age = a ;
        }
    }
    public String getName(){
        return name ;
    }
    public int getAge(){
        return age ;
    }
    public void tell(){
        System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
    }
};
public class ConsDemo03{
    public static void main(String args[]){
        System.out.println("声明对象:Person per = null ;") ;
        Person per = null ; // 声明对象时并不去调用构造方法
        System.out.println("实例化对象:per = new Person() ;") ;
        per = new Person("张三",30) ;//实例化对象
        per.tell() ;
    }
};

运行结果为:

声明对象:Person per = null ;
实例化对象:per = new Person() ;
姓名:张三;年龄:30

以上方法被重载了三次,在主方法调用的是只有一个参数的构造方法。
二.匿名对象
匿名对象就是没有明确的给出名称的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
【匿名对象的使用】

class Person{
    private String name ;
    private int age ;
    public Person(String n,int a){      // 声明构造方法,为类中的属性初始化
        this.setName(n) ;
        this.setAge(a) ;
    }
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        if(a>0&&a<150){
            age = a ;
        }
    }
    public String getName(){
        return name ;
    }
    public int getAge(){
        return age ;
    }
    public void tell(){
        System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
    }
};
public class NonameDemo01{
    public static void main(String args[]){
        new Person("张三",30).tell() ;
    }
};

运行结果:

姓名:张三;年龄:30

在上面程序中,直接使用了“new Person(“张三”,30)”语句,这实际上就是一个匿名对象,与之前声明的对象不同,此处没有任何栈内存引用它,所以此对象使用一次之后接等待被垃圾收集机制回收。

版权声明:本文为博主原创文章,未经博主允许不得转载。

匿名对象和内部类

匿名对象: 匿名对象是对象的简化形式; 匿名对象的使用情况: 1)当对对象方法仅进行一次调用的时候使用;如果需要调用多次,还需要创建对象。如果对一个对象进行多个成员的调用,就必须给这个对象起个名...
  • chenrushui
  • chenrushui
  • 2016年07月15日 11:21
  • 1032

匿名对象与非匿名对象的区别

类封装完以后就可以通过使用new关键字和类的构造方法来创建对象,这种对象分为两种:匿名对象与非匿名对象。何为匿名对象,何为非匿名对象呢?举个例子:假如有如下类:     package com.hei...
  • wangshuxuncom
  • wangshuxuncom
  • 2013年11月06日 07:42
  • 7183

C++中的匿名对象

C++中的匿名对象是pure RValue, 因而不能作为引用传进去。 匿名对象只存在于构造该对象的那行代码,离开构造匿名对象的哪行代码后立即调用析构函数。 class Some { int ...
  • u010936800
  • u010936800
  • 2016年06月07日 16:22
  • 3108

C++匿名对象解析

我们知道在C++的创建对象是一个费时,费空间的一个操作。有些固然是必不可少,但还有一些对象却在我们不知道的情况下被创建了。通常以下三种情况会产生临时对象:   1,以值的方式给函数传参;   2,...
  • u011391093
  • u011391093
  • 2015年03月28日 00:44
  • 1479

浅析C++中临时匿名对象

首先先看代码: #include using namespace std; /* 类名:A */ class A { int num; public: A( int num ); ~A(...
  • cyousui
  • cyousui
  • 2013年12月03日 18:22
  • 3764

Java 匿名对象的详解

一.匿名对象:没有名字的实体,也就是该实体没有对应的变量名引用。 二.匿名对象的用途 1,当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。    为什么只对方法,而不调用属性...
  • qq_33642117
  • qq_33642117
  • 2016年07月14日 09:14
  • 1163

Java语言程序设计(基础篇)原书第十版 课后习题 第五章

import java.util.Scanner; public class Code_Practice_5 { public static void main(String[] args) {...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月21日 20:27
  • 9944

Java语言程序设计(基础篇)原书第十版 课后习题 第三章

// 3.11 Scanner input = new Scanner(System.in); System.out.print("Enter a month and a year:");...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月06日 21:58
  • 7485

Java-面向对象(基础篇)--面向对象基础

面向对象(基础篇) 一. 面向对象的基本概念 面向对象是针对用户的要求进行分析,将分析的结果设计成图纸,然后将一切的准备工作全部处理完之后再分块制作,最后将各个部分组装在一起。 对于面向对象的...
  • aotumemedazhao1996
  • aotumemedazhao1996
  • 2016年08月27日 20:06
  • 482

Java-面向对象(基础篇)--代码块

代码块 代码块本身并不是很难理解的概念,实际上之前也一直在使用。所谓的代码块就是指使用“{}”括起来的一段代码,根据位置及声明关键字的不同,代码块可以分为普通代码块、静态代码块、构造快、同步代码块四...
  • aotumemedazhao1996
  • aotumemedazhao1996
  • 2016年09月13日 13:04
  • 181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java-面向对象(基础篇)--构造方法与匿名对象
举报原因:
原因补充:

(最多只允许输入30个字)