Java基础篇_类和对象

目录

一、认识类和对象

1.1 面向对象的概念

1.2 面向对象与面向过程

1.3 类与对象

二、类的定义与实例化

2.1 类的定义

2.2 实例化的概念

三、this引用

3.1 this引用的作用

3.2 this引用的特性

四、对象的构造及初始化

4.1 默认初始化

4.2 就地初始化

4.3 构造方法

4.3.1 构造方法的概念

4.3.2 构造方法的快速实现

4.3.3 构造方法中的this引用

总结


一、认识类和对象

1.1 面向对象的概念

Java是一门纯面向对象的语言,简称OOP,在面向对象的世界里,一切皆为对象。面向对象是一种解决问题的思想,主要依靠对象之间的交互来完成想要的结果。

1.2 面向对象与面向过程

面向过程和面向对象并不是一门语言,而是解决问题的方法,没有好坏之分,都有其专门的应用场景。举个例子,面向对象类似于调用方法,我们只需知道有这个方法,并不需要知道这个方法具体是怎么实现的,而这个方法是怎么实现的,实现的过程就是面向过程所需要关心的。

1.3 类与对象

面向对象关注的是对象,而对象是现实生活中的实体。类是在描述对象,计算机本身并不认识对象,而我们需要在类中编写对象的各种特征,因为我们要通过类来告诉计算机对象是什么样子的,让计算机认识对象。 


二、类的定义与实例化

2.1 类的定义

在 Java 中定义类时需要用到 class 关键字,格式如下:

class ClassName {
field ;          // 成员变量
method ;    // 成员方法
}

注:class 为定义类的关键字,ClassName 为类的名字,{} 中为类的主体。

例如:在类中,我们需要定义一个对象的属性和成员方法来将对象具象化,例如,我们想定义一只宠物狗,那我们就需要在类中写出宠物狗的姓名,颜色等属性,以及宠物狗所会具有的行为等。

class Dog {
            public String name;//狗的名字
            public String color;//狗的颜色
            public int age;//狗的年龄
            // 狗的叫声
            public void barks() {
                System.out.println(name + ": 汪汪汪");
            }
            // 狗的行为
            public void wag() {
                System.out.println(name + "在摇尾巴");
            }
        }

不仅如此,我们还需注意的是,一个文件当中一般只定义一个类,以及 main 方法所在的类一般要使用 public 修饰,public 修饰的类必须要和文件名相同,不要轻易修改 public 修饰的类的名称。


2.2 实例化的概念

定义了一个类,就相当于在计算机中定义了一种新的类型,与 int、double 类似,不过 int 和 double 是 Java 中自带的内置类型,而类是用户自定义了一个新的类型,例如上文的 Dog 类。它们都是类,有了这些自定义的类型之后,就可以使用这些类来定义对象用类类型创建对象的过程,称为类的实例化在 Java 中采用 new 关键字,配合类名来实例化对象,同一个类可以创建多个实例,例如:

Dog dog1 = new Dog();
Dog dog2 = new Dog();

只要 new 就会产生新的对象,只要有新的对象,就会有新的内存,我们只需要通过对象的引用,去访问对象的成员变量或是成员方法,即可对宠物狗类进行具象化,具体是使用"."来访问对象中的属性和方法,例如

public static void main(String[] args) {
        
        //实例化对象
        Dog dog = new Dog();
        
        dog.name = "毛球";
        dog.age = 3;
        dog.color = "金色";

        System.out.println("姓名:" + dog.name);//姓名:毛球
        System.out.println("年龄:" + dog.age);//年龄:3
        System.out.println("颜色:" + dog.color);//颜色:金色

        dog.barks();//毛球: 汪汪汪
        dog.wag();//毛球在摇尾巴

        Dog dog = new Dog();
    }

三、this引用

3.1 this引用的作用

先来看一个打印日期的例子:

