Java基础(13)-- 面向对象、构造方法、this、super

本文详细介绍了构造方法的定义、特点及其与一般方法的区别,并解释了如何使用this关键字解决成员变量与局部变量同名的问题,同时探讨了super关键字在继承中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、构造方法

  • 构造方法的格式:

修饰符 构造方法名(参数列表)

{

}

  • 构造方法的体现:
    1. 构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。
    2. 构造方法名称必须和类型保持一致。
    3. 构造方法没有具体的返回值。
  • 构造方法的细节:
  1. 一个类中可以有多个构造方法,多个构造方法是以重载的形式存在的
  2. 构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象。

class Person {

    private int age;

    private String name;

 

    // 私有无参数的构造方法,即外界不能通过new Person();语句创建本类对象

    private Person() {

    }

 

    // 多个构造方法是以重载的形式存在

    Person(int a) {

        age = a;

    }

 

    Person(String nm, int a) {

        name = nm;

        age = a;

    }

}

  • 构造方法和一般方法区别

构造方法在对象创建时就执行了,而且只执行一次。

一般方法是在对象创建后,需要使用时才被对象调用,并可以被多次调用。

 

二、this关键字

构造方法之间的调用,可以通过this关键字来完成。

  1. 构造方法调用格式:

this(参数列表);

1、this的图解原理

class Person {

    private int age;

    private String name;

 

    Person() {

    }

    Person(String nm) {

        name = nm;

    }

    Person(String nm, int a) {

        this(nm);

        age = a;

    }

}

 

class PersonDemo {

    public static void main(String[] args) {

        Person p = new Person("张三", 23);

    }

}

  1. 先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
  2. 堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null  age = 0);
  3. 拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。
  4. 由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
  5. 程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
  6. 当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。

2、成员变量和局部变量同名问题

可以在成员变量名前面加上this.来区别成员变量和局部变量

class Person {

    private int age;

    private String name;

 

    // 给姓名和年龄初始化的构造方法

    Person(String name, int age) {

        // 当需要访问成员变量是,只需要在成员变量前面加上this.即可

        this.name = name;

        this.age = age;

    }

 

    public void speak() {

        System.out.println("name=" + this.name + ",age=" + this.age);

    }

 

    // 判断是否为同龄人

    public boolean equalsAge(Person p) {

        // 使用当前调用该equalsAge方法对象的age和传递进来page进行比较

        // 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替

        /*

         * if(this.age == p.age) { return true; } return false;

         */

        return this.age = p.age;

    }

}

三、super关键字

在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句。

格式:

调用本类中的构造方法

this(实参列表);

调用父类中的空参数构造方法

super();

调用父类中的有参数构造方法

super(实参列表);

 

注意:

类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。

如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值