面向对象(二)

本文深入解析构造方法的概念及其特性,包括其特殊用途、如何在对象创建时自动执行初始化工作、构造方法间的重载与连锁调用机制,以及如何通过this()实现构造器之间的调用。此外,还介绍了匿名对象的应用场景及面向对象编程中的package和import关键字的作用。

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

构造方法总结:

构造方法: 特殊方法,它的作用是在对象创建的时候自动执行一些初始化工作。
特征: a.方法名与类名一致
b.没有返回值类型,甚至连void也没有
c.不能被final static synchronized abstract等修饰
d.不可以像普通方法一样随意调用,只能在对象创建时调用一次
e.所有的类都必须有构造器(若类中没有构造器,编译器会自动添加一个无参构造器,若类中有构造器,编译器不会自动添加无参构造器)

构造器的使用:构造器可以重载
构造器间可以利用this()调用,实现连锁调用,但至少应该有一个没有使用this()(不能无限递归)
this()调用必须在第一行(有效行),保证对其他构造器的调用必须先执行。

包含构造器,对象在创建时,内存中的执行过程分析:
源程序:
这里写图片描述
内存执行过程分析:
这里写图片描述

匿名对象:创建一个对象,直接调用对象的方法,不将对象的内存地址保存在引用类型变量
匿名对象可以作为实参给方法传值。
若在方法中以对象为参数时,在方法中可以利用引用修改对象的信息。

面向对象中的两个关键字:package,import
package:告诉编译器当前源文件中的所有类最终生成class文件后,class文件保存的包目录结构。
package必须写在程序的第一行。
命名:字母全部小写
四部分:机构类型名称.机构名称.项目名称.模块名称
注:类中一旦使用了package语句,这个类的编译不一样,
javac -d . 源文件.java (在当前目录中生成package语句中指示的包目录结构)
类名不一样,在调用这个类的时候一定要写类的全限定名称(全称包名+类名)

import: 导类,建议一个一个类的导入,这样更清晰。
import作用告诉编译器,当前的源文件中要使用的其他包的类在什么包目录下面。
java.lang包中所有类都已经自动导入。

对于构造器,对象作为参数传递,package,import关键字有如下小例子供参考。

package com.atguigu.javase.javabean;
/**
    Student类,包含id,name,gender,major属性封装,
    并提供两个构造器,一个是无参的另一个是4个参数的
    并添加say方法

    再添加一个参数的构造器,参数是id,
    在构造器中使用this(...)实现构造器的连锁调用
*/
public class Student {
    //对属性进行封装
    private int id;
    private String name;
    private String gender;
    private String major;

    //无参构造器,若是自己没有定义构造器,系统会自动添加一个默认的无参构造器
    public Student() {
        this(1);    //利用this()实现构造器的连锁调用(调用,栈结构)
                    //this()必须在有效行的第一行,保证对其他构造器的调用必须先执行
                    //this()不能无限递归
        System.out.println("Student()....");
    }
    //参数为id的有参构造器
    public Student(int id) {
        this(id,"未知","未知","未知");
        System.out.println("Student(int)....");
    }
    //参数为int id, String name, String gender, String major的有参构造器
    public Student(int id, String name, String gender, String major) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.major = major;
        System.out.println("Student(int,String,String,String)");
    }
    //为外界提供一个公共调用属性的方法
    //id的set/get方法
    public void setId(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
    //neme的set/get方法
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    //gender的set/get方法
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getGender() {
        return gender;
    }
    //major的set/get方法
    public void setMajor(String major) {
        this.major = major;
    }
    public String getMajor() {
        return major;
    }
    //将形参设置为引用类型的,如Phone ph
    //在该类中使用其他类的对象
    public void call(Phone ph) {
        System.out.println(this.say() + ",在使用手机" + ph.say() + "打电话");
    }

    //say方法
    public String say() {
        return "学号:" + id + ",名字:" + name + ",性别:" + gender + ",专业:" + major;
    }
}
package com.atguigu.javase.javabean;
/*
    写一个phone类,属性os,screen
    在Student类中添加一个方法,call(Phone phone)
    在测试类中调用call方法
*/
public class Phone {

    private String os;
    private double screen;

    public Phone() {

    }
    public Phone(String os, double screen) {
        this.os = os;
        this.screen = screen;
    }

    public void setOs(String os) {
        this.os = os;
    }
    public String getOs() {
        return os;
    }

    public void setScreen(double screen) {
        this.screen = screen;
    }
    public double getScreen() {
        return screen;
    }

    public String say() {
        return "[操作系统:" + os + ",屏幕大小:" + screen + "]";
    }
}
package com.atguigu.javase.test;    //机构类型名.机构名称.项目名称.模块名称
import com.atguigu.javase.javabean.Student; //导入Student类
import com.atguigu.javase.javabean.Phone;       //导入Phone类
/**
    在测试类中分别使用两个构造器创建两个对象,
    打印输出对象的详细信息

    注:1.类中一旦使用了package语句,这个类的编译不一样。
        javac -d . 源文件.java 在当前目录中生成package语句中
        指示的包目录结构
        2.类中一旦使用了package语句这个类的类名也会不一样。
        在其他类中使用该类,必须使用该类的全限定名称(全称包名+类名)
*/

public class StudentTest {

    public static void main(String[] args) {
        //使用无参构造器创建对象
        //com.atguigu.javase.javabean.Student s1 = new com.atguigu.javase.javabean.Student();
        Student s1 = new Student();
        System.out.println(s1.say());
        //使用4参构造器创建对象
        //com.atguigu.javase.javabean.Student s2 = new com.atguigu.javase.javabean.Student(2,"沈yl","男","计算机");
        Student s2 = new Student(2,"沈yl","男","计算机");
        System.out.println(s2.say());
        //s2.call(new com.atguigu.javase.javabean.Phone("andriod",5.0));
        s2.call(new Phone("andriod",5.0));

    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值