第十七、Java面向对象之构造函数与构造代码块
来源:互联网 发布:网络棋牌推广违法吗 编辑:程序博客网 时间:2024/06/18 08:25
我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?
需求: 使用java类描述 一个婴儿, 一种婴儿一出生就具备了名字(白户),还有一种婴儿就是 出生之后才有名字 的(黑户)。
构造函数的作用: 给对应的对象进行初始化。
构造函数的定义的格式:
修饰符 函数名(形式参数){函数体...
}
构造函数要注意的细节:
1. 构造函数 是没有返回值类型的。2. 构造函数的函数名必须要与类名一致。
3. 构造函数并不是由我们手动调用的,而是在创建对应的对象时,jvm就会主动调用到对应的构造函数。
4. 如果一个类没有显式的写上一个构造方法时,那么java编译器会为该类添加一个无参的构造函数的。
5. 如果一个类已经显式的写上一个构造方法时,那么java编译器则 不会再为该类添加 一个无参 的构造方法。
6. 构造函数是 可以在一个类中以函数重载 的形式存在多个 的。
/*描述一个员工类,员工具备 的属性:id\ name \ age 。具备的公共行为: 工作。 要求:一旦创建一个员工对象 的时候,那么该员工对象就要对应 的属性值。*/class Employee{int id; //编号String name; //名字int age; //年龄//构造函数public Employee(int a, String b , int c){id =a;name = b;age = c;}public void work(){System.out.println(name+"好好工作,努力挣钱!!");}}class MyClass {public static void main(String[] args) {//创建一个员工对象Employee e = new Employee(110,"米奇",20);System.out.println("编号:"+ e.id+" 名字:"+e.name +" 年龄:"+ e.age);}}
疑问:创建对象时,jvm就会调用到对应的构造方法,那么我们以前没有学构造方法,那么以前创建对象时,jvm是否 也会调用构造方法呢?如果有?构造方法从何而来呢?
会调用, java编译器在编译的 时候给加上去的。
jdk提供了一个java开发工具(javap.exe)给我们进行反编译的。
javap 反编译工具的使用格式:javap -c -l -private 类名
疑问: java编译器添加 的无参构造方法的权限修饰符是 什么?
与类的权限修饰是一致的。
构造函数与普通 函数的区别:
1. 返回值类型的区别:1. 构造函数是没有返回值类型的。
2. 普通函数是有返回值类型的,即使函数没有返回值,返回值类型也要写上void。
2. 函数名的区别:
1. 构造函数的函数名必须要与类名一致。
2. 普通函数的函数名只要符合标识符的命名规则即可。
3. 调用方式的区别:
1. 构造函数是 在创建对象的时候由jvm调用的。
2. 普通函数是由我们使用对象调用的,一个对象可以对象多次普通 的函数,
4. 作用上的区别:
1. 构造函数 的作用用于初始化一个对象。
2. 普通函数是用于描述一类事物的公共行为的。
//婴儿类class Baby{int id; //身份证String name; //名字//构造函数public Baby(int i , String n){id = i;name = n;System.out.println("baby的属性初始化完毕!!");}//无参 的构造函数public Baby(){System.out.println("无参的构造函数被调用了..");}//哭public void cry(){System.out.println(name+"哇哇哭...");}}class MyClass {public static void main(String[] args) {//创建一个baby对象Baby b1 = new Baby(110,"狗娃"); //婴儿诞生 白户System.out.println("编号:"+ b1.id +" 姓名:"+ b1.name);b1.cry();b1.cry();/*//黑户Baby b2 = new Baby();new Baby();b2.id = 112;b2.name = "狗剩";System.out.println("编号:"+ b2.id +" 姓名:"+ b2.name);*/}}
问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用cry()函数,但是这样子的话造成了代码重复问题,那么怎么解决呢?构造代码块。
构造代码块:
构造函数的作用: 给对应的对象进行初始化。
构造代码块的作用:给对象进行统一的初始化。
1:给对象进行初始化。对象一建立就运行并且优先于构造函数。
2:与构造函数区别
1) 构造代码块和构造函数的区别,构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。
2) 构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。
例如孩子一出生统一哭
{
构造代码块
}
注意: 构造代码块的大括号必须位于成员 位置上。
代码块的类别:
1. 构造代码块。
2. 局部代码块. 大括号位于方法之内。 作用:缩短局部 变量 的生命周期,节省一点点内存。
3. 静态代码块 static
class Baby{int id; //身份证String name; //名字//构造代码块...{//System.out.println("构造代码块的代码执行了......");}//带参构造函数public Baby(int i , String n){id = i;name = n;}//无参构造方法public Baby(){}public void cry(){System.out.println(name+"哇哇哭...");}}class MyClass {public static void main(String[] args) {Baby b1 = new Baby(110,"米奇"); System.out.println("编号:"+ b1.id + " 名字:"+b1.name);/*System.out.println("编号:"+ b1.id + " 名字:"+b1.name);new Baby(112,"唐老鸭");new Baby();*//*new Baby(110,"米奇");new Baby(112,"唐老鸭");new Baby();*/}}
构造代码块要注意的事项:
1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端。2. 成员变量的初始化工作其实都在在构造函数中执行的。
3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,构造函数的中代码是最后执行 的。
4. 成员变量的显示初始化与构造代码块 的代码是按照当前代码的顺序执行的。
class MyClass {//构造函数public MyClass(){ //构造函数i = 300000000;}//构造代码块 //构造代码块的初始化{i = 200000000;}int i = 100000000; //成员变量的显初始化public static void main(String[] args) {MyClass d = new MyClass();System.out.println("i = "+d.i); }}
0 0
- 第十七、Java面向对象之构造函数与构造代码块
- 【末世旅行之Java】构造函数与构造代码块
- Java面向对象 构造代码块
- Java重修之路(六)面向对象初识,类与对象,成员变量,局部变量,封装,构造函数,构造代码块,this关键字
- 黑马程序员 JAVA初级-面向对象 匿名对象、封装、构造函数、构造代码块、this
- JAVA面向对象知识点总结(2)—封装、构造函数、构造代码块、this关键字
- Java基础--面向对象(封装、构造函数、构造代码块、this关键字)
- 【学习笔记04】java面向对象-构造函数、构造代码块
- Java之静态代码块、构造代码块、与构造函数的用法
- Java 面向对象(封装、继承、多态+面向对象、构造函数、静态代码块)
- Java基础_面向对象_类与对象、构造函数、关键字、静态代码块、单例
- Java基础---面向对象(面向对象,类,对象,匿名对象,封装,构造函数,构造代码块,this,static,main,帮助文档,静态代码块,单例)
- java代码块与构造函数
- 黑马程序员-面向对象(构造函数、构造代码块、静态代码块)
- 面向对象及构造代码块、静态代码块、构造函数的区别
- 黑马程序员:Java之介绍对象、封装、构造函数、构造代码块及this关键字
- java基础之----构造函数和构造代码块
- Java之构造函数与初始化块
- 您理解云计算了吗?
- Linux常用命令
- NKOJ-2134“最大”异或“次大”【Codeforces Round #172 (Div. 1)】
- TensorFlow学习篇【3】Deep MNIST for Experts
- uboot下ARMv8 EL切换
- 第十七、Java面向对象之构造函数与构造代码块
- 【BZOJ】 1001 [BeiJing2006]狼抓兔子 网络最大流
- springmvc注解区分一个有多个实现类的借口
- Vue.js学习系列(二十)--常用指令(三)
- 篱栅:CyclicBarrier
- 《ACM程序设计》书中题目R-18
- js中for循环变量的作用域
- MongoDB -- MongoClient连接池用法
- dubbo配置文件报错解决思路