Java——构造器

Java 构造器的由来:构造器是一个创建对象时被自动调用的特殊方法,为的是初始化。

当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null。构造器可以改变这种默认的初始化。构造器不是函数。

要求:构造器的名称应与类的名称一致。调用构造器是编译器的责任,所以必须让编译器知道调用的是哪一个方法。所以Java采取了与类同名的方法命名构造器。

public class Person {
    public String name;
    public int age;
    //系统会自动分配
    public void Person(){}// 自定义构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 public static void main(String[] args) {
        // 使用自定义的构造器创建对象(构造器是创建对象的重要途径)
        Person p = new Person("小明", 12);
        System.out.println(p.age);
        System.out.println(p.name);
    }
}
 
package collection;
//插入一段this的用法
public class Leaf{
        private int i=0;
        Leaf (int i){this.i=i;}
        Leaf increment(){
        i++;
        return this;
  }

        void print(){
        System.out.println("i="+i);
  }
        public static void main (String [] args)
        {
        Leaf x =new Leaf(100);//这条语句过后i=100.
        x.increment().increment(). increment().print();//结果是103
  }
}

无参构造器:

1.0:如果在类中你提供了其他有参的构造器,则编译器不会提供默认的无参构造器。

    class Animal {
        Animal(String name) { }
        public static void main(String[] args){
            Animal a = new Animal();
        }
    }  

此段代码不能被编译通过

2.0:如果在类中你没有提供任何构造器,则编译器会提供一个默认的无参构造器。

    class Animal {
        public static void main(String[] args){
            Animal a = new Animal();
        }
    }  

此段代码可以通过

3.0:如果你提供了一个构造器,你无须手动添加super()到你的构造器,编译器会默认添加。

    class Animal {
        Animal (){
            System.out.println("----Animal无参构造器-----");
        }
    }
    class Horse extends Animal {
        Horse() {
    //      super(); //此行代码有与没有都是一样的
            System.out.println("----Horse无参构造器-----");
        }
        Horse(int a) {
    //      super(); //此行代码有与没有都是一样的
            System.out.println("----Horse有参构造器-----");
        }
        public static void main(String[] args){
            Horse a = new Horse();
            Horse b = new Horse(3);
        }
    }  结果:
  1. ----Animal无参构造器-----
  2. ----Horse无参构造器-----
  3. ----Animal无参构造器-----
  4. ----Horse有参构造器-----

4.0:如果父类未提供无参构造器,子类会报错:

class Animal {
    Animal (int a){
        System.out.println("----Animal有参构造器-----");
    }
}
class Horse extends Animal {
    Horse() {
        System.out.println("----Horse无参构造器-----");
    }
    public static void main(String[] args){
        Horse a = new Horse();
    }
} 此段代码不能通过

5. 如果构造器中添加了this引用该类的其他构造器,或者添加了super()调用父类构造器,this和super必须在构造器第一行,this引用其他构造器和super()语句不会同时出现

    class Animal {
        Animal (){
            System.out.println("----Animal无参构造器-----");
        }
    }
    class Horse extends Animal {
        String name;
        Horse() {
            System.out.println("----Horse无参构造器-----");
            this("马");  //提示错误,
        }
        Horse(String name){
            this.name = name;
        }
    }  

6. 如果构造器中添加了this引用该类的其他构造器,或者添加了super()调用父类构造器,如果this和super中有参数,则只能是静态的方法和静态变量或常量

    class Animal {
        Animal (){
            System.out.println("----Animal无参构造器-----");
        }
    }
    class Horse extends Animal {
        String name;
        Horse() {
            this(getRondomName());<span style="font-family:Arial, Helvetica, sans-serif;"> //代码段A</span>
            System.out.println("----Horse无参构造器-----");
        }
        Horse(String name){
            System.out.println("----Horse有参构造器-----"); //代码段B
            this.name = name;
        }
        static String getRondomName(){
            int x = (int) (Math.random() * 5);
            String name = new String[] {"马", "猪", "牛", "羊","猫"}[x];
            return name;
        }
        public static void main(String[] args){
            Horse a = new Horse();
        }
    } 

结果:
  1. ----Animal无参构造器-----
  2. ----Horse有参构造器-----
  3. ----Horse无参构造器-----

