什么是构造方法

类体中有两大形式的成员,其中一个是成员方法(另一个就是成员变量啦~)。成员方法又分两种,一种是普通成员方法,另一种是构造方法(有的资料中也称之为构造函数)。

所谓构造方法,就是这个类在被实例化时(创建对象时)就要执行的方法。前面学习类的声明和实例化课时里,大家已经掌握实例化对象的方法:

实例化一个Football类的对象

new关键字的作用就是实例化对象,new后面的部分即构造函数,表示new一个对象时要调用的构造方法。注意,new关键字后紧跟的只能是构造方法,不能是普通成员方法。那么如何区分构造方法和普通成员方法呢?请继续往下看。

构造方法的作用:主要完成对象的初始化工作(见代码1)。

构造方法的形式

构造方法很好识别,构造函数有如下特点:

1)  方法的名字即为类的名字

代码1:

public class Football{
int size;
String color; /*
* 声明构造方法,该方法没有带任何参数;
* 构造方法名称和类名称都是Football;
* 方法体内给类的成员变量设置了初始值;
* 实例化任何对象的时候,创建出来的对象size均为10,color均为white;
* 对象被实例化后,可以修改对象的成员size和color的值;
*/
public Football(){
size = 10;
color = "white";
} public void bounce(){
System.out.println("bang bang bang...");
}
}

2)构造方法没有返回值类型。

这句话包含两个意思:一、声明构造方法时,不能给方法添加类型。二、方法体内不能有类似return ...;这样的语句。下面构造方法的声明是错误的,见代码2:

代码2:

public class Football{
int size;
String color; /*
* 错误:不能在方法前添加方法类型int,不能有返回值
* 但是编译能通过,因为编译器将此方法作为普通方法的声明,而非构造方法。
*/
public int Football(){
size = 10;
color = "white";
return 0;//错误,构造方法不能返回数据
} public void bounce(){
System.out.println("bang bang bang...");
}
}

从上面类字可以看出,如果给构造方法添加返回值类型,添加return语句后,构造方法就退化成普通成员方法了,编译器不再把它当作构造方法。

构造方法的用法要点

1)构造方法一般都应用 public 类型来说明,这样才能在程序任意的位置创建类的实例。

2)构造方法只能在实例化对象时才能被调用,不能像普通方法那样通过对象来调用构造方法。

代码3:

public class AppMain{
public static void main(String[] args){
Football football1 = new Football();//正确
football1.bounce();//正确
football.Football();//错误,不能调用构造方法
}
}
class Football{
int size;
String color; /*
* 错误:不能在方法前添加方法类型int,不能有返回值
* 但是编译能通过,因为编译器将此方法作为普通方法的声明,而非构造方法。
*/
public int Football(){
size = 10;
color = "white";
return 0;//错误,构造方法不能返回数据
} public void bounce(){
System.out.println("bang bang bang...");
} }

3)每个类至少有一个构造方法。如果代码中一个构造方法都没写,java系统会默认添加一个不带任何参数的构造方法,方法体中没有任何代码。例如:

代码4:

public class Football {
int size;
String color; public void bounce() {
System.out.println("我能跳起来哦:bang bang bang...");
}
}

以上代码等价于:

public class Football {
int size;
String color; // 构造方法,无参数,无方法体
public Football(){ } public void bounce() {
System.out.println("我能跳起来哦:bang bang bang...");
}
}

4)构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。

/*
* 错误,stitac属于非访问性质的修饰符修饰
*/
public static class Football {
int size;
String color; // 构造方法,无参数,无方法体
public Football(){ } public void bounce() {
System.out.println("我能跳起来哦:bang bang bang...");
}
}

5)构造方法可以重载。

重载(overloading) 是指:在一个类里面,方法名字相同,而参数不同。注意:参数的个数不同或者参数的数据类型不同,都算做参数不同。其它一切情况,参数都是相同的,都不能叫做重载。

/*
* 文件:Football.java
* 功能:演示构造方法的重载
*/
public class Football {
int size;
String color; // 在执行实例化操作构造一个对象时,将传入的大小、颜色参数设置给成员变量
public Football(int sz,String clr){
size = sz;
color = clr;
} /* 构造方法重载
* 在执行实例化操作构造一个对象时,
* 只传入颜色参数,大小为默认值10.
* 因此,所有构造出的对象,大小全部为10.
*/
public Football(String clr){
size = 10;
color = clr;
} public void bounce() {
System.out.println("大小:" + size + "。颜色:"
+ color + "。我能跳起来哦:bang bang bang...");
}
}
 /*
* 文件:AppMain.java
* 功能:测试FootBall类,演示构造方法重载
*/
public class AppMain { public static void main(String[] args) {
// TODO Auto-generated method stub /*
* 下面第15行被注释掉的语句是错误,
* 因为Football类中声明了两个构造方法,
* 所以java系统不会再自动增加一个不带任何参数的构造方法
*/
//Football football1 = new Football(); Football football1 = new Football(18,"黑色");
Football football2 = new Football(12,"白色"); football1.bounce();
football2.bounce();
} }

