看到这句话的时候证明:此刻你我都在努力
加油陌生人
个人主页:Gu Gu Study
专栏:一步一步了解Java
喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹
喜欢的话可以点个赞谢谢了。
作者:小闭
对象
Java中的对象是什么呢?显然不是我们现实生活中的对象。
emmm,在Java中有这么一句话,Java中任何东西皆可为对象,猫,狗,人,猴,洗衣机,手机,电脑,键盘等等。
Java中是一个面向对象的语言,对比C语言有什么不同呢?
我们举一个简单的例子,现在我们要用代码写出一个求阶乘的方法,C语言中叫函数,Java叫方法.。
C语言:C语言中会直接写出一个函数这个函数就是求阶乘的代码作为一个函数。
Java:首先他会先找一个对象,比如上方中是谁要求阶乘,比如要求阶乘的是学生,那么我们就要创建一个学生的对象,然后这个对象要干嘛,他要求阶乘,那么我们这时候就要给这个对象创建方法。这个方法就叫做:成员方法。
上面是一个简单的例子来简单展现C语言与Java的不同,当然可能有人就会问那我该怎么创建对象呢?
那么接下来登场的就是Java中的类。
类
类是用来描述一个对象的,对象是一个真正存在的实体。想要运用好类这个语法。我们就需要完成这么几个步骤:
- 根据事件找到对象。
- 对象存在着什么变量。
- 变量要完成什么事件。
- 根据这些创建成员变量和成员方法。
注意:我们一般建议一个文件建一个类。
那么接下来就通过举例来让大家更好的理解上面的知识点。
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()必须在当前构造方法的第一个语句,否则就会报错。