Java中构造器详解(类的五成员之三:构造器)

这篇具有很好参考价值的文章主要介绍了Java中构造器详解(类的五成员之三:构造器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

友情提醒

先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。

概述:Java类的五成员之三:构造器

Java的基本单位是类,类中包含五个部分,这篇写的是构造器

(1)变量

(2)方法

(3)构造器

(4)初始化块

(5)内部类

一、构造器概述

1)什么是构造器

①构造器是处于Java类中的一个方法,最大的作用创建对象时执行初始化。

2)构造器特点(和普通方法的区别)

①构造方法名不能自定义必须和类名相同。普通的方法首字母小写后续单词字母大写。
②构造器可以哟访问权限修饰符但是不能有final,,static,,abstract,synchronized,native修饰符。
②没有返回值和返回类型,也不需要void。
③构造器在创建对象时执行初始化

class Citizen 
{	//成员属性
	String name;
	MyDate birth;
	//构造方法
	public Citizen(String n,MyDate b){
		name = n;
		birth = b;
	}
}

3)构造器的重载(方法重载)

①缺省构造器指没有人为写构造方法时,系统隐式生成的空参构造器,当我们初始化对象不给对象的属性赋值时将调用此缺省构造方法。
②非缺省构造器指人为显示定义的构造方法,当我们初始化对象需要给对象的属性赋值时将调用此非缺省构造方法,当我们写了有参构造的时候,系统将不会再生成空参构造器必须我们手动写出来(显示定义)。
③二者构成重载现象

class Citizen 
{	//成员属性
	String name;
	MyDate birth;
	//构造方法
	public Citizen(String name,MyDate birth){
		this.name = name;
		this.birth = birth;
	}
	public Citizen(){
	//空参构造,与有参构造构成了方法重载
	}
}

4)执行构造方法之前

在执行构造函数中的代码之前,先要执行隐式三步:
a)super():调用父类构造函数
b)给对象空间中的非静态成员变量显示赋值
c)执行构造代码块
创建对象的过程中执行优先级:
静态代码块和静态成员变量执行顺序和代码中出现的顺序有关,静态成员变量优先于非静态成员变量,非静态成员变量优先于构造代码块,构造代码块优先于构造函数之前初始化
也就是:
静态代码块=静态成员变量>非静态成员变量>构造代码块>构造函数中代码
构造函数结束出栈,对象创建完成。

二、this和super

1)构造器中的this关键字

this用法
①this在构造器中,代表当前构造器正在创建的对象的内存地址,同时使用this在构造方法内部调用本类重载的构造方法必须只能在首行位置进行调用 否则将导致编译错误

class Teacher
{	String name;
    int age;
    //两个参数构造方法
    public Teacher(String name,int age){
   //this.name = name; //this. 的方式,如果没注释就得报错,因为this(name)必须首行
        this(name);			  //this(name);	 调用重载构造方法的方式
        this.age = age;
    }
    //一个参数构造方法
    public Teacher(String name){
        this(); // this();	 //调用重载构造方法的方式
        this.name = name;   //this. 不用放首行
        System.out.println("一个参数构造...this=" + this);		//②		同一个正在被创建对象的地址
    }
    //无参构造
    public Teacher(){
//如果this("徐老师",32,);取消注释,会错误: 递归构造器调用,构造方法之间相互调用不能形成闭合回路
        //this("徐老师",32,);
        System.out.println("空参数构造...this=" + this);		//①		正在被创建对象的地址
    }
    public void printInfo(){
        System.out.println("姓名:" + name + ",年龄:" + age + ",籍贯:" + 
        address + "...this=" + this);//③	已经创建完成对象的地址
    }
}

②this在非静态方法中:this代表已经创建完成的对象,指向正在执行方法的类的实例。(谁调用我,我指向谁)

package test_this;
class Person
{   String name;
    int age;
    public Person(String n,int a){
        //① 此处的this记录的是当前正在被创建Person对象的内存地址
        System.out.println("构造方法...this=" + this);
        name = n;
        age = a;
    }
    public Person(){ }
    public void printInfo(){
        System.out.println("姓名:" + name + ",年龄:" + age + "...this=" + this);		//③ 此处this记录的是已经创建完毕Person对象的内存地址
    }
    public static void main(String[] args)
    {
        Person p = new Person("张三",30);
        System.out.println(p);		//② 此处的p记录的是已经创建完毕Person对象的内存地址
        p.printInfo();
    }
}
/*打印结果
构造方法...this=test_this.Person@3d8c7aca
test_this.Person@3d8c7aca
姓名:张三,年龄:30...this=test_this.Person@3d8c7aca
*/

