【一步一步了解Java系列】:类与对象的联系

简介: 【一步一步了解Java系列】:类与对象的联系

看到这句话的时候证明:此刻你我都在努力

加油陌生人 1.png

对象

Java中的对象是什么呢?显然不是我们现实生活中的对象。

emmm,在Java中有这么一句话,Java中任何东西皆可为对象,猫,狗,人,猴,洗衣机,手机,电脑,键盘等等。

Java中是一个面向对象的语言,对比C语言有什么不同呢?

我们举一个简单的例子,现在我们要用代码写出一个求阶乘的方法,C语言中叫函数,Java叫方法.。

C语言:C语言中会直接写出一个函数这个函数就是求阶乘的代码作为一个函数。

Java:首先他会先找一个对象,比如上方中是谁要求阶乘,比如要求阶乘的是学生,那么我们就要创建一个学生的对象,然后这个对象要干嘛,他要求阶乘,那么我们这时候就要给这个对象创建方法。这个方法就叫做:成员方法。

上面是一个简单的例子来简单展现C语言与Java的不同,当然可能有人就会问那我该怎么创建对象呢?

那么接下来登场的就是Java中的类。

类是用来描述一个对象的,对象是一个真正存在的实体。想要运用好类这个语法。我们就需要完成这么几个步骤:


  1. 根据事件找到对象。
  2. 对象存在着什么变量。
  3. 变量要完成什么事件。
  4. 根据这些创建成员变量和成员方法。

注意:我们一般建议一个文件建一个类。

那么接下来就通过举例来让大家更好的理解上面的知识点。

public class Dog {
    int age;
    String name;
    public static void eat(){
        System.out.println("吃狗粮");
    }
     public static void speak(){
        System.out.println("狗叫");
}
}


如上就是我定义的一个类,这个类是用来描述一只狗的。这里面的成员变量有,age年龄,还有名字name,然后还有两个成员变量,当然这个 对象还未进行实例化。那么什么叫实例化呢?

对象的实例化

对象的实例化就是由类生成对象的过程叫做实例化。那么具体的代码实现是怎么样的呢?

public class Dog {
    int age;
    String name;
    public static void eat(){
        System.out.println("吃狗粮");
    }
     public static void speak(){
        System.out.println("狗叫");

}

    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.age=2;
        dog.name="旺财";
        dog.speak();
        dog.eat();
        System.out.println(dog.age);
        System.out.println(dog.name);

    }
}

在上面的代码中 Dog dog=new Dog(); //对象的实例化,这条代码就是对象实例化的代码。这就是我们常说的new一个对象。


对象实例化后我们就可以通过”.“,操作符对,对象中的成员变量和成员方法进行赋值或调用方法。

当然大家可能就会好奇,如果我不给对象的成员变量进行赋值那么他会输出什么?其实如果不进行赋值那么它会默认给各种类型的数据的对应的”0值“,什么叫做各自的0值呢?那么我们就可以看下图了。


注意:局部变量在使用前必须要初始化,而成员变量可以不初始化。


this关键字

为了更好的理解this关键字,我们先抛出一段代码。

public class Student {
    String name;

    public void setName(String a) {
        name = a;
    }


    public static void main(String[] args) {
        Student stu1=new Student();
        Student stu2=new Student();
        Student stu3=new Student();
        
        stu1.setName("小明");        
        stu2.setName("小李");        
        stu3.setName("小刚");        
    }
}


在上方代码中我们定义了一个Student类,然后里面的成员变量有名字,那么我们还定义了一个成员方法setName,然后我们在main方法中实例化了3个对象,然后我们调用了setName方法,给每个对象起个名字。

我们先看一下结果


结果也是我们所期盼的结果了。可是我们想象一下,在setName中我们里面的赋值语句中有这么一条语句name=a;那么编译器在三个对象调用方法时是如何分辨出给对应的name赋值呢?其实这就说明每个对象调用方法就会给其成员变量给赋值。那么如果我们把setName设置成这样呢?name=name;

