【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




相关文章
|
21天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
14 2
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
2月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
1月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
17 0
|
2月前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
57 2
|
2月前
|
Java 开发者
Java 面向对象
Java 是一种面向对象的编程语言,通过对象与类的概念组织代码和数据。面向对象编程的核心包括类、对象、继承、多态、封装和抽象。类是对象的蓝图,定义了属性和行为;对象则是类的实例。继承允许子类继承父类的属性和方法,增强代码复用性;多态则支持通过相同接口调用不同类型对象的行为,包括方法重载和重写。封装通过公共方法隐藏对象细节,提高安全性;抽象则对对象特征进行提炼,通过抽象类和接口实现。理解这些概念有助于设计高效、可维护的 Java 应用程序。
|
3月前
|
Java 开发者 C++
|
2月前
|
Java 开发者
Java编程之旅:探索面向对象的力量
【9月更文挑战第16天】在编程的世界中,Java以其强大的面向对象编程特性而闻名。本文将带你走进Java的世界,一起探索类与对象的奥秘,学习如何通过封装、继承和多态性构建健壮的软件系统。无论你是初学者还是有经验的开发者,本文都旨在提供实用的代码示例,帮助你提升Java技能。准备好开始这段旅程了吗?让我们启程吧!
|
3月前
|
存储 Java 数据库连接
Java编程之旅:从基础到高级,探索面向对象的力量
【8月更文挑战第31天】本文是一篇深入浅出的Java编程指南,旨在通过生动的例子和实际代码演示,带领读者从Java的基础语法起步,逐步深入到面向对象的核心概念,最后探讨如何在实际项目中应用这些知识。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和实用的技巧。