③用来区分成员变量和局部变量。

class Student
{   String name;
    private int age;
    char sex;
    public Student(String name,int age,char sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Student(){ }
    public int getAge(){
        return this.age;
    }
    public void setAge(int age){
        this.age = age;
    }
    public void printInfo(){
        String name = "lili";
        int age = 18;
        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.sex);
    }
    public static void main(String[] args)
    {	String name = "lili";
        int age = 18;
        Student s = new Student("韩梅梅",19,'女');
        s.printInfo();
    }
}
// 打印结果 姓名:韩梅梅,年龄:19,性别:女

④静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。

2)构造器中的super关键字

super关键字用法:
super在普通方法中:用这个关键字去执行被重载的超类中的非静态方法,使用super.func()去调用超类中被重载的方法。
ps:重写父类方法的时候可以在子类方法体里直接super.父类方法,直接把父类方法拿过来用然后再添加其他代码,达到复用的目的。

class Father
{	public void func(){
        System.out.println("Father...func");
    }
}
//---------------------------------分割--------------------------------
class Son extends Father
{	public void func(){
        System.out.println("Son...func");
    }
    public void test(){
        //func();
        super.func();
    }
}

super关键字在构造方法:子类构造方法首行隐式的有super()用来接受父类成员变量,先调用父类构造再调用子类构造。 对super的调用必须是构造器中的第一个语句。this() 和 super() 不能同时存在,因为他们都要写在构造函数的第一行。

class Person
{
    //属性
    String name;
    int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public Person(){ }
}
//------------------分割--------------------------------------
class Worker extends Person
{
	//方式一:显示定义在构造方法内部调用super(...)构造
	public Worker(String name,int age){
		super(name,age);
	}
	//方式二:在Person类中有空参构造,本类的空参构造隐式的有super();
	 public Worker(){
	    //super();//可以不写
    }
}

父类和接口中如果都定义了相同名字的默认方法,子类继承父类的同时实现了该接口,默认执行父类中的方法,这是类优先原则,如果想使用接口中的方法:接口名.super.方法名。

两个接口中都定义了相同名字的默认方法,子类同时实现两个接口,这时候编译器报错,需要选择一下具体用哪个,或者用接口名.super.方法名来选择,再或者直接全部重写。文章来源地址https://www.toymoban.com/news/detail-714211.html

public interface Inter2 {
	//默认方法1
	public default void method(){
		System.out.println("Inter2...method");
	}
	//默认方法2
	public default void func(){
		System.out.println("Inter2...func");
	};
	//抽象方法
	void show();
}
//-------------------------------分割------------------------------
public interface Inter3 {
	//默认方法1
	public default void method(){
		System.out.println("Inter3...method");
	}
	//默认方法2
	public default void func(){
		System.out.println("Inter2...func");
	};
	//抽象方法
	void show();
}
//-------------------------------分割------------------------------
/*	接口冲突问题:
 * 	多个接口内部都定义了相同名字的默认方法,类同时去实现这多个接口,
 * 用接口名.super.方法名来选择,再或者直接全部重写。
 */
public class InterImpl2 implements Inter2, Inter3 {
	@Override//重写默认方法
	public void method() {
//		Inter2.super.method();
//		Inter3.super.method();
		System.out.println("都不适合,完全重写...");
	}
	@Override//重写默认方法
	public void func() {
		Inter2.super.func();
	//	Inter3.super.func();
	//	System.out.println("都不适合,完全重写...");
	}
	@Override//重写抽象方法
	public void show() {
		System.out.println("sbsbsb");
	}

}