如上图,我们在打印日期的过程中,出现了 year = year 这种形参和成员变量名称一样的情况,由于局部变量优先使用,setDate 方法中进行的是形参赋值给形参,以至于最后输出全是0。此时就需要 this 引用来告诉编译器当前的 year 是对象的 year,代码如下:

    public int year;
    public int month;
    public int day;

    public void setDate(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);
    }

    public static void main(String[] args) {
        Date date = new Date();
        date.setDate(1999,9,9);
        date.printDate();//年:1999 月:9 日:9
    }

这样就可以成功将 setDate 方法中输入的日期赋值给成员变量。


3.2 this引用的特性

【this引用格式】

this.成员变量:访问成员变量

this.func():访问当前的成员方法

this():调用当前类的构造方法

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

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

2、this 只能在成员方法中使用。

3、成员方法中,this 只能引用当前对象,不能再引用其他对象。

4、this 成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收。


四、对象的构造及初始化

4.1 默认初始化

众所周知,局部变量不初始化就会报错,但是对象的成员变量不需要初始化,因为对象空间被申请好之后,对象中包含的成员已经设置好了初始值,其中各种数据类型的默认值如下图:

注:所有的引用类型,默认值都为null。


4.2 就地初始化

在声明成员变量时,就直接给出了初始值。若对象中成员变量未赋值,则会默认初始值为声明成员变量时的初始值。如下图中 date 对象并未给成员变量赋值,则输出是声明时的初始值。

    public int year = 1999;
    public int month = 9;
    public int day = 9;

    public void printDate() {
        System.out.println("年:" + this.year + " 月:" + this.month + " 日:" + day);
    }

    public static void main(String[] args) {
        Date date = new Date();
        date.printDate();//年:1999 月:9 日:9
    }

4.3 构造方法

4.3.1 构造方法的概念

构造方法是一个特殊的成员方法,该方法没有返回值,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次,构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

在我们实例化对象时编译器会自动调用合适的构造方法,构造方法至少有一个,当我们没有写任何构造方法时,编译器会生成一个不带参数的构造方法。所以,我们可以理解为对象的初始化一定会调用构造方法。同时,构造方法是可以重载实现的。(重载:① 其方法名必须相同,② 参数列表必须至少一个不同 (参数的个数不同、参数的类型不同、类型的次序不同),满足以上两个条件,即可构成重载)。

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 Date() {
        this.year = 1988;
        this.month = 8;
        this.day = 8;
    }

    public void printDate() {
        System.out.println("年:" + this.year + " 月:" + this.month + " 日:" + this.day);
    }

    public static void main(String[] args) {
        //实例化date时自动选择适合的构造方法
        Date date = new Date();//年:1988 月:8 日:8
        Date date1 = new Date(1999,9,9);//年:1999 月:9 日:9

        date.printDate();
        date1.printDate();
    }
}

注:一旦这个类提供了任何构造方法,编译器都不会再提供无参的构造方法。例如,上文中若将无参的构造方法注释,编译器就会报错,因为实例化 date 对象时,date 对象是无参的,没有适合 date 对象的构造方法给他调用。


4.3.2 构造方法的快速实现

在编写构造方法时,我们可以使用让编译器帮我们完成构造,使用快捷键 Alt+Insert 或点击鼠标右键,如下图:


4.3.3 构造方法中的this引用

看下方的例子,实例化 date 对象时,date 对象调用的是无参的构造方法,在无参的构造方法中并未对 date 对象中的成员进行初始化,但无参的构造方法中可以利用 this 引用来调用带三个参数的构造方法,从而实现初始化 date 对象中的成员,实现代码的简化

    //无参的构造方法    
    public Date() {
        /*this.year = 1988;
        this.month = 8;
        this.day = 8;*/
        this(1988,8,8);//调用带有三个参数的构造方法
    }

    //带有三个参数的构造方法
    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 date = new Date();
    }

注:在构造方法中调用构造方法,this引用必须在第一行,否则就会报错。 


总结

1同一个类可以创建多个实例。

2、this引用的是调用成员方法的对象。

3、构造方法没有返回值,名字必须与类名相同,并且在整个对象的生命周期内只调用一次。

4、一个类若提供了任何构造方法,编译器不会再提供无参的构造方法。

5、若要在构造方法中调用构造方法,this引用必须在第一行,否则就会报错。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值