欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础知识Day07--类与对象

程序员文章站 2024-03-15 18:32:42
...

Day07

1.1 类与对象

1.类:是一组相关属性行为**的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

  • 属性:就是该事物的状态信息。

  • 行为:就是该事物能够做什么。

举例:小猫。

属性:名字、体重、年龄、颜色。 行为:走、跑、叫。

2.对象:是一类事物的具体体现。对象是类的一个实例**,必须具备该类事物的属性和行为。

举例:一只小猫。

属性:小花、5kg、2 岁、橘猫。 行为:踩奶、撒娇、喵喵叫。

3.类与对象的关系

  • 类是对一类事物的描述,是抽象的。
  • 对象是一类事物的实例,是具体的
  • 类是对象的模板,对象是类的实体

1.2 类的定义

1.类的组成

成员变量:对应事物的属性。

成员方法:对应事物的行为。

2.类的定义格式

public class Student {
    //成员变量
    //成员方法
}
  • 定义类:定义类的成员,包括成员变量和成员方法。
  • 成员变量:同变量的定义,只是位置在类中,方法外
  • 成员方法:同方法的定义,只是要把static去掉

例如:定义一个学生类

public class Student {
    /**成员变量
     * 姓名
     * 年龄*/
    String name;
    int age;
    /**成员方法
     * 吃饭 public void eat(){}
     * 睡觉 public void sleep(){}
     * 学习 public void study(){}*/
    public void eat() {
        System.out.println("吃饭饭");
    }
    public void sleep() {
        System.out.println("睡觉觉");
    }
    public void study() {
        System.out.println("学习");
    }

1.3对象的创建

1.导包:也就是指出需要使用的类在什么位置。

  • 格式:import 包名称.类名称;

    例如:import nuc.edu.ss.day06.demo01.Student

  • 对于和当前类属于同一个包的情况,可以省略导包语句不写。

2.创建对象:

  • 格式:类名称 对象名 = new 类名称();

    例如:Student stu = new Studenr();

3.使用对象:

  • 使用成员变量:对象名.成员变量名;

    注意:如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。

  • 使用成员方法:对象名.成员方法名(参数);

想用谁就用对象名点谁。

1.4对象内存图

1.一个对象的内存图:

Java基础知识Day07--类与对象

2.两个对象使用同一个方法的内存图:

Java基础知识Day07--类与对象

3.两个引用指向同一个对象的内存图:

Java基础知识Day07--类与对象

1.5 使用对象类型作为方法的参数

  • 当一个对象作为参数,传递到方法当中时,实际传递进去的是对象的地址值。
    Java基础知识Day07--类与对象

1.6使用对象类型作为方法的返回值

返回值其实就是对象的地址值。
Java基础知识Day07--类与对象

1.7 局部变量和成员变量

public class Demo01Car {
    String color;//成员变量
    public void drive() {
        double speed;//局部变量
    }
}

1.定义的位置不一样

  • 局部变量:在方法的内部。
  • 成员变量:在方法的外部,直接写在类当中。

2.作用范围不一样

  • 局部变量:只有方法当中才可以使用,出了方法就不能再用。
  • 成员变量:整个类都可以通用。

3.默认值不一样

  • 局部变量:没有默认值,如果要想使用,必须手动进行赋值。
  • 成员变量:如果没有赋值,会有默认值,规则和数组一样。

4.内存的位置不一样

  • 局部变量:位于栈内存。
  • 成员变量:位于堆内存。

5.生命周期不一样

  • 局部变量:随着方法进栈而诞生,随着方法出栈而消失。
  • 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。

1.8面向对象的三大特征之封装性

1.封装

封装就是将一些细节信息隐藏起来,对于外界不可见。

  • 方法就是一种封装。

  • 关键字private也是一种封装。

2.封装的步骤

  • 使用 private 关键字来修饰成员变量。

  • 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法。

3.封装的操作–private关键字

(1)含义

  • private是一个权限修饰符,代表最小权限。

  • 可以修饰成员变量和成员方法。

  • 被private修饰后的成员变量和成员方法,只在本类中才能访问

(2)格式

private 数据类型 变量名;

  • 使用private修饰成员变量,代码如下:
public class Person {
    private String name;
    private int age;
}
  • 提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:
public class Person {
    private String name;
    private int age;
    public void setName(String n) { //Setter方法
        name = n;
    }
    public String getName() {  //Getter方法
        return name;
    }
    public void setAge(int a) {
        age = a;
    }
    public int getAge() {
        return age;
    }
}

注意:对于Setter来说,不能有返回值,参数类型和成员变量对应;对于Getter来说,不能有参数,返回值类型与成员变量对应。

  • 对于基本类型中的boolean值,Getter方法要写成isXxx的形式,Setter方法不变。

4.封装的优化1–this关键字

当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量,如果需要访问本类当中的成员变量,需要使用this关键字

(1)含义:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

(2)格式this.成员变量名

示例代码如下:

public class Person {
    private String name;//成员变量
    private String age;
    public void sayHello(String name) { //局部变量
        System.out.println(name + "说:" + this.name + "你好!");
    }
  • Tips:方法中只有一个变量名时,默认也是使用 this 修饰,可以省略不写。

5.封装的优化2–构造方法

(1)作用:当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。

  • Tips:无论你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法, 一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。

(2)格式

修饰符 构造方法名(参数列表){
	// 方法体
}
  • 构造方法的额方法名与它所在的类名相同,它没有返回值,不需要返回值类型,也不需要void,代码示例如下:
public class Person {
    private String name;
    private int age;
    /**无参构造方法*/
    public Person() {}
    /**有参构造方法*/
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

(3)注意

  • 如果你不提供构造方法,系统会给出无参数构造方法。

  • 如果你提供了构造方法,系统将不再提供无参数构造方法。

  • 构造方法是可以重载的,既可以定义参数,也可以不定义参数。

6.定义一个标准的类

要求:

  • 所以成员变量都要使用private关键字修饰。
  • 为每一个成员变量编写一对Setter方法和Getter方法。
  • 编写一个无参数的构造方法。
  • 编写一个有参数的构造方法。

这样标准的类也叫Java Bean.

定义一个标准的学生类,代码示例如下:

public class Student {
    //成员变量
    private String name;
    private int age;
	//无参构造方法
    public Student() {
    }
	//带参构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
	//成员方法(Getter方法和Setter方法)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

测试类,代码如下:

public class Demo03Student {
    public static void main(String[] args) {
        //无参构造使用
        Student stu1 = new Student();
        stu1.setName("张三");
        stu1.setAge(18);
        System.out.println("姓名:" + stu1.getName() + ",芳龄:" + stu1.getAge());
        System.out.println("==================");
        //带参构造使用
        Student stu2 = new Student("李四",18);
        System.out.println("姓名:" + stu2.getName() + ",芳龄:" + stu2.getAge());
    }
}