Java构造器

基本语法

[修饰符] 方法名(参数列表) {构造方法体
}

细节说明

1)在 Java 中一个类可以定义多个不同的构造方法(构造器),构造方法重载

2)如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器)

3)一旦定义了自己的构造方法(构造器),默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下

4)子类的构造器默认会调用父类的空参构造器

5)如果子类显式的使用super()调用父类的有参构造器则不会再去调用父类的空参构造器

案例

public class JavaDemo {public static void main(String[] args) {//细节说明4new Student();    //调用了父类的空参构造器new Student("zhangsan", 170.0);    //调用了父类的空参构造器//细节说明5new Student("lisi", 18, 175.0);    //调用了父类的带参构造器}
}class Person {String name;int age;public Person() {System.out.println("调用了父类的空参构造器");}public Person(String name, int age) {this.name = name;this.age = age;System.out.println("调用了父类的带参构造器");}
}class Student extends Person {double height;public Student() {}public Student(String name, int age, double height) {super(name, age);this.height = height;}public Student(String name, double height) {this.name = name;this.height = height;}
}

Scala构造器

介绍

1)和 Java 一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即 scala 中构造器也支持重载)

2)Scala 类的构造器包括:主构造器和辅助构造器

基本语法

class 类名(形参列表) {    //主构造器// 类体def this(形参列表) {    //辅助构造器}def this(形参列表) {    //辅助构造器可以有多个,编译器通过不同参数来区分}
}

细节说明

1)Scala 构造器作用是完成对新对象的初始化,构造器没有返回值

2)主构造器的声明直接放置于类名之后

3)主构造器会执行类定义中的所有语句,这里可以体会到 Scala 的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别

4)如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略

5)辅助构造器名称为 this(这个和 Java是不一样的),多个辅助构造器通过不同参数列表进行区分,在底层就是构造器重载。辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接)

6)如果想让主构造器变成私有的,可以在 () 之前加上 private,这样用户只能通过辅助构造器来构造对象了,示例:class Person private() {}

7)辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)

8)子类的主构造器默认会调用父类的空参构造器,这就会直接或间接的调用父类的主构造器

案例

