构造器是什么?(Java篇)
构造方法的定义:
构造方法也叫构造器或者构造函数
构造方法与类名相同,没有返回值,连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篇)相关推荐
- 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- 2018-03-24-利用动态二进制加密实现新型一句话木马之Java篇
layout: post title: "利用动态二进制加密实现新型一句话木马-java篇" categories: [网络安全CyberSecurity] tags: [一句话木 ...
- 【原创】利用动态二进制加密实现新型一句话木马之Java篇
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)
一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...
- Java篇 - 聊聊cloneable
今天来说说cloneable,java中创建对象除了使用new关键字,反射,还有一种方式就是clone.有一个设计模式叫原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,简单的 ...
- map根据value值排序_凯哥带你从零学大数据系列之Java篇---第十九章:集合(Map+Collections)...
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- BurpSuite插件开发指南之 Java 篇
Her0in · 2016/05/27 16:53 此文接着 <BurpSuite插件开发指南之 API 下篇> .在此篇中将会介绍如何使用Java 开发 BurpSuite 的插件,重点 ...
- JSON总结(java篇)
JSON总结(java篇一) JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于 ...
- ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、
五:Java如何做到让机器理解我们想要做的东西 用一个图来描述这个过程会比较容易理解: 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的过程 ...
最新文章
- HDOJ 1060 Leftmost Digit
- 人工智能写的散文之白色月光下
- hashmap 判断key是否存在
- sql server中将一个字段根据某个字符拆分成多个字段显示
- 【转】微服务架构下分布式事务方案
- 应用架构的核心使命是什么?阿里高级技术专家这样说
- 题解 CF1399D 【Binary String To Subsequences】
- Python:pathlib库使用方法
- JavaScript 图像延迟加载库 Echo.js的简单使用
- pr cc 2018的快捷键整理
- Python爬虫案例:大批量抓取堆糖网图片
- 2022-05-30 无法验证是否已安装所需的Microsoft更新KB2919355
- 网络路由器协议(OSPF、RIP、BGP、IGRP、IS-IS)
- Fractions to Decimals
- 苹果Mac软件下载站点及论坛推荐
- 洛谷P1209修理牛棚 Barn Repair
- kip6000打印服务器系统安装,KIP6000驱动安装步骤.
- MogaFX —北美和大洋洲的汇率
- 如何在vmware workstation 上安装xp系统
- 从产品经理的角度如何提升项目的交付质量?
热门文章
- Git命令,合并分支到master,并提交远程仓库,将本地分支推送到远程仓库
- java byte 拓展_Java项目中如何扩展第三方jar包中的类?
- 东北大学浑南校区计算机学院,浑南校区各主要建筑介绍:信息科学大楼
- python 注释一段话_干货!Python入门基础知识点总结
- android异步网络连接开源:Android Asynchronous Http Client
- 重庆大学计算机学院就读,唐远炎(计算机学院)老师 - 重庆大学 - 院校大全
- koa2入门(3)mongoose 增删改查
- 【坚持】Selenium+Python学习记录 DAY10
- Docker多步构建更小的Java镜像
- [C#基础]c#中的BeginInvoke和EndEndInvoke