JAVA-----初识类与对象

徐子童 2024-06-15 15:05:09 阅读 77

Java是一门纯面向对象的语言。在面向对象的世界中,一切皆为对象。面向对象是一种解决问题的思想,主要依靠对象之间的相互交互来解决事情。用面向对象的思想设计代码,程序更符合当今人们对事物的认知,对大型程序和大型工程都非常友好。

1.什么是面向对象

我们举生活中的例子-------洗衣服。

传统的洗衣服方式如下图所示

7a61e69728fc46dd914d0fc64b9f4f08.png

如果我们按照上图的方式洗衣服,我们每一个步骤都是要参与的,类似以上的解题的思想就是我们平常所说的面向过程。 

但是现在我们有了洗衣机。

efafead3b3f1433c83c844f3e2c62e6a.png

我们洗衣服的方式如上图所示,我们只要将衣服和洗衣粉放进洗衣机里面去,然后洗衣的操作我们就交给洗衣机就行了,我们没必要了解洗衣机是如何进行洗衣服的,这就是类似于面向对象的思路。

 面向对象就是关注对象,关注对象与对象之间的交互。每个对象都有自己的操作,例如上面的洗衣机,Actor也是一个对象,他负责的操作是将衣服和洗衣粉放进洗衣机就行了,洗衣机没必要知道我们是如何将衣服和洗衣粉丢进去的。洗衣机也是一个对象,它只负责将衣服洗干净,而我们不需要知道洗衣机是如何将衣服洗干净的。

2.类的定义和使用

2.1 简单认识类

类是对一个实体(对象)的特征、属性和行为的集合。不过在Java中,我们习惯将定义在类中的特征和属性称为成员变量(成员变量也称为字段),定义在类中的行为我们称之为成员方法

2.2 类的定义格式

在JAVA中定义类需要用到class关键字,具体语法格式如下

// 创建类 class ClassName{ field; // 字段(属性) 或者 成员变量 method; // 行为 或者 成员方法 }

ClassName为类的名字,field为成员变量,method为成员方法。

举例说明

class Student1{ public String name;//学生名字 public int age;//学生年龄 public String stuNum;//学生学号 //定义学生行为的成员方法 public void eat(){ System.out.println(name+"在吃饭"); } public void Do(){ System.out.println(name+"在做作业"); }}

注意事项:类名一般采用大驼峰的设计,即每个单词的首字母要大写。 

3.类的实例化

3.1什么是实例化

我们定义了一个类,就相当于我们在计算机创建了一个新的变量类型,我们根据自己定义的类建立变量,也称为对象。

所以类的实例化是指我们根据类类型创建对象的过程类的实例化要用到new关键字

实例化的语法格式

类名 对象名=new 类名();

举例

class Student1{ public String name;//学生名字 public int age;//学生年龄 public String stuNum;//学生学号 //定义学生行为的成员方法 public void eat(){ System.out.println(name+"在吃饭"); } public void Do(){ System.out.println(name+"在做作业"); } public void Print(){ System.out.print(name+" "+age+" "+stuNum+" " ); }}public class Demo08 { public static void main(String[] args) { Student1 stu1=new Student1();//实例化对象 stu1.name="zhanfsan"; stu1.age=18; stu1.stuNum="1234"; stu1.Print(); System.out.println(); stu1.eat(); stu1.Do(); }}

注意事项:

1.new关键字用于创建一个对象。

2.可以用 . 来访问类中的属性并为其赋值,也可以用 . 访问类中的方法。 

3.一个类可以创建多个对象。

3.2 类与对象的说明

简单来说类只是一种抽象的说明,就像是对象的蓝图,而根据类实例化出来的对象是具有物理意义的,是实际存在的。

4.this引用

4.1 为什么要有this引用

将这个之前,我们先来看一道题。

class Student1{ public String name;//学生名字 public int age;//学生年龄 public String stuNum;//学生学号 public void Print(){ System.out.print("name:"+name+" "+"age:"+age+" "+"stuNum:"+stuNum+" " ); } public void setStudent(String name,int age,String stuNum){ name=name; age=age; stuNum=stuNum; }}public class Demo08 { public static void main(String[] args) { Student1 stu1=new Student1(); stu1.setStudent("zhangsan",18,"1234"); stu1.Print(); }}

运行代码

831aba8469ed429ba9ec5a34edf0e345.png

我们发现name,age,stuNum并没有赋值,我们明明在调用setStudent函数的时候已经将要的值传过去了,为什么还是没有成功赋值呢?

原因很简单:

因为我们没有使用this关键字。我们没有使用this关键字的时候,在调用setStudent的时候,name,age和stuNum都是局部变量且由于成员变量和局部变量同名,在函数中,我们优先使用局部变量。所以这时候我们就是局部变量给局部变量自己赋值,而没有给成员变量赋值,而调用Print函数的时候我们打印的是成员变量的值,我们之前给成员变量赋值不成功,自然而然打印的是成员变量对应的默认值了 。

解决方案:

既然我们想给成员变量赋值,那我们就用一个关键字明确指定其是成员变量,而this关键字就起到访问成员变量的作用。

修改如下

class Student1{ public String name;//学生名字 public int age;//学生年龄 public String stuNum;//学生学号 public void Print(){ System.out.print("name:"+this.name+"\n"+""+"age:"+this.age+"\n"+""+"stuNum:"+this.stuNum+" " ); } public void setStudent(String name,int age,String stuNum){ this.name=name; this.age=age; this.stuNum=stuNum; }}public class Demo08 { public static void main(String[] args) { Student1 stu1=new Student1(); stu1.setStudent("zhangsan",18,"1234"); stu1.Print(); }}

运行代码

e104a085a9cf41719182cd9b047b32c4.png

我们发现我们成功给成员变量赋值了。

4.2 什么是this引用 

