Java05——对象和类、this

242 阅读6分钟

1、类的简述

:类是一个模板,它描述一类对象的行为和状态。例如:狗这一类

对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

image.png

下图中汽车类(class) ,而具体的每辆车为该汽车类的对象(object) ,对象包含了汽车的颜色、品牌、名称等。

2、Java 中的类与对象

一个源文件中只能有一个public类。一个源文件可以有多个非public类。

源文件的名称应该和public类的类名保持一致

2.1 对象的创建与使用

在Java程序中可以使用new关键字来创建对象,具体格式如下: 类名 对象名称 = new 类型()

例如,创建一个Person对象,具体示例如下:Person p1 = new Person()

  • new Person():用于创建Person类的一个实例对象
  • Person p 则是声明了一个Person类型的变量p
  • 中间的等号用于将Person对象在内存中的地址赋值给变量p,这样变量p便持有了对象的引用
  • 变量p和对象之间的引用关系如下图所示

image.png

在实例化后,可以通过打点调用对象所有的成员,格式如:实例化对象.对象成员

// 定义一个人类
public class class_demo1{
    // 入口主函数
    public static void main(String[] args) {

        Person p1 = new Person();
        Person p2 = new Person();   // 可以创建多个实例化对象

        p1.age = 18;
        p1.sex = 'm';
        p1.speak();     // 调用p1实例化对象上的speak方法

        System.out.println(p1.age); // 18
        System.out.println(p2.age); // 0
    }

}


// 定义一个person人类
class Person{
    int age;  // 声明一个年龄的属性  --> 成员变量
    char sex;   // 声明一个性别的属性

    void speak(){   // 定义普通方法 无返回值   --> 成员方法
        if(sex == 'm'){
            System.out.println("大家好,我是男生,今年" + age + "岁!");
        }else{
            System.out.println("大家好,我是女生,今年" + age + "岁!");
        }
    }
}

2.2 类的封装

类的封装是指在定义一个类时,进行下列操作:

  • (1)将类中的属性私有化,即使用private修饰属性
  • (2)在类中提供公用的可以获取属性值的getXxx方法
  • (3)在类中提供公用的可以设置属性值的setXxx方法

2.3 变量

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型

一个类可以拥有多个方法,在上面的例子中:eat()、run() 都是 Dog 类的方法。

3、构造方法

3.1 简述

1、每个类都至少有一个构造方法,如果在一个类中没有显式定义构造方法,java会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。

2、如果一个类中定义了构造方法,系统就不再提供默认的构造方法了,构造方法可支持传参

3、构造方法的执行时机:构造方法在实例化的时候自动执行

3.2 构造方法的定义

在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:

  1. 方法名和类名相同(一个类可以有多个构造方法)

  2. 方法名的前面没有返回值类型的声明

  3. 方法中不能使用return语句返回一个值

下面是一个构造方法示例:

public class Puppy{ 
    public Puppy(){  // 显示写出构造函数  -- 不传参
    
    } 
    public Puppy(String name){  // 显示写出构造函数 -- 传参
    // 这个构造器仅有一个参数:name 
    } 
}

在Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种(default、private、public、protected)不同的访问权限。

3.3 构造方法的重载

  • 和普通方法一样,构造方法也可以重载
  • 在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。
  • 在创建对象时,可以通过调用不同的构造方法为不同的属性赋值

一句话:重载就是可以写很多个同名函数,但是参数不能相同

4、this

4.1、通过this关键字可以明确地去访问一个类的成员变量,解决与局部变量名称冲突的问题,具体示例如下:

public class myThis{
    int age;  // 成员变量

    // 构造方法 自动执行 构造方法中可以使用this 和es6中的class一样
    public myThis(int age){     // 参数被定义为age,它是一个局部变量
        this.age = age;         // this.age  是访问成员变量

    }

    public static void main(String[] args) {

        // 实例化
        myThis mt = new myThis(100);
        System.out.println(mt.age); // 100
        
    }

}

4.2、通过this关键字调用成员方法

public class myThis{

    // speak函数
    public void speak(){
        System.out.println("我会说");
    }

    // openMouth函数
    public void sleep(){
        System.out.println("我能睡");
        this.speak();
    }

    public static void main(String[] args) {

        // 实例化
        myThis mt = new myThis();
        mt.sleep();
    }

}
// --> 我能睡 我能说

当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。

class Demo {
    String str = "200,****这是成员变量";

    void fun(String str) {
        System.out.println(str);    // 100,---这是局部变量
        System.out.println(this.str);   // 200,****这是成员变量
        this.str = str;
        System.out.println(this.str);   // 100,---这是局部变量
    }
}

public class demo1 {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.fun("100,---这是局部变量");
    }
}

4.3、构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其它方法一样去调用构造方法,但可以在一个构造方法中使用“this([参数1,参数2…])”的形式来调用其它的构造方法。

4.4 其他注意事项

  • 只能在构造方法中使用this调用其它的构造方法
  • 在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次,下面的写法是非法的。
  • 不能在一个类的两个构造方法中使用this互相调用
public class myThis{
    public myThis(int age){    // 参数为int的构造方法
        this("涵涵涵"); // 调用myThis(String xxx) 构造方法
    }

    public myThis(String name){
        System.out.println(name);
    }

    public static void main(String[] args) {

        // 实例化
        myThis mt = new myThis(100);
    }
}

// --> 涵涵涵