java-类和对象

类和对象

一、初识面向对象

1.1什么是面向对象

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

1.2面向对象与面向过程

值得一说的是面向对象和面向过程都是解决问题的一种思想,并不特指某一种语言,因此它们并没有好坏之分,要根据具体问题选择最优的思想。

洗衣服问题

就拿洗衣服来举例:
传统洗衣
传统洗衣用手洗,具体步骤

拿盆
放水
放洗衣粉
放衣服
搓衣服
换水
漂洗
拧干
拧衣服

洗衣机洗衣

洗衣粉
洗衣机
衣服
洗衣机

两者一对比就可看出区别,传统洗衣注重过程,缺一个环节都不行,人们需要考虑如何将衣服洗干净、漂干净、如何拧干等,而用洗衣机洗衣服只用关注对象,即人、衣服粉、洗衣机,并不用去关心洗衣机内部是如何工作的,这就是面向过程和面向对象的区别。

二、认识类

作为计算机,它无法识别一个具体的对象,如洗衣机,它不知道这个东西是什么,更不知道它的属性、特点,因此我们需要用机器能懂的语言将这个对象描述出来,java就是一个很好的工具。

2.1如何描述一个具体对象

我们描述一个数字用整型,描述一个文字用字符型,描述一个小数用浮点型,那我们要如何描述一个人,一个动物等具体对象呢?
在java中,我们用类来描述一个具体对象,类就是类型,像整型、浮点型、字符型一样,只不过是自定义的类型。也就是说我们将一个具体对象抽象成一个类型,然后再对它进行描述。

2.2类的基本语法

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

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

ClassName是类的名称,一般采用大驼峰定义,{}里的是类的主体,包括属性即成员变量(用以描述类具有的特征)行为即成员方法(用来描述类的功能)。

2.2.1定义一个狗类

class Dog{
    public String name;
    public String color;//类的成员属性 小狗的属性
    public void barks(){
        System.out.println("小狗在汪汪叫");
    }
    public void eat(){
        System.out.println("小狗在吃饭");//类的成员方法 小狗的行为
    }
}

**注

  1. 一般一个文件当中只定义一个类
  2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  3. public修饰的类必须要和文件名相同
  4. 不要轻易去修改public修饰的类的名称,如果要修改,通过以下方法(右键文件–refactor file–rename)**

三、类的实例化

3.1什么是类的实例化

简而言之,就是通过自定义的类创建一个对象的过程
类相当于一个模版,一个类可以创建出多个对象,就像图纸一样,类只是构建出要建造什么样的房子,通过实例化之后,对象就占用实际的内存空间,即这栋房子就存在了。

3.2实例化

在java中通过new关键字来实例化对象

class Dog{
    public String name;
    public String color;
    public void barks(){
        System.out.println("小狗在汪汪叫");
    }
    public void eat(){
        System.out.println("小狗在吃饭");
    }
}
public class test {
    public static void main(String[] args) {
        Dog dog =new Dog();//通过new关键字实例化一个狗对象
    }
}

Dog dog = new Dog( );相当于这样假设地址为0x123

在这里插入图片描述

3.3对象的访问

要访问对象的成员变量或者成员方法,通过对象.成员变量或方法来访问
例:

//我们要访问上面狗类中的属性及方法
public class test {
    public static void main(String[] args) {
        Dog dog =new Dog();//通过new关键字实例化一个狗对象
        dog.name;
        dog.color;
        dog.barks;
        dog.eat;
    }
}
//然后再进行操作

四、this的用法

在定义类时,我们要习惯使用this关键字,比如以下代码

class Date{
    public int year;
    public int month;
    public int day;
    public void setDay(int x,int y,int z){
        year = x;
        month = y;
        day = z;
    }
    public void show(){
        System.out.println(year+"-"+month+"-"+day);
    }
}
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        date.setDay(2024,3,7);
        date.show();
    }
}
//执行结果:2024-3-7

但如果是另一种情况:

    public void setDay(int year,int month,int day){
        year = year;
        month = month;
        day = day;
    }
//执行结果:0-0-0