学习测试:

1. 请问下面Sample类中,哪个不是构造方法,哪个是带参数的构造方法,哪个是不带参数的构造方法:

public class Sample {  

    private int x;  

    public Sample() {
this(1);
} public Sample(int x) {
this.x=x;
} public int Sample(int x) {
return x++;
} }

2. 请问下面代码输出结果是什么

public class Mystery {
private String s; public void Mystery() {
s = "constructor";
} void go() {
System.out.println(s);
} public static void main(String[] args) {
Mystery m = new Mystery();
m.go();
}
}

3.请问下面代码输出结果是什么:

A.java:

public class A{
public A(){
System.out.println("调用了无参的构造函数");
}
public A(String mess){
System.out.println("调用了有参的构造函数\n"+
"参数内容为:"+mess);
}
}

Test.java:

public class Test{
public static void main(String [] args){
A a_1=new A();//调用无参的构造函数
A a_2=new A("Hello");//调用有参的构造函数
}
}

声明:”Java入门“系列为作者原创,未经允许,请勿作任何商业用途。如转载请注名出处。

Java入门:构造方法的更多相关文章

  1. Java入门姿势【面向对象3】构造方法及其重载_方法的调用

    上次我为大家写出啦"定义类与创建对象_了解局部变量",上篇文章代码可能较多,如没有了解透彻的话请打开下方文章在进行观看一下哦!! [Java入门姿势[面向对象2]定义类与创建对象_ ...

  2. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  3. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  4. JAVA入门 面向对象

    主要内容 1.类和对象的概念 2.什么是面向对象 3.什么对象的属性方法 4.何谓对象引用 5.实例化 类和对象的概念 万物皆对象,客观存在的事物皆为对象.我们大到名胜古迹,小道生活中的一件物品,例如 ...

  5. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  6. Java入门知识点

    Java入门知识点   Java源代码的流程 Java程序由.java文件生成,通过JVM进行编译得到字节文件.class class HelloWorld { public static void ...

  7. Java入门:注册模块的实现

    1.主活动图 用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册.具体的活动图如下: 以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实 ...

  8. java入门概念梳理总结

    Java入门学习 简介 public class HelloWorld { public static void main(String []args) { System.out.println(&q ...

  9. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

随机推荐

  1. yarn资源memory与core计算配置

    yarn调度分配主要是针对Memory与CPU进行管理分配,并将其组合抽象成container来管理计算使用 memory配置 计算每台机子最多可以拥有多少个container:  container ...

  2. 前端_JQuery

    使用参考:http://jquery.cuishifeng.cn/ 目录 jQuery是什么 jQuery对象 寻找元素(选择器和筛选器) 选择器 表单属性选择器 筛选器 操作元素(属性.css.文档 ...

  3. 论如何制做一个工程APP的测试内容

    测试一般在软件开发过程中就已经开始进行了,测试越早.发现问题解决他的方案成本就越小.测试按照类型来区分可以划分为:单元测试,集成测试,系统测试.而OCUNIT是XCODE自带的单元测试工具.需要建立新 ...

  4. 《[C#] int与System.Int32有什么区别》

    最近园里的TeamOne写了一篇<[C#] int与System.Int32有什么区别>,发现里面有不少精彩的评论,所以忍不住想这篇文章总结一下:> 本文的主要参考资料: 1.< ...

  5. 第二次作业<2>

    自学计划 应为对网络的教程并不了解,所以-- 我扒了一遍同学的博客,找到了两个课程. 慕课网 和 这个. 选择这两个教程主要是深入浅出,比较合理. 开始先两个课程相互应证,多了解以后可能会选择一个.虽 ...

  6. IT小小鸟读书笔记(3.9)

    对于IT小小鸟呢,我也不知道怎么说,或许一开始我就没想到这是一本集合了众多从事IT工作人员的学习,求职经历.读完这本书,说没什么感触,或许连我自己也不太相信. 在书的一开始邹欣就有说到:兴趣是第一原则 ...

  7. sql中exists和not exists的用法

    该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...

  8. 利用ceye中的dns来获取数据

    安恒杯的一道命令执行题目 查看,存在robots.txt文件 查看index.txt文件,存在where_is_flag.php文件 使用cat没有任何回显 可以使用ceye平台利用dns记录内容,网 ...

  9. 视频剪辑软件-PR (Adobe Premiere)

    1.PR 是什么? Adobe Premiere 是一款常用的视频编辑软件,由Adobe公司推出.PR是一款编辑画面质量较好的软件,有较好的兼容性,且可以与Adobe公司推出的其他软件相互协作.目前这 ...

  10. Boa服务器移植

    Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右.作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求.但Boa支持CGI,能够为C ...