【Java基础】类和对象

类和对象



前言

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

本文源码:https://gitee.com/Bao__man/java-se/tree/master/Day7

一、什么是面向对象

对象是现实生活中的实体,以人举例,我们在对人进行描述的过程中,会通过人的特征:脸、鼻子、嘴巴等等部位进行一个具体的描述。起初,计算机并不认识这个人,而通过开发工作人员告诉计算机后,计算机对这一复杂事物进行抽象。

二、类的定义和使用

1.对类的认识

类是用来对一个实体(对象)来进行描述的,通过类描述该实体具有哪些属性(外观尺寸等),哪些功能,描述完成后计算机就可以进行识别。

2.类的定义

首先,我们在对类创建中,需要在src目录下新建一个Java类,在对类名进行命名过程中,我们采用大驼峰的形式进行命名。
在这里插入图片描述
接下来我们定义一个狗类 代码如下(示例):

 class Dog {
        public String name;
        public String color;
        public int age;
        public void bark(){
            System.out.println("狗叫");
        }
}

在上述代码中,我们定义了一个狗类。而对于name、color、age等变量,可以看到我们定义在方法之外类之内的,这种变量我们成为成员变量。同时,我也定义了一个方法bark,同样处于方法之外,类之内。我们称之为成员方法。
那么,我们知道Java中是不存在Dog类的,现在我们将这个类创建出来之后,我们就可以创建一个对应Dog的类。

3.类的实例化

创建实例化格式:类名 + 变量 = new + 类();

 Dog dog = new Dog();

通过new关键字+类名,我们成功创造出了属于我们自己定义的类型所产生的对象,而这个对象中存储的属性等数据我们将它放置在堆中。接下来这个对象实例,我们对他进行相应属性的定义和方法的使用。

	dog.name = "TK";
    dog.age = 10;
    dog.color = "黑色";
    dog.bark();

在这里插入图片描述
在我们创建好类之后,我们可以自由的创建对象,即同一个类可以创建多个实例。
**只要new就会产生新的对象,产生新的对象就会产生新的内存。**以狗类为例,你new了n个对象,我们可以认为你有了n条狗。

类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量.
  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  4. 类就像是设计图,并不存在实体。当对象产生的时候,这个类才具有了意义。

类的调用过程

从上文可知,在main方法中我们会创建一个新的对象。而这个对象是属于引用类型的,我们可以认为在对象实例化之后,我们在栈上存储了类似地址的哈希值,同时在JVM堆上存储了我们对该对象进行的定义。而这个“地址”则指向了这一对象。(如图)
在这里插入图片描述

this引用

首先,我们定义一个Date类

public int year;
    public int month;
    public int day;
    public void setDate(int year,int month,int day){
        //不加this 则局部变量优先 数值都为0
        year = year;
        month = month;
        day = day;
    }
    public void print(){
        System.out.println(year+"."+month+"."+day);
    }

我们在main方法中进行调用

 	Date date = new Date();
        date.setDate(1900,8,13);
        date.print();

在这时候我们运行之后会发现运行结果均为0。而这其中的原因,是因为Java中存在着局部变量优先的原则,在main方法调用执行这一方法的过程中,被Date中的成员变量顶替了。赋值的并不是对象中的变量。这其中的原因是当前变量和成员变量的名称相同
为了解决这一冲突,我们在变量前面加上this关键字。即

public void setDate(int year,int month,int day){
        //不加this 则局部变量优先 数值都为0
        this.year = year;
        this.month = month;
        this.day = day;
    }

在执行后我们发现代码能够顺利编译运行,this相当于是方法的第一个参数,被java隐藏了。
在对象使用this关键词之后,this参数会存储这一对象哈希值,从而进行锁定不会导致混乱。
那么接下来我们就可以进行多个对象的引用而不产生混乱了。
因此,this代表了当前对象的引用,谁调用了它谁就会进行引用。
this只能在成员方法引用,只能引用当前对象。

this.成员方法表示访问当前类的成员方法。
使用方式: this.func();

对象的构造和初始化

如何初始化对象

在前面的学习中我们知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败
如以下代码

public static void main(String[] args) {
int a;
System.out.println(a);
}

在这段代码中很明显是不能编译通过的,原因就是因为没有初始化,解决这个问题的方式很简单,就是对变量a进行初始化。即修改为 Int a = 0;

默认初始化

如果是对象,我们没有对变量进行初始化的话,是不会出现编译错误的问题的。

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

在上述代码中,我们没有像定义方法中的变量那样对变量进行初始化,但编译仍然可以通过。
这是因为Java自动帮我们设定了这些变量的基础值。这就是默认初始化
引用默认为null,整型默认为0,浮点型默认为0.0,Boolean型默认为false。**
感兴趣的同学可以运行以下代码

public String name;
public int age;
public double money;
public boolean flag;

就地初始化

与默认初始化不同的是,我们在定义成员变量之后直接对变量进行初始化。

public String name = "TK";
public int age = 20;
public double money = 11.2;
public boolean flag = true;

在执行以上代码时编译运行后的结果就是我们对这些变量的设定。这就是就地初始化。

对象的构造及初始化

构造方法时一种特殊的方法,此方法没有返回值。方法名和类名是一样的。

构造方法是与生俱来的

在一开始构造方法是不带参数的,我们可以通过下面的代码进行观察。

public Date(){
        this.year= 2008;
        this.month = 8;
        this.day = 9;
         System.out.println("调用了不带参数的构造方法");
    }
public static void main(String[] args) {
	Date date = new Date();
}

运行结果如图
在这里插入图片描述

在我们可以发现仅仅只是new了一个对象,构造方法自己调用了。因此,构造方法是在实例化对象的时候调用的。
在我们没有编写构造方法的时候,Java会自动提供一个不带参数的空的构造方法。
因此 构造方法是与生俱来的。

构造方法不止一个(重载)

话不多说,直接上代码。

public Date(int year,int month,int day){
        this.year =year;
        this.month =month;
        this.day = day;
        System.out.println("构成重写");
    }

    public Date(int year) {
        this.year = year;
    }

我们可以看到,两个方法名是相同的,但他们之间仍然可以编译通过。我们称这种方法为重载
重载的条件十分简单:方法名相同,同时存在参数数量、类型、顺序不同,这些元素只要符合其中一项,都可以构成重载关系。
当构造方法被创建了多种后,Java会根据你的编写调用符合条件的构造方法而不冲突。

Date date = new Date();
Date date4 = new Date(1000,8,13);

如果我们定义了一个构造方法,Java提供的空构造方法就会删除,此时需要我们自己手动添加不带参数的构造方法,否则编译器就会报错。
在这里插入图片描述

快速构造方法(快捷键 )

快捷键 alt + insert ----->construct --------->选中所需要的参数。

构造方法可以互相调用

public Date(){
//System.out.println(year); 注释取消掉,编译会失败
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调用带有三个参数的方法,实现快捷施法。
在此我们需要注意
(1)this(…)必须是构造方法中第一条语句
(2)不能形成环

总结

以上就是今天要讲的内容,类和对象是Java中的核心思想,是我们必须学会并理解的知识点。
相关源码放在 类和对象相关代码中,有兴趣的同学可以进行下载查看。也欢迎大佬进行指正。

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值