zoukankan      html  css  js  c++  java
  • Java面向对象编程 -2.2

    构造方法与匿名对象

    现在的程序在使用类的时候一般都按照了如下的步骤进行:

    • 声明并实例化对象,这个时候实例化对象中的属性并没有任何的数据存在,都是其对于数据类型的默认值
    • 需要通过一系列的setter方法为类中的属性设置内容。
      等于说现在要想真正获取一个可以正常使用的实例化对象,必须经过两个步骤才可以完成

    但是如果按照这样的方式来进行思考的话 就会发现一个问题:假设说现在类中的属性很多个(8个),这样一来按照我们之前的做法,此时我们需要调用多次(8次)的setter方法进行内容设置
    这样的调用实在是太罗嗦了,所以在java里面为了考虑到对象初始化的问题,专门提供有构造方法。

    即:可以通过构造方法实现实例化对象的属性初始化处理。只有在关键字new的时候使用构造方法。

    在Java程序里面构造方法的定义要求如下:

    • 构造方法名称必须与类名称保持一致
    • 构造方法不允许设置任何的返回值类型,即没有返回值定义
    • 构造方法是在使用关键字new实例化对象的时候自动调用的
    class Person{
    	private int age;
    	private String name;
    	
    	public void setAge(int a) {
    		age = a;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setName(String n) {
    		name = n;
    	}
    	public String getName() {
    		return name;
    	}
    	
    	public  void intorduce() {
    		System.out.println("age= "+age+" name= "+name);
    	}
    	public Person(int a ,String n) {//有参构造
    		age = a;
    		name = n;
    	}
    }
    public class xxx {
    	public static void main(String[] args) {
    		Person per1 = new Person(18,"sakura");
    		per1.intorduce();
    	}
    
    }
    
    >>>age= 18 name= sakura
    

    在Java程序里面考虑到程序结构的完整性,所以所有的类中都会提供有 构造方法,如果现在你的类中没有定义任何的构造方法,那么一定会默认提供一个无参的,什么都不做的构造方法。
    这个构造方法是在程序编译的时候自动创建的。如果你已经在类中明确地定义有一个构造方法的时候,那么这个默认的构造方法将不会被自动创建。
    结论:一个类至少存在有一个构造方法

    疑问:为什么构造方法不允许设置返回值类型?
    既然构造方法也是一个方法,那么为什么不让它定义返回值类型呢?
    既然构造方法不会返回数据,为什么不使用void定义呢?
    分析:程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来进行处理的。
    如果在构造方法上使用了void,那么此结构就与普通方法的结构完全相同了,这样编译器会认为此方法是一个普通方法。
    普通方法和构造方法最大的区别:构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。

    既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数即可。

    class Person{
    	private int age;
    	private String name;
    	
    	public void setAge(int a) {
    		age = a;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setName(String n) {
    		name = n;
    	}
    	public String getName() {
    		return name;
    	}
    	
    	public  void intorduce() {
    		System.out.println("age= "+age+" name= "+name);
    	}
    	public Person(int a ,String n) {//有参构造
    		age = a;
    		name = n;
    	}
    	public Person() {//无参构造
    		age =12;
    		name = "sax";
    	}
    }
    public class xxx {
    	public static void main(String[] args) {
    		Person per1 = new Person();
    		per1.intorduce();
    	}
    
    }
    
    >>>age= 12 name= sax
    

    在进行多个构造方法定义的时候强烈建议大家有一些定义的顺序,例如:可以按照参数的个数降序或者升序排列

    经过了分析之后可以发现,利用构造方法可以传递属性数据,于是现在进一步分析对象的产生格式:

    • 定义对象的名称:类名称 对象名称 = null
    • 实例化对象:对象名称 = new 类名称()。
      如果这时候只是通过实例化对象来进行类的操作也是可以的,而这种形式的对象由于没有名字就称为匿名对象
    public class xxx {
    	public static void main(String[] args) {
    		 new Person().intorduce();
    	}
    >>>age= 12 name= sax
    

    此时依然通过了对象进行了类中introduce方法的调用,但是由于此对象没有任何的引用名称,所以该对象使用了一次之后就将成为垃圾,
    而所有的垃圾将被GC进行回收和释放。

  • 相关阅读:
    strcpy的实现
    使用Highcharts生成柱状图
    使用Highcharts结合PHP与Mysql生成饼状图
    shopnc 学习笔记
    php中关于mysqli和mysql区别的一些知识点分析
    jquery捕获enter键 按enter键执行提交
    php在IE浏览器中保存SESSION
    ShopNC 商城系统开发经验分享第五篇: 缓存设计
    ShopNC 商城系统开发经验分享第二篇:ShopNC商城系统初步分析
    SHOPEX于SHOP++比较哪款更适合做二次开发,为什么?
  • 原文地址:https://www.cnblogs.com/sakura579/p/12322330.html
Copyright © 2011-2022 走看看