 this引用指向当前对象,及指定成员变量,我们在成员方法中使用this关键字,可以明确指定的是成员变量。在成员方法中所有对成员变量的操作都是通过this关键字实现的。

4.3 this引用的特性

1.this引用类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。

2.this关键字只能在成员方法中使用。

3.在成员方法中,只能调用当前对象,不能调用其他对象。

4.this引用其实是成员方法中隐藏的的第一个参数,不写也是可以的,编译器会自动传递。在使用成员方法时,编译器会将调用该成员方法的对象的引用自动传给该成员方法,this关键字来接收。

如下图

971e4721330e4683bb1892f9564677d7.jpeg

5.this关键字不能在静态的方法中使用。 

4.4 总结

1.this关键字可以用来调用成员变量。

2.this关键字可以用来调用成员方法。

3.this关键字可以用来调用构造方法

接下来,就向大家介绍什么是构造方法。

5. 构造方法

我们之前给成员变量进行初始化时,每次都要在类中定义一个成员方法,并且通过对象来调用这个成员方法,每次初始化都这样,我们会觉得麻烦,有没有方便的初始化方法呢?答案就是构造方法。

5.1 什么是构造方法

构造方法(也称为构造器)是一个特殊的成员方法,且构造方法的名字必须要与类名相同。构造函数是在对象构建的同时又编译器自动调用的,一个对象只能调用一次构造函数。

class Date{ int year; int month; int day; public Date(){} //一个无参的构造函数}public class Test { public static void main(String[] args) { Date date1=new Date(); }}

上面就是一个使用了一个无参的构造方法的例子,这时看不懂也没关系,后面我会向大家一 一介绍。 

5.2 构造方法的特性

1.构造方法的名字必须与类名相同。

字面意义,构造方法的名字必须要和类名相同,否则会报错。

如下图所示

293dc0a9ea564bfb979ab288c7e9c49c.png

2.构造方法没有返回值类型,设置成void类型也不行。

因为加上一个返回值类型,他就不是一个构造函数,而是一个普通的成员方法。 

3.在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。

这句化有点难理解,我们慢慢来分析。

Date date1=new Date();

 我们看到以上代码,虽然这一段代码简单,但是背后编译器为其做了不少的准备工作。

当我们写下这行代码时,编译器首先会为我们创建的对象分配内存,然后在自动得调用合适的构造方法

(注意事项:一个类中可以有多个构造方法,构成了构造方法的重载。)

自动得调用合适构造方法是什么意思呢?

class Student{ int age; String name; //无参构造方法 public Student(){ System.out.println("调用了无参构造方法"); } //有参构造方法 public Student(int age,String name){ this.age=age; this.name=name; System.out.println("调用了有参构造方法"); System.out.println("年龄:"+this.age+" "+"name:"+this.name); }}public class Test { public static void main(String[] args) { Student stu1=new Student(); Student stu2=new Student(10,"zhangsan"); }}

如以上代码,,在类中定义了两个构造方法,分别为有参构造方法和无参构造方法。我们分别创建了stu1和stu2两个对象。

我们先来看stu1,我们在创建stu1的时候,并没有为其传参,所以编译器编译 Student stu1=new Student();这段代码时,会根据参数的无参情况来调用类中的无参构造方法。

再来看stu2,我们在创建stu2的时候,为其传了两个参数,编译器会根据参数的情况调用了类中的有参构造方法。并在这个构造方法中我们完成了对成员变量的初始化。

我们运行代码,发现和我们分析的一样。

75d6d96bb94d4eec93ec171193334974.png

5.3 默认的构造方法

当我们没有在类中写构造方法时,编译器会默认有一个无参的构造方法,如果我们在这一个类中写了任何一种构造方法,编译器就不会自动的提供默认的构造方法了。

5.4 this关键字调用构造方法

前面我们了解了构造方法,我们就可以容易了解这个知识点了。

简单来说,我们可以用this关键字在构造方法中调用另一个构造方法。

class Student{ int age; String name; public Student(){ System.out.println("调用了无参构造方法"); } public Student(int age,String name){ this();//用this调用了无参构造方法 this.age=age; this.name=name; System.out.println("调用了有参构造方法"); }}public class Test { public static void main(String[] args) { Student stu2=new Student(10,"zhangsan"); }}

运行代码

c3fa194911e843f68162a6f757207098.png

注意事项:我们在用this关键字调用构造方法时,不能成环。

class Student{ int age; String name; public Student(){ this(age,name); System.out.println("调用了无参构造方法"); } public Student(int age,String name){ this();//用this调用了无参构造方法 this.age=age; this.name=name; System.out.println("调用了有参构造方法"); }}public class Test { public static void main(String[] args) { Student stu2=new Student(10,"zhangsn"); }}

如以上代码,我们在有参构造方法中用了this()来调用了无参构造方法,我们又在无参构造方法中用this(age,name);调用了 有参的构造方法,这样不就成环了,这样在Java是不允许的。

讲到这里就结束了,谢谢观看。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。