【一步一步了解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()必须在当前构造方法的第一个语句,否则就会报错。

目录
相关文章
|
17天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
14天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
37 17
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
49 4
|
20天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
11天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
15天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
19天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
19天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。