JAVA-SE-类和对象

目录

一,什么是面向对象

二,类的定义和实例化

2.1什么是类

2.2类的定义格式

2.3类的实例化

2.4类和对象的关系

三,this引用关键字

3.1 this的定义和使用

3.2 为什么要使用 this 

四,构造方法


一,什么是面向对象

从所周知,JAVA是一门面向对象的编程语言,那么什么是所谓的面向对象呢?打个比方,现在人们洗衣服,我们只需要将衣服和洗衣粉倒入洗衣机里,定个时就可以了,从面向对象的角度说,我们只关注人,衣服,洗衣粉,洗衣机这几个对象就可以了,不需要去探究这些对象是如何协作来完成洗衣服这件事情。这就是所谓的面向对象。(现在可能还是有点抽象,接着往下看!)

二,类的定义和实例化

2.1什么是类

类就是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。比如我们要描述一个狗,它的属性包括:名字,年龄,性别等等,它的‘ 功能 ’包括:会吃狗粮 ,会叫等等。

从描述来看,JAVA当中的类与C语言中的结构体十分类似,都是用来描述一个对象的特征,都可以用 类名(或结构名)+‘ . ’ 来访问成员变量 ,但是在JAVA中,类还可以描述一个对象的行为特征(往下看)。

2.2类的定义格式

在C语言中我们用 struct 关键字来定义一个结构体,而在JAVA中,我们用 class 关键字来定义一个类,我们用上面提到的狗来举例:

class Dog{
    /*
    先使用public,了解封装后就可以理解了
    这里的name,age,sex都是成员变量(也称字段)
     */
    public String name;
    public int age;
    public String sex;
    /*
    这里的eat,bark都是成员方法(也称行为)
     */
    public void eat(){
        System.out.println("吃狗粮!");
    }
    public void bark(){
        System.out.println("汪汪叫!");
    }
}

注意:JAVA中,类名一般使用大驼峰来定义(比如WashMachine),而方法一般使用小驼峰来定义(比如washMachine)。

2.3类的实例化

在JAVA中我们使用 new 来实例化一个对象,比如:

class Dog{
    
    public String name;
    public int age;
    public String sex;
    
    public void eat(){
        System.out.println(name + "吃狗粮!");
    }
    public void bark(){
        System.out.println(name + "汪汪叫!");
    }
}

public class Test {
    public static void main(String[] args) {
        // 同一个类可以创建多个对象
        Dog dog = new Dog();
        Dog dog1 = new Dog();
        /**
         * 我们可以通过 类名.方法名(或成员变量) 
         * 来访问创建对象的变量或方法
         */
        dog.name = "lisa";
        dog.age = 10;
        dog.eat();
        dog.bark();
        
    }
}

 我们再画图了解一下创建的实例所存储的位置:

2.4类和对象的关系

1. 类只是一个模型,用来对一个实体进行描述,限定了类有哪些成员.
2. 类是一种自定义的类型,可以用来定义变量.
3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
4. 打个比方类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

三,this引用关键字

3.1 this的定义和使用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。也就是说,我们可以通过 this.成员变量(或方法名)  在该类的方法中调用该类的成员变量和成员方法,举一个例子:

class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name + "吃粮食!");
    }
    public void get(String a, int b) {
       this.name = a;
       this.age = b;
       this.eat();
    }
}

注:this.成员变量(或方法名)  这种用法只能在该类的成员方法中使用!!!

了解了this引用的定义和使用,我想问一个问题“ 当我们实例化了多个对象, this引用是怎样判断它引用的是哪个对象成员方法和成员变量呢?”,其实我们在类中定义一个成员方法时,编译器会默认在第一个参数前面添加一个参数,即 类名+this ,我写了如下代码来方便理解:

class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name + "吃粮食!");
    }
    /**
     * 在该类中,
     * 编译器会自动添加 Animal this 这一参数
     * 这也解释为什么可以使用  this 
     */
    public void get(Animal this, String a, int b) {
       this.name = a;
       this.age = b;
       this.eat();
    }
}
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        /**
         * 当我们传参时,会将实例化对象animal传入
         * 因此我们可以通过  .号前面的内容来判断给谁赋值
         */
        animal.get("lisa",10);
        System.out.println(animal.name + animal.age);
    }
}

3.2 为什么要使用 this 

我们先来看看以下代码:

 答案明显不同,为什么会不同呢?因为第二种写法编译器无法区分左右两边的变量是实例化对象student的,还是参数的,所以默认两边都是参数,也就发生了参数自己给自己赋值,而我们最终要打印的是实例化对象student的成员变量,在我们调用的方法中成员变量没有被赋值,因此打印的是默认值。

为了防止第二种情况的发生,我们在JAVA中可以使用this来调用实例化对象的成员变量,例如:

 结论:为了防止出现以上情况,我们在调用成员变量时,最好在前面加上 this .

四,构造方法

构造方法是用来给实例化对象赋值的一种方法,构造方法名必须与类名相同,且构造方法没有返回类型,格式如下:

class Animal{
    public String name;
    public int age;
    //构造方法
    Animal(){
        System.out.println("1234");
    }
}

 当我们new一个对象时,一定会调用构造方法,也就是说每一类必须要有至少一个构造方法,细心的人可能会问,为什么上面的类当中没用构造方法也可以运行?那是因为如果没有定义构造方法,idea会自动添加一个无参的构造方法。

而当我们在一个类中写了多个构造方法,它们之间就会构成重载,例如:

class Student{
    public String name;
    public int age;
    public Student(String name){
        this.name = name;
    }
    public Student(int age){
        this.age = age;
    }
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
}

public class Test {
    public static void main(String[] args) {
        //调用一个参数的构造方法
        Student student1 = new Student("lisa");
        //调用两个参数的构造方法
        Student student2 = new Student("lisa", 10);
    }
}

补充一点:

this引用还可以在构造方法中以 this() 的形式使用,意为 调用本类中的其他构造方法,且this()必须放在构造方法的第一行,一个构造方法中只能有一个this(),例如:

class Student{
    public String name;
    public int age;
    public Student(String name){
        this(10);
        this.name = name;
    }
    public Student(int age){
        this.age = age;
    }
}


总结重点

this的三种用法:

1. this.成员变量 来访问当前对象的属性,只能在类的方法中使用。

2.this.方法名 来访问当前对象的方法,只能在类的方法中使用。

3.this() 访问当前类中其他的构造方法,只能在构造方法内部使用,必须放在第一行,也就是说只能使用一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一叶祇秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值