为什么会有这种情况呢?那是因为形参和成员变量名相同,就不知道该给谁赋值,这时候我们就可以用this

    public void setDay(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //执行结果:2024-3-7

那this是什么?简单来说,this就是对象的引用。**this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。**只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
上述代码加了this之后,前面的year就被指定为当前调用这个方法的对象的引用,这样赋值就不会出错了。
如果还不清楚,再看以下例子:
我们同时创建多个Date对象,并且同时调用setDay、show方法

public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();
        date1.setDay(2024,3,7);
        date1.show();
        date2.setDay(2024,3,8);
        date2.show();
        date3.setDay(2024,3,9);
        date3.show();
    }
}
//执行结果:2024-3-7;2024-3-8;2024-3-9

大家有没有想过,多个对象同时调用同一个方法,怎么识别给哪个对象进行赋值,我们来调试一下上述代码

在这里插入图片描述
date1调用时

在这里插入图片描述
date2调用时
在这里插入图片描述
date3调用时

在这里插入图片描述
三个对象的地址

所以,谁调用方法,this就是谁的引用

五、对象的初始化

对象的初始化有3种方式—就地初始化、对象引用初始化、构造方法初始化。

5.1就地初始化

class Dog{
    public String name ="花花";
    public String color ="白色";//在定义类时就给成员变量赋值
    public void barks(){
        System.out.println(name+"在汪汪叫");
    }
    public void eat(){
        System.out.println("小狗在吃饭");
    }
}
//代码写死了,之后创建的每个对象的属性值都是一样的

4.2对象的引用初始化

public class test {
    public static void main(String[] args) {
        Dog dog =new Dog();
        dog.name="花花";
        dog.color="白色";//通过对象.成员变量的方式来初始化对象
    }
}

五、构造方法

5.1概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,就是用来初始化对象的。在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

//语法
public 类名(参数列表){

}

5.2特性

1.必须有Public修饰
2.无返回值,void也不行
3.构造方法可以有多个,它们之间构成重载关系(参数列表不同,方法名相同)
4.没有写构造方法时,自动提供一个不带参数的构造方法,一旦写了构造方法,就不再提供,即使是不带参数的构造方法也要自己写

5.3用法

5.3.1对比局部变量及成员变量

大家都知道局部变量必须初识化,成员变量不用,因为当成员变量没有初始化的时候,会自动默认初始化成员变量,即给成员变量赋一个默认值

  • 数据类型 默认值
  • byte 0
  • char ‘\u0000’
  • short 0
  • int 0
  • long 0L
  • boolean false
  • float 0.0f
  • double 0.0
  • reference null
5.3.2调用构造方法
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 d = new Date(2024,3,7);//传参
}

此时我们有了一个带三个参数的构造方法,当我们再创建一个对象,不调用这个构造方法

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 d = new Date(2024,3,7);//传参
	Date d1 = new Date();
}

在这里插入图片描述

这是什么原因?在之前我们没有写任何构造函数的时候,Date d1 = new Date();这行代码是可以编译通过的。
这是因为当我们没有写任何构造函数时,会自动给我们提供一个不带参数的构造方法,例如这样

public class Date {
	public int year;
	public int month;
	public int day;
	//public Date() {

	}
public static void main(String[] args) {
	Date d1 = new Date();//调用默认的不带参数的构造方法
}

但是当我们写了任何一个构造方法时,系统将不再给我们提供不带参数的构造方法,所以我们要想让报错的代码编译通过就要自己写一个不带参数的构造方法。

5.3.3this调用构造方法

在构造方法中调用其他构造方法时要用this

public Date() {
	this(2024,3,7)//调用带三个参数的构造方法
}

注:this()调用构造方法,只能在构造方法中使用,不能自己调用自己,并且this()只能放在方法体的第一行(注释除外)

5.3.4对象的创建

对象的创建(实例化)包括两步开辟空间和调用合适的构造方法,调用合适的构造方法,就代表构造方法不止一个,因此构造方法之间构成了重载关系即方法与方法之间方法名要相同,参数列表不同,与返回值无关

六、总结

1.this的用法

  • this.调用成员变量及方法
  • this()调用构造方法

2.构造方法

  • 方法名与类名相同
  • 没有返回值 void也不行
  • 没写构造方法时,系统提供一个不带参数的构造方法,写了之后,系统将不会提供任何构造方法
  • 构造方法之间构成重载关系
  • 构造方法在类的生命周期中只调用一次,只在实例化对象时调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值