引用参考:http://www.jb51.net/article/75880.htm

引用参考:http://blog.csdn.net/yoamy/article/details/51250218

时间: 2024-12-21 12:47:11

Java——构造器的相关文章

Java构造器内部的多态方法

本文主要详解java构造器内部的多态方法,更多Java技术知识,请登陆疯狂软件教育官网. 我们知道,动态绑定的调用是在运行时才决定的,对象无法知道到底调用的是哪个类的方法. 当我们在构造器中调用动态绑定的方法,就会用到该方法被覆盖之后的定义.但是这种调用的效果难以预计,因为被覆盖的方法在对象被完全构造之前就会被调用.我们先来看看下面这段代码: Java代码 class Base{ private String name = "base"; Base(){ tellName(); pri

Java学习之道:Java构造器和方法的区别

摘要 要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别. 原作者:Robert Nielsen 原站:www.javaworld.com 我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物.(按:老外喜欢打比喻,我也就照着翻译).要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别.同样地,要理解构造器,那么就要了解构造器和方法的区别.所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的.下

Java构造器内部的多态方法的行为

Java构造器调用的层次结构带来了一个有趣的两难问题.如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,那会发生什么情况? class Glyph{ void draw(){System.out.println("Glyph.draw()");} Glyph() { System.out.print("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()

JAVA构造器,重载与重写

1. java构造器 构造器也叫构造方法(constructor), 用于对象初始化. 构造器是一个创建对象时被自动创建的特殊方法,目的是对象的初始化. 构造器 的名称与类的名称一致. JAVA通过new关键子来调用构造器,从而返回该类的实例,是一种特殊的方法. 备注要点: a. 通过new关键字来调用 b. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型是本类), 不能在构造器使用return返回某个值. c. 如果没有我们定义构造器,则编译器会自动定义一个无参构造器. 如果已定义构

Java构造器的理解

构造器的引入 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器.从而保证了初始化的进行. 构造器的命名 所取得任何名字可能与类得某个成员名称相冲突 调用构造器是编译器得责任,所以必须让编译器知道应该调用哪个方法 Java构造器采用与类相同的名称 class Example{ public String var1; public String var2; // 默认构造器(无参构造器) p

java 构造器 (构造方法)

构造器 (constructor,构造方法) 3W what ? why? how? 是什么 , 为什么, 怎么用? 注意事项? What ? 是什么: 构造器(又叫构造方法)本身是一种特殊的方法,(但是和方法又没有什么大的关系,习惯上叫构造器,以免和方法混淆,)它只在新对象实例化的时候调用.Why ? 为什么用它: 为什么要用构造器 ,如果要实例化新的对象,需要使用关键字new 来完成,但是除了new这个关键字以外,还有可能在对象实例化时为其进行一些初始化的操作准备,这个时候需要构造方法的支持

java构造器内部多态方法

/** * Created by Administrator on 2017/3/7. */ /** * @author zhenghong * @date 2017-03-07-21:21 **/public class TestC { public static void main(String []args) { new Graph(5); }}class Grp{ void draw() { System.out.println("draw...."); } Grp() { d

JAVA构造器、this、super

构造器是为了创建一个类的实例.这个过程也可以在创建一个对象的时候用到: Platypus p1 = new Platypus(); 相反,方法的作用是为了执行java代码. 修饰符,返回值和命名的不同 构造器和方法在下面三个方便的区别:修饰符,返回值,命名.和方法一样, 构造器可以有任何访问的修饰: public, protected, private 或者没有修饰(通常被package 和friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, fina

有关java构造器的笔记

1. 不涉及继承和多态的构造器初始化过程 当程序中出现new A a() , 或者使用了A类的静态方法等代码时(声明一个A类对象不算) java虚拟机会首先加载A类, 然后执行A的静态初始化, 静态初始化会先将所有的静态成员变量进行默认初始化, 也就是基本数据类型初始化为0, 引用数据类型初始化为null. 然后按照静态变量和静态区的初始化顺序和声明顺序一致这一准则进行初始化. 此时执行的静态初始化只执行这一次, 执行之后就再也不执行了. 然后如果出现new A a() , 就会为对象分配存储空