类和对象(Java)(1)


一、关于面向对象

1.概念

Java是一门纯面向对象的语言,在面向对象世界里,一切皆为对象。面向对象时解决问题的一种思想,主要依靠对象之间的交互完成一件事情。

2.面向对象与面向过程

以传统和现代洗衣服的差别相比来举例:
传统洗衣:
注重过程,少了一个环节可能都不行,而且不同衣服洗的方式可能都不同,就会比较麻烦,按照这种方法来写代码,将来扩展或维护起来会比较麻烦。
现代洗衣服:
总共有四个对象:人、衣服、洗衣粉、洗衣机。
整个过程主要是人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机是如何具体洗衣服,如何甩干的。
以面向对象方式来进行处理,就不关注洗衣服的过程,只需要将衣服放进洗衣机,导入洗衣粉,启动开关即可,是通过对象之间的交互来完成的。

二、类定义和使用

类是用来对一个实体(对象)进行描述的。如果想要让计算机认识洗衣机,就需要将纸上的描述(头脑中的想法)采用某种计算机编程语言来给计算机进行描述。

1.类的定义格式

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

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

class为定义类的关键字,ClassName为类的名字,{}为类的主体。
类中包含的内容成为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,成为类的成员方法。
示例:

class WashMachine {
    public String brand;//品牌
    public String type;//型号
    public String color;//颜色
    public double weight;//重量
    public double length;//长
    public double width;//宽
    public double height;//高
    
    public void WashClothes(){   //洗衣服
        System.out.println("洗衣功能");
    }
    public void dryClothes(){    //脱水
        System.out.println("脱水功能");
    }
    public void SetTime(){      //定时
        System.out.println("定时功能");
    }
}

采用Java将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM基础上计算机就可以识别了。
注意事项:
1.类名注意采用大驼峰定义(这点最开始学习Java就已经说明)
2.成员前写法统一为public
3.此处写的方法不带static关键字

2.练习

1.定义一个狗类:

首先进行分析,狗的名字、毛发颜色是用来描述狗的,因此是这个类的成员变量,狗具有汪汪叫和摇尾巴的功能,所以类中包含这两个成员方法。
代码如下(示例):

class PetDog {
    public String name;//名字
    public String color;//颜色
    //狗的属性
    public void barks(){
        System.out.println(name+": 汪汪汪~~~");
    }
    //狗的行为
    public void wag(){
        System.out.println(name+": 摇尾巴~~~");
    }
}

2.定义一个学生类:
属性:姓名、性别、年龄、成绩
方法:来上课、写作业、要考试

public class Student {
    public String name;
    public String gender;
    public short age;
    public double score;
    
    public void DoClass();
    public void DoHomework();
    public void Exam();
}

注意事项:
1.一般一个文件夹中只定义一个类
2.main方法所在的类必须要使用public修饰
3.public修饰的类必须要和文件名相同
4.不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改。


三、类的实例化

1.什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类,他们都是类(用户自定义的一种新的类型——引用类型),有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
实际上类实例化对象就类似于利用图纸建造房子,类就相当于图纸,经过工人师傅的建造,就能建造出房子(对象)。
格式:
类名 对象名称 = new 类名();
下面以PetDog类作为一个例子进行实例化:来实例化两个对象分别为阿黄和赛虎。

public class Main {
    public static void main(String[] args){
        PetDog dogh=new PetDog();
        dogh.name="阿黄";
        dogh.color="黑黄";
        dogh.barks();
        dogh.wag();

        PetDog dogs=new PetDog();
        dogs.name="赛虎";
        dogs.color="棕色";
        dogs.barks();
        dogs.wag();
    }
}

对于dogh和dogs:我们不将其称为变量,更习惯将其称为对象。
运行结果:
在这里插入图片描述
注意事项:
1.new关键字用于创建一个对象的实例。
2.使用 . 来访问对象中的属性和方法。
3.同一个类可以创建多个实例。

2.类和对象的说明

1.类实际上就是用来对一个实体(对象)来进行描述的,限定了类有哪些成员,比如说明书、填表格。
2.类是一种自定义的类型,可以用来定义变量,但是在java中用类定义出来的变量我们称为对象。
3.一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,储存类成员变量。
4。打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
问题:·是先有类,还是先有对象呢?(类似于先有鸡还是先有蛋)
有说法是:先要有类,因为有了类之后才可以new对象,也有说法:先要有对象,然后才有类(一般出现在类抽象的阶段)。还是要看它的场景,都可以。

四、this引用

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(2021,9,11);
        d2.setDay(2021,9,12);
        d3.setDay(2021,9,13);

        //打印日期中的内容
        d1.printDate();
        d2.printDate();
        d3.printDate();
    }
}

以上代码中Main中我们创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印。
但是也会有疑问:
1.加入形参名不小心与成员变量名相同怎么办:那么函数体到底是谁给谁赋值,就会有四种情况:成员变量给成员变量,参数给参数,参数给成员变量,还是成员变量给参数。示例如下:

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

2.三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,那这两个函数是怎样知道打印的是那个对象的数据呢

2.什么是this引用

所以this引用存在的意义就是要让成员方法知道在操作哪个对象
java编译器给每个“成员方法”增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过这些所有的操作用户是看不到的,由编译器自动完成,用户在实现代码时一般不需要显示给出。
实际程序(不需要我们自动添加):

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引用的是调用成员方法的对象。
在这里插入图片描述
在这里插入图片描述

3.this引用的特性

1.this的类型:对应类类型引用,即那个对象引用就是那个对象的引用类型。
2.this只能在成员方法中使用。
3.在“成员方法”中,this只能引用当前对象,不能再引用其他对象,具有final属性
4.this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。
在这里插入图片描述

从字节码层面来简单证明(利用IDEA中的jclasslib查看字节码):
在这里插入图片描述

4.this引用有没有可能为空

Date d2=new null;
d2.printDate();

1.代码能否通过编译?
2.程序能否正常执行?
调试中出现问题:空指针异常
在这里插入图片描述
注意:在java当中,this引用一定不能为空。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dhdhdhdhg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值