.scala代码:object ScalaConstructor {def main(args: Array[String]): Unit = {//1. 使用主构造器val person1 = new Person1("Tom", 18)println(person1.toString)//执行了主构造器的其他语句:age=28//输出:name=Tom, age=28println("**************************")//2. 使用辅助构造器val person2 = new Person1("Tom")println(person2.toString)//执行了主构造器的其他语句:age=20//输出:name=Tom, age=20}
}//主构造器:初始化对象的age属性和name属性
class Person1(inName: String, inAge: Int) {var name: String = inNamevar age: Int = inAgeage += 10println("执行了主构造器的其他语句:" + "age=" + age)//重写toString,便于输出对象的信息override def toString: String = {"name=" + this.name + ", age=" + this.age}//辅助构造器:初始化对象的name属性def this(name: String) {//辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接)this("jack", 10)//如果主构造器是空参构造器,则可以写成this或this()this.name = name //对name重新赋值}def this() {this("jack", 10)}
}Person1的反编译代码://可以看出scala主构造器和辅助构造器在底层都是java中的构造器,并没有主次之分
public class Person1 {private String name;private int age;public String name() {return this.name;}public void name_$eq(String x$1) {this.name = x$1;}public int age() {return this.age;}public void age_$eq(int x$1) {this.age = x$1;}public String toString() {return (new StringBuilder()).append("name=").append(name()).append(", age=").append(BoxesRunTime.boxToInteger(age())).toString();}public Person1(String name) {this("jack", 10);name_$eq(name);}public Person1() {this("jack", 10);}public Person1(String inName, int inAge) {this.name = inName;this.age = inAge;age_$eq(age() + 10);Predef$.MODULE$.println((new StringBuilder()).append(").append(BoxesRunTime.boxToInteger(age())).toString());}
}

Scala构造器参数的修饰符

说明

1)Scala 类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量

2)如果参数使用 val 关键字声明,那么 Scala 会将参数作为类的私有的只读属性使用

3)如果参数使用 var 关键字声明,那么 Scala 会将参数作为类的成员属性使用,并会提供属性对应的 xxx()[类似 getter] / xxx_$eq()[类似 setter]方法,即这时的成员属性是私有的,但是可读写

案例

.scala代码:object ScalaConstructor1 {def main(args: Array[String]): Unit = {val worker1 = new Worker1("zhangsan")//println(worker1.inName)  //不能访问inName, 会报错val worker2 = new Worker2("lisi")println(worker2.inName) //可以访问inName, lisival worker3 = new Worker3("wangwu")println(worker3.inName) //可以访问inName, wangwuworker3.inName = "zhaoliu" //可以修改inName,println(worker3.inName) //zhaoliuprintln(worker3.name) //wangwu}
}//1. 如果主构造器是Worker(inName: String),那么inName就是一个局部变量
class Worker1(inName: String) {var name = inName
}//2. 如果主构造器是Worker2(val inName: String) ,那么inName就是Worker2的一个private的只读属性
class Worker2(val inName: String) {var name = inName
}// 如果主构造器是Worker3(var inName: String),那么inName就是Worker3的一个private的可读写的属性
class Worker3(var inName: String) {var name = inName
}Worker1的反编译代码://inName变成Worker1构造器的局部变量,不能访问
public class Worker1 {private String name;public String name() {return this.name;}public void name_$eq(String x$1) {this.name = x$1;}public Worker1(String inName) {this.name = inName;}
}
Worker2的反编译代码://inName变成Worker2的私有不可变的属性,提供了 public String inName() {} 方法来访问
public class Worker2 {private final String inName;private String name;public String inName() {return this.inName;}public Worker2(String inName) {this.name = inName;}public String name() {return this.name;}public void name_$eq(String x$1) {this.name = x$1;}
}Worker3的反编译代码://inName变成Worker2的私有属性,提供了 public String inName() {} 方法来访问和 public void inName_$eq(String x$1) {} 来修改
public class Worker3 {private String inName;public String inName() {return this.inName;}public void inName_$eq(String x$1) {this.inName = x$1;}private String name = inName();public String name() {return this.name;}public void name_$eq(String x$1) {this.name = x$1;}public Worker3(String inName) {}
}

Scala主构造器和辅助构造器详解相关推荐

  1. Java构造器(构造方法)详解

    Java构造器(构造方法)详解 什么是构造器 构造器通常也叫构造方法.构造函数,构造器在每个项目中几乎无处不在.当你new一个对象时,就会调用构造器.构造器格式如下: [修饰符,比如public] 类 ...

  2. 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)...

    不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现"分区助手 ...

  3. (转载)MySQL数据库的主键和外键详解

    主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...

  4. 波音737计算机控制系统,波音737NG驾驶舱主飞行显示器(PFD)图文详解-空速指示

    波音737NG驾驶舱主飞行显示器(PFD)图文详解-空速指示 2018-09-15 源自@航维机务技术 概述 驾驶舱主飞行显示器上可以显示空速.高度.姿态.航向.垂直速度.飞行模式.飞行指引.着陆指示 ...

  5. scala中主构造器和辅助构造器

    class Person (var id: Int , var name: String) {//主构造器//在主构造器中声明了类型 在这个地方就不能再次声明类型 并且可以不用写 id 和 name ...

  6. Nginx主配置文件nginx.conf中文详解

    第1章 nginx配置解释图解 第2章 Nginx核心配置文件nginx.conf史上最细中文详解 2.1 定义Nginx运行的用户和用户组 2.2 nginxworker进程数,即处理请求的进程(熟 ...

  7. mysql 新增返回主键自增id_详解mysql插入数据后返回自增ID的七种方法

    引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 i ...

  8. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

  9. python3主函数返回值_Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

最新文章

  1. 来客推开源商城与你浅析:B2B2C多商户商城系统
  2. jdbc封装mysql_实用JDBC数据库查询封装
  3. sql查询每个学生的最高成绩mysql语句
  4. 优化杭州某著名电子商务网站高并发千万级大型数据库经验之- 磁盘I/O性能
  5. android 如何在线程缓存实体类
  6. ORACLE expdp/impdp详解
  7. IDEA图形化操作git
  8. redis session 超时时间_Shiro性能优化:解决Session频繁读写问题
  9. 引用和可触及性的强度
  10. 怎么把好几行弄成一行_我在git merge的时候遇到了冲突,怎么解决?
  11. java string 内存写了_Java String的内存机制
  12. 2017.9.6 外星人 思考记录
  13. 疑似华为Mate 30系列通过3C认证:标配40W快充
  14. Android开发笔记(四十五)手势事件
  15. Python 基本功能应用与简单数据分析
  16. CAD布局图纸导出为模型图纸
  17. 【详细图解】七彩虹智能主板的开机键连接线怎么插 | 七彩虹主板的前置音频接线法怎么插 | 七彩虹2.0主板 F_PANEL怎样插
  18. 内存类型UDIMM、RDIMM、LRDIMM大解析
  19. 钉钉机器人给指定人发消息
  20. GDPR哪些情况下会对企业征收行政罚款?

热门文章

  1. HTTP 请求头 Range 信息
  2. java.sql.SQLException: Statement.executeQuery() cannot issue statements that do not produce result
  3. 纪念那些在2019年逝去的技术
  4. 巧用WPS97画灯笼(转)
  5. 有什么平价好用的移动电源?平价好用的移动电源推荐
  6. python easygui安装_python3.7 下easygui 0.98的安装和简单教程
  7. BMP位图格式详解一
  8. WD移动硬盘在ubuntu下能打开在win10下不能打开解决方法
  9. 将驼峰法转为下划线连接的小写格式 (如fullName转为 full_name)
  10. 【Linux】网桥设置