构造方法的定义:

构造方法也叫构造器或者构造函数

构造方法与类名相同,没有返回值,连void都不能写

构造方法可以重载(重载:方法名称相同,参数列表不同)

如果一个类中没有构造方法,那么编译器会为类加上一个默认的构造方法。

默认构造方法格式如下:

public 类名() {

}

如果手动添加了构造器,那么默认构造器就会消失。

建议代码中将无参构造器写出来。

public class Student {public String name;public int age;public void eat() {System.out.println("eat....");}//构造器/*** 名称与类名相同,没有返回值,不能写void* 构造器可以重载* 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器* 如果手动添加了构造器(无论什么形式),默认构造器就会消失*/public Student() {System.out.println("无参构造器");}public Student(int a) {System.out.println("一个参数的构造器");age = 15;}public Student(int a, String s) {System.out.println("两个参数的构造器");age = a;name = s;}
}

构造方法的作用:

构造方法在创建对象时调用,具体调用哪一个由参数决定。

构造方法的作用是为正在创建的对象的成员变量赋初值。

public class Test {public static void main(String[] args) {//调用无参构造器Student s1 = new Student();//调用有参构造器Student s2 = new Student(15);System.out.println(s2.age);Student s3 = new Student(34, "小明");System.out.println(s3.name + ":" + s3.age);}}

构造方法种this的使用:

构造方法种可以使用this,表示刚刚创建的对象

构造方法种this可用于

this访问对象属性

this访问实例方法

this在构造方法中调用重载的其他构造方法(要避免陷入死循环)

只能位于第一行

不会触发新对象的创建

public class Student {public String name;public int age;public void eat() {System.out.println("eat....");}//构造器//使用this()调用重载构造器不能同时相互调用,避免陷入死循环public Student() {//this()必须出现在构造器的第一行,不会创建新的对象this(15);//调用了具有int类型参数的构造器System.out.println("默认构造器");}public Student(int a) {this.eat();eat();//this.可以省略}//this在构造器中表示刚刚创建的对象public Student(int a, String s) {System.out.println("两个参数的构造器");this.age = a;this.name = s;}
}
public class Test {public static void main(String[] args) {Student s1 = new Student(15, "小明");System.out.println(s1.name + ":" + s1.age);Student s2 = new Student(12, "小红");System.out.println(s2.name + ":" + s2.age);Student s3 = new Student();}
}

归纳this在实例方法和构造方法种的作用

this是java多态的体现之一

this只可以在构造方法和实例方法种存在,不能出现在static修饰的方法或代码块中

this在构造方法中表示刚刚创建的对象

this在实例方法种表示调用改方法的对象

this可以在实例方法和构造方法中访问对象属性和实例方法

this有时可以省略

this可以在实例方法中作为返回值

this可以当作实参

this可调用重载的构造方法


一.构造方法的定义声明
构造方法的名字必须和所在类的名字一致,没有返回值,但不能声明void,访问权限可以为任意,但是一般情况下使用public方法权限,构造方法中的参数可以根据需要自行定义,参数的不同的构造方法构成重载;

例:

class Fu{public Fu(){} //无参的公有构造方法public Fu(int i){} //参数类型为int的公有构造方法......}public class Demo extends Fu{public Demo(){} //无参的公有构造方法public Demo(int i){} //参数类型为int的公有构造方法public Demo(int i,double d){} //参数类型为int和double的公有构造方法...}

二.构造方法的使用
java中构造方法的使用有两个地方,一个是跟在关键字new后面,类名加上一个小括号(),小括号内根据实际加上实参,另外一个是跟在关键字super或this后加上一个小括号(),小括号内根据实际添加实参,下面进行举例。

例1:

Demo demo = new Demo(); //这里是调用的是一个无参的构造方法,必须声明在方法中,最好声明在主方法

上面构造方法的参数根据实际添加实参,jvm根据构造方法的参数不同加载不同的构造方法;

例2:

public Demo(){this(2); //这里调用参数为int类型的本类的构造方法}

例3:

 public Demo(){super(1); //调用参数为int类型的父类的构造方法}

注意:例2和例3中this或super调用构造方法只能出现在构造方法中,而且必须出现在第一行,所以一个构造方法中第一行只能为this或super调用构造方法,两者不能同时调用构造方法出现,而且注意this或super调用构造方法时,要留构造方法出口,意思就是最后调用的构造方法中没有再调用别的构造方法!

三.构造方法的作用
1.为了初始化成员属性,而不是初始化对象,初始化对象是通过new关键字实现的

2.通过new调用构造方法初始化对象,编译时根据参数签名来检查构造函数,称为静态联编和编译多态
(参数签名:参数的类型,参数个数和参数顺序)

3.创建子类对象会调用父类构造方法但不会创建父类对象,只是调用父类构造方法初始化父类成员属性;

我总是要把构造器和方法混淆,后来发现,

方法,实际上,是需要用于执行java代码的,而构造器,

构造器,,,是一个类的实例!!

为什么呢?

类的实例,我们需要用类来创建对象,进而访问其属性,因为实例是需要被用来调用的,但是调用的话,我们不得不去考虑一个问题,就是对象,最终是被存储在内存里面的,而存储的时候,我们的内存不得不需要给他再另外开辟新的内存空间,那么,java是如何给这种我们所需要的类来开辟内存空间的呢?这就涉及到了java的内存机制,就是说,我们必须要给这个类制作一个构造器,而且这个构造器的名称必须和这个类的名称是一致的,这样,我们的java编译器才能识别这个类,进而给这个类在内存中开辟内存空间,也就是我们所说的,我们手动,人为的给他进行“初始化”,事例如下:

class Rock {Rock() {System.out.print("Rock");}}

这样,当我们在对Rock类进行调用的时候,我们的java编译器就会事先对他进行“自动”地初始化,开辟内存空间

那么现在问题又来了,举个例子,我们的Rock()方法需要带有一个参数,形参,但是整个代码中,需要不仅仅是带有形参的Rock();还需要不带形参的Rock(),在我们的构造器对类进行构造的时候,需要将功能类似的,但形参不同的方法同时打包在该类下,以便在我们调用某个方法的时候,直接重载构造器中的该方法,可以说,这种构造形式,满足了我们对功能类似,形参不同的方法,调用的时候,进行重载,而满足了编译器自动初始化,人不需要手动初始化的需求。

而且有个,问题,本来两个方法,功能上是类似的,一棵树和一株树苗,你非得要给他们起不同的名字,多别扭,好在有了构造器,能够是功能相似的方法起相同的名字,不同的参数,而能够在被调用的时候得以重载,多么牛逼的构造器 啊

构造器是什么?(Java篇)相关推荐

  1. 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  2. 2018-03-24-利用动态二进制加密实现新型一句话木马之Java篇

    layout: post title: "利用动态二进制加密实现新型一句话木马-java篇" categories: [网络安全CyberSecurity] tags: [一句话木 ...

  3. 【原创】利用动态二进制加密实现新型一句话木马之Java篇

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  4. 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)

    一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...

  5. Java篇 - 聊聊cloneable

    今天来说说cloneable,java中创建对象除了使用new关键字,反射,还有一种方式就是clone.有一个设计模式叫原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,简单的 ...

  6. map根据value值排序_凯哥带你从零学大数据系列之Java篇---第十九章:集合(Map+Collections)...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  7. BurpSuite插件开发指南之 Java 篇

    Her0in · 2016/05/27 16:53 此文接着 <BurpSuite插件开发指南之 API 下篇> .在此篇中将会介绍如何使用Java 开发 BurpSuite 的插件,重点 ...

  8. JSON总结(java篇)

    JSON总结(java篇一) JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于 ...

  9. ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  10. java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、

    五:Java如何做到让机器理解我们想要做的东西 用一个图来描述这个过程会比较容易理解: 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的过程 ...

最新文章

  1. HDOJ 1060 Leftmost Digit
  2. 人工智能写的散文之白色月光下
  3. hashmap 判断key是否存在
  4. sql server中将一个字段根据某个字符拆分成多个字段显示
  5. 【转】微服务架构下分布式事务方案
  6. 应用架构的核心使命是什么?阿里高级技术专家这样说
  7. 题解 CF1399D 【Binary String To Subsequences】
  8. Python:pathlib库使用方法
  9. JavaScript 图像延迟加载库 Echo.js的简单使用
  10. pr cc 2018的快捷键整理
  11. Python爬虫案例:大批量抓取堆糖网图片
  12. 2022-05-30 无法验证是否已安装所需的Microsoft更新KB2919355
  13. 网络路由器协议(OSPF、RIP、BGP、IGRP、IS-IS)
  14. Fractions to Decimals
  15. 苹果Mac软件下载站点及论坛推荐
  16. 洛谷P1209修理牛棚 Barn Repair
  17. kip6000打印服务器系统安装,KIP6000驱动安装步骤.
  18. MogaFX —北美和大洋洲的汇率
  19. 如何在vmware workstation 上安装xp系统
  20. 从产品经理的角度如何提升项目的交付质量?

热门文章

  1. Git命令,合并分支到master,并提交远程仓库,将本地分支推送到远程仓库
  2. java byte 拓展_Java项目中如何扩展第三方jar包中的类?
  3. 东北大学浑南校区计算机学院,浑南校区各主要建筑介绍:信息科学大楼
  4. python 注释一段话_干货!Python入门基础知识点总结
  5. android异步网络连接开源:Android Asynchronous Http Client
  6. 重庆大学计算机学院就读,唐远炎(计算机学院)老师 - 重庆大学 - 院校大全
  7. koa2入门(3)mongoose 增删改查
  8. 【坚持】Selenium+Python学习记录 DAY10
  9. Docker多步构建更小的Java镜像
  10. [C#基础]c#中的BeginInvoke和EndEndInvoke