JAVA——类与对象

1. 面向对象的初步认知

1.1. 什么是面向对象

       Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2. 面向对象编程与面向过程编程区别

 为帮助我们更好理解面向对象编程与面向过程编程的区别,我们简单举一个生活中的例子:

当我们洗衣服时,我们有两种选择,第一种是手洗:

 每个步骤都需要我们亲力亲为去完成,这种就类似于面向过程的思想

第二种就是用洗衣机洗:

第二种方式,人和洗衣机作为对象,人就不关注洗衣服的过程,具体洗衣机是怎么来洗衣服,如何来甩干的,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,这种就类似于面向对象的思路。

2.类的定义和使用

2.1. 简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该对象有哪些属性(成员变量),哪些功能(方法)。

那么在Java语言中,如何对上述的洗衣机类来进行定义呢?接着往下看

2.2. 如何定义类

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

class 为定义类的关键字  ClassName是类的名字

下面简单举个例子(创建一个学生类):

class Student{
    public String name;//成员变量或字段
    public int age;
    public float height;

    public void Eat(){//成员方法
        System.out.println("正在吃饭....");
    }
    public void Study(){
        System.out.println("正在学习....");
    }
}

上述的name,age,height都是来描述这个类的,称之为类的成员变量,方法Eat(),Study()是描述类的功能,称之为类的成员方法 。这样就定义好了一个学生类  

class Dog{
    public String name;

    public void Eat(){
        String food = "gouliang";
        System.out.println("正在吃"+food);
    }
}

成员变量是定义在方法外面,类的里面,所以上述代码中food只能是局部变量,不能是成员变量

注意事项:类名最好用大驼峰命名(如:WashMachine

3. 类的实例化

3.1 什么是类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的Student类。它们都是类(一种新定 义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。 用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "小豪";
        s1.age = 18;
        s1.height = 1.8f;
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println(s1.height);
        s1.Eat();
        s1.Study();
    }
}

输出结果:

实例化一个对象时要用到new关键字,格式为类名+对象名=new 类名(参数),实例化好一个对象后,我们可以通过对象名加 . 的方式去访问成员变量以及成员方法

3.2. 类和对象的说明

1.类是一个模板,它限制了对象有哪些成员和方法

2.类是自定义的新的类型

3.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

4.一个类可以实例化多个对象,并不是只能创建一个对象,就如同施工队能根据一张图纸修建多个房屋;类是图纸,不会实际的占用空间,而只有根据图纸修建好房屋(实例化好对象)才会实际占用空间

5. 类的成员变量未初始时,一般会有默认值,引用类型的默认值时null,基本数据类型的默认值是0,但局部变量使用前必须初始化

4.this引用

4.1为什么要有this引用

我们先看下面这个例子:

public class Date {
    public int year;
    public int month;
    public int day;

    public void setDay(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }

    public void printDate(){
        System.out.println(year + "/" + month + "/" + day);
    }

    public static void main(String[] args) {
        // 构造三个日期类型的对象 d1 d2 d3
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        // 对d1,d2,d3的日期设置
        d1.setDay(2020,9,15);
        d2.setDay(2020,9,16);
        d3.setDay(2020,9,17);
        // 打印日期中的内容
        d1.printDate();
        d2.printDate();
        d3.printDate();
    }
}

看了上述代码后,有两个问题

第一个问题:这么多对象都调用了serDay()方法,编译器是怎么区分是哪个对象调用的setDay()的方法中的year,month,day?

第二个问题:倘若形参名与成员变量名一样,形参只会给自己赋值,并不会改变成员变量的值

上述这两个问题的解决办法就是加上this关键字 

4.2 什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

public class Date {
 public int year;
 public int month;
 public int day;
 public void setDay(int year, int month, int day){
 this.year = year;
 this.month = month;
 this.day = day;
 }
 }
 public void printDate(){
 System.out.println(this.year + "/" + this.month + "/" + this.day);
 

this的注意事项:

1. this引用的是调用成员方法的对象

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

3. this只能在"成员方法"中使用

4. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

总的来说this的用法有三种:

1.可以通过this访问当前对象的成员变量

2.可以通过this访问当前对象的非静态成员方法

3.可以通过this访问当前对象的其他构造方法

什么是构造方法呢,我们接着看

5.构造方法

5.1. 构造方法的概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次,且构造方法一般情况下由public修饰

构造方法的格式如下:

public class Date{
    public int year;
    public int month;
    public int day;
    public Date(int year,int month,int day)//这是一个带参数的自定义的构造方法
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public static void main(String[] args) {
        Date date = new Date(2024,6,11);
    }
}

上述代码使用了带参数的构造方法的例子,所以我们能看出构造方法的作用就是给对象中的成员初始化

5.2 构造方法的特性

1. 名字必须与类名相同

2. 没有返回值类型,设置为void也不行

3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

5. 如果用户没有定义构造方法,编译器会默认生成一个无参数的构造方法,该方法会将引用数据默认为null,基本数据类型默认为0,若用户已经自己定义了构造方法,那编译器就不再提供默认的构造方法,只能使用自己定义的构造方法

6. 构造方法中,可以通过this调用其他构造方法来简化代码

public class Date {
    public int year;
    public int month;
    public int day;
    public Date(){
        this(1900, 1, 1);
        
        //this.year = 1900;
        //this.month = 1;
        //this.day = 1;
    }
 
    // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
 }

    无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
    此处可以在无参构造方法中通过this调用带有三个参数的构造方法
    但是this(1900,1,1);必须是构造方法中第一条语句,否则编译会失效

谢谢观看!

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值