【JavaSE成神之路】Java面向对象(下)

简介: 哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!这一节啊,咱们要学习的内容还是Java的面向对象。

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容还是Java的面向对象。5aa78e74a0d4f02632089b48f27a5b8c.gif


1. 构造方法

构造方法和new关键字是一对好拍档。

在之前GirlFriend的例子中,我们写了两个构造方法,一个是带参的,一个是无参的。

//类的构造方法
public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){
    this.name = name;
    this.hair = hair;
    this.glasses = glasses;
    this.skirt = skirt;
    this.color = color;
}
public GirlFriend() {
}

Java 构造方法是在创建 Java 类的实例时被调用的方法,它会为实例分配内存并初始化实例变量。


构造方法有两个特点:


1、构造方法的名称必须和类名相同,可以有参数,也可以没有参数;


2、构造方法没有返回值类型,不能使用return关键字。


记住这两点即可!


接下来看看构造方法的作用:


1、为实例变量赋初始值:

class Student{
    private String name;
    private int age;
    public Student(){
        this.name = "张三";
        this.age = 18;
    }
}

这段代码中的构造方法实现了给实例变量name和age赋初始值,即当创建新的Student实例时,name和age的值分别为“张三”和18。


2、可以通过构造方法实现重载:


class Student{
    private String name;
    private int age;
    public Student(){
        this.name = "张三";
        this.age = 18;
    }
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}

这段代码中的构造方法实现了重载,即通过传入不同的参数,可以创建不同的Student实例,name和age的值可以根据传入的参数而定。没错,构造方法也是可以重载的。

3、可以调用其他构造方法:

class Student{
    private String name;
    private int age;
    public Student(){
        this.name = "张三";
        this.age = 18;
    }
    public Student(String name,int age){
        this(name);
        this.age = age;
    }
    public Student(String name){
        this.name = name;
    }
}


这段代码中的构造方法实现了调用其他构造方法,即通过调用其他构造方法,可以创建不同的Student实例,name和age的值可以根据调用的构造方法而定。

4、可以通过构造方法实现父类构造方法的调用:

class Person{
    public Person(){
        System.out.println("Person的构造方法");
    }
}
class Student extends Person{
    private String name;
    private int age;
    public Student(){
        super();
        this.name = "张三";
        this.age = 18;
    }
}

这段代码中的构造方法实现了父类构造方法的调用,即在创建Student实例之前,会先调用其父类的构造方法,即Person的构造方法。继承相关的知识我们会在后面讲到。


因此,构造方法是java编程中非常重要的组成部分,它可以实现对象的初始化,并且可以实现类的重载,支持多种构造方法,满足不同的需求。


还有一点就是上一节遇到的,如果你写了有参构造,就要显示定义无参构造方法。这是因为当程序运行时,会调用类中的构造函数,如果有参构造函数被定义,但是没有定义无参构造函数,那么程序就无法正常运行,因为它不知道如何去调用构造函数,从而导致程序运行出错。


所以程序强制要求你显示定义无参构造方法。


咱们再缕一缕:


-Java写个带参的构造方法,那默认的无参的就必须再显示写一个,但这是为什么呢?


-很简单


-jvm会在语义分析过程中来为没有构造函数的类搭建构造函数。


-如果有构造函数的话就不会自己默认搭建构造函数。


-如果设置了无论是否有构造函数都写构造函数


-那就有一个问题,如果已经有一个无参构造函数了,再构造一个,到时候调用哪个呢?


也就是说当一个类你没有给他构造函数,则编译器会自动补上一个无参的,若有的话就不会,你需要显示将此无参的构造函数写出来。这是编译器帮你做的,防止你忘了写无参构造函数,没什么好纠结的,记住就行了。


2.this关键字

this是java中的一个关键字,它代表当前对象的引用,它可以在构造方法、普通方法中使用。尤其在构造方法中可以指定某个属性,可以避免类的属性构造方法参数重名的尴尬。

例如:

public class Person { 
  private String name; 
  private int age;
  public Person(){
    this.name="张三"; //使用this关键字来引用name变量
    this.age=18; //使用this关键字来引用age变量 
  }
}

this关键字还有一个作用,就是在构造方法中调用另一个构造方法。注意,你不能在普通方法里面调用构造方法。只能在构造方法中用this去调用另一个构造方法。

public class Person {
    private String name;
    private int age;
    public Person(){
        this.name="张三"; //使用this关键字来引用name变量
        this.age=18; //使用this关键字来引用age变量 
    }
    //重载1
    public Person(String name){
        this.name = name;
    }
    //重载2
    public Person(String name,int age){
        this(name); //根据参数的类型和格式,会自动地去匹配对应地重载构造方法
        this.age = age;
    }
}

为了方便测试,我们用idea生成一下toString方法:

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

测试:

public class TestPerson {
    public static void main(String[] args) {
        Person p = new Person("jack",18);
        System.out.println(p);
    }
}

结果:

Person{name='jack', age=18}

this还可以用来在普通方法中调用属性和其他普通方法。


3.课后作业

又到课后练习啦,这一节比比较重要,大家不要偷懒,一定要把习题做一做哦!


创建一个汽车类Car,拥有品牌brand和颜色color两个属性。分别用带参构造器和无参构造器来实例化Car类,并编写toString方法。再写一个测试类,在测试类的main方法中进行测试。


顺便附上上一节的答案,题目是:


设计一个宠物类Pet,构造方法用于接收宠物的名字、类型及性别,实例化宠物后,可以用实例化的宠物对象来访问宠物的名字、类型及性别,并实现宠物的叫声功能,要求叫声不同类型的宠物不同,实现叫声时可以显示出宠物的名字和类型。


参考答案:

public class Pet {
    private String name;//宠物名字
    private String type;//宠物类型
    private String gender;//宠物性别
    public Pet(String name, String type, String gender) {
        this.name = name;
        this.type = type;
        this.gender = gender;
    }
    //获取宠物名字
    public String getName() {
        return name;
    }
    //获取宠物类型
    public String getType() {
        return type;
    }
    //获取宠物性别
    public String getGender() {
        return gender;
    }
    //宠物叫声
    public void cry() {
        if (type.equals("dog")) {
            System.out.println(name + ": 汪汪汪");
        } else if (type.equals("cat")) {
            System.out.println(name + ": 喵喵喵");
        } else {
            System.out.println("叫声未知");
        }
    }
}

有任何不懂的地方,可以点击下方的“发消息”给我留言。

PS:从这一节开始,欢迎你使用任何你喜欢的IDE完成作业,比如eclipse,IDEA,如果不会使用工具,可以去B站搜索相关的视频进行学习哈。

49a475193463a774fee5e1b72a2af174.gif




相关文章
|
3月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
157 1
|
3月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
137 0
|
4月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
5月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
7月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
145 12
|
7月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
177 0
|
9月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
131 1
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
129 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
253 2