到了这里,关于Java中构造器详解(类的五成员之三:构造器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Scala第六章节(类和对象的定义、访问修饰符和构造器的用法、main方法的实现形式、伴生对象的使用以及工具类的案例)

    Scala第六章节(类和对象的定义、访问修饰符和构造器的用法、main方法的实现形式、伴生对象的使用以及工具类的案例)

    章节目标 掌握类和对象的定义 掌握访问修饰符和构造器的用法 掌握main方法的实现形式 掌握伴生对象的使用 掌握定义工具类的案例 1. 类和对象 Scala是一种函数式的面向对象语言, 它也是支持面向对象编程思想的,也有类和对象的概念。我们依然可以基于Scala语言来开发面向

    2024年03月19日
    浏览(8)
  • MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

    MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

    MyBatisPlus详解系列文章: MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置 2.1.1 Wrapper 在BaseMapper接口提供的相关方法中,除了以id作为where条件, 还支持更加复杂的where条件,即条件构造器Wrapper : Wrapper是条件构造器的抽象类,其下有很多默认实现,继承

    2024年04月25日
    浏览(8)
  • Java8函数式接口, 方法引用, 构造器引用, 数组引用

    Java8函数式接口, 方法引用, 构造器引用, 数组引用

    只包含一个抽象方法的接口,称为函数式接口。 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明 我们可以在一个接口上使用 @Functionallnterface 注解,这样做可以检查它是

    2024年02月05日
    浏览(16)
  • MyBatis-Plus——条件构造器Wapper、QUeryWrapper、UpdateWrapper、LambdaQueryWrapper、LambdaUpdateWrapper(详解)

    MyBatis-Plus——条件构造器Wapper、QUeryWrapper、UpdateWrapper、LambdaQueryWrapper、LambdaUpdateWrapper(详解)

    目录 一、条件构造器简介 二、QueryWrapper组装查询条件 三、QueryWrapper组装排序条件 四、QueryWrapper组装删除条件 五、QueryWrapper实现修改功能 六、QueryWrapper条件的优先级 七、QueryWrapper组装select字句(查询指定字段) 八、QueryWrapper组装子查询 九、UpdateWrapper实现修改功能 十、Q

    2024年02月07日
    浏览(10)
  • Effective Java笔记(3)用私有构造器或者枚举类型强化 Singleton 属性

            Singleton 是指仅仅被实例化一次的类 。Singleton 通常被用来代表一个无状态的对象,如函数,或者那些本质上唯一的系统组件 。 使类成为 Singleton会使它的害户端测试变得十分困难 ,因为不可能给 Singleton 替换模拟实现,除非实现一个充当其类型的接口 。      

    2024年02月15日
    浏览(7)
  • 《Effective Java》第三条 用私有构造器或者枚举类型强化Singleton属性

    Singleton其实就是单例,即一个类在一个应用程序中只被实例化一次,只有一个对象。 本节讨论三种实现方式 私有构造+共有成员 私有构造+静态工厂方法+私有成员 枚举实现 1、共有成员 构造方法私有,有一个该类类型的公有不可变的实例域。 1.1 code 当类加载的时候就会创建

    2024年02月16日
    浏览(7)
  • Java 无法将类 xxx中的构造器 xxx应用到给定类型问题解决

    Error:(12, 41) java: 无法将类 com.xudongbase.common.question.builder.QuestionBuilder中的构造器 QuestionBuilder应用到给定类型;   需要: java.lang.String,java.lang.String   找到: 没有参数   原因: 实际参数列表和形式参数列表长度不同 1、给类添加lombok中的@Builder注解,但是又想使用无参构造方法,导致

    2024年02月08日
    浏览(5)
  • 我在VScode学Java继承(Java继承的特点、super关键字、super和this对比、方法重写、子类构造器)贰

    我在VScode学Java继承(Java继承的特点、super关键字、super和this对比、方法重写、子类构造器)贰

    类的成员包括:成员变量;成员方法;构造方法 构造方法:不管什么修饰符都不可继承 成员变量:都可以继承,但注意一点(继承!=调用,私有的就不可调用) 成员方法:非私有可以。私有不可。 我的个人博客主页:如果’\\\'真能转义1️⃣说1️⃣的博客主页 关于Java基本语

    2024年02月14日
    浏览(36)
  • 单例模式与构造器模式

    单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建 在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单

    2024年02月15日
    浏览(7)
  • MyBatis-Plus:条件构造器Wrapper

    MyBatis-Plus:条件构造器Wrapper

    目录 1.Wrapper概述 1.1.Wrapper的继承关系 1.2.Wapper介绍  1.3.各个构造器使用区别 1.4.构造器常用方法 2.Wrapper常用构造器介绍 2.1.QueryWrapper 2.2.UpdateWrapper 2.3.LambdaQueryWrapper 2.4.AbstractWrapper 3. Lambda条件构造器 3.1.示例 4.鸣谢         我们在实际操作数据库的时候会涉及到很多的条件

    2024年02月11日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包