public class Student {
    String name;

    public void setName(String name) {
        
        name = name;
    }


    public static void main(String[] args) {
        Student stu1=new Student();
        Student stu2=new Student();
        Student stu3=new Student();

        stu1.setName("小明");
        stu2.setName("小李");
        stu3.setName("小刚");


        System.out.println(stu1.name);
        System.out.println(stu2.name);
        System.out.println(stu3.name);
    }
}

我们看一下结果

很显然此时setName里并未给成员变量name赋到值,打印出null是因为String对应的0值为null。那我们如果要解决这个问题,我们就需要用到this关键字。

public void setName(String name) {

    this.name = name;
}


只要加上this后代码就会知道this.name指的是对象的name,单单一个name就是成员变量的name,这样就可以正确的赋值方法。那this的本质是什么呢?

其实这个this就是你所调用的对象。用代码表示的话就是:

public void setName(Student this,String name) {

    this.name = name;
}

这里的形参就会多加一个this。那么肯定就会有人问了,我也没给setName里传对象,没有实参的1传入啊?

其实这个传参编译器已经会自动帮我们传参,只不过都会省略掉了而已。


构造方法

在Java中,构造方法是一种特殊的方法,它用于在创建对象时初始化对象的状态。构造方法具有以下特点:


名称与类名相同:构造方法的名称必须与类名完全相同,包括大小写。

没有返回类型:构造方法没有返回值,即使是void也没有。

自动调用:当使用new关键字创建对象时,构造方法会自动被调用,用于初始化对象。

可以有多个:一个类可以有多个构造方法,只要它们的参数列表不同(参数的数量或类型不同)。

不能被继承:构造方法不会被继承,即子类不会继承父类的构造方法。

不能直接调用:不能通过对象调用构造方法,它们是在对象创建时自动调用的。

如果我们没有自己定义构造方法则Java中会自动给我们构造一个空的构造方法。这个构造方法会省略掉我们是看不见的,但是他确实存在。


下面是一个简单的Java类示例,其中包含了一个构造方法:

public class Person {
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 其他方法
    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

// 使用构造方法创建对象
Person person = new Person("Alice", 30);
person.displayInfo();


在这个例子中,Person类有两个私有属性name和age。Person类有一个构造方法Person(String name, int age),它接受两个参数来初始化对象的状态。当创建一个新的Person对象时,必须提供这两个参数,并且构造方法会被自动调用来设置对象的初始状态。


this关键字可以在一个构造方法中调用其它构造方法,例如:

public class Dog {
    String name;
    public Dog(){
        System.out.println("调用了无参的构造的方法");
    }

    public Dog(String name){
        this();
        this.name=name;
        System.out.println("调用了有参的构造的方法");

    }

    public static void main(String[] args) {

        Dog dog=new Dog("旺财");
    }

}


如上:我们在调用有参的构造方法时,也会自动调用无参的构造方法,但要注意this()必须在当前构造方法的第一个语句,否则就会报错。

目录
相关文章
|
4天前
|
Java
颠覆认知:一向主张可扩展性的Java,为何要推出封闭类?
本文介绍了Java的Sealed Classes(封闭类)功能,探讨了为何Java在强调可扩展性的同时引入这一特性。文章基于JDK 17.0.5,详细解释了Sealed Classes的概念及其作用。通过对比final类和package-private类,阐述了封闭类在提高安全性和控制扩展性方面的优势。最后,通过具体示例展示了如何使用sealed关键字以及相关语法。了解这一新特性有助于我们更好地把握Java未来的发展趋势。
19 2
|
8天前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
|
1天前
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
19 7
|
2天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
22小时前
|
存储 Java 编译器
【一步一步了解Java系列】:认识异常类
【一步一步了解Java系列】:认识异常类
11 2
|
22小时前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
15 2
|
21小时前
|
算法 Java API
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
12 1
|
4天前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
12 1
|
5天前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
13 0
深入理解java对象的访问定位
|
5天前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
15 0
深入理解java对象的内存布局