Frank's blog Frank's blog
首页
  • Java SE
  • Java Web
  • Java EE
  • HTML
  • CSS
技术
Python
  • 友情链接
关于
索引
GitHub (opens new window)

Master Frank

斯人若彩虹,遇上方知有
首页
  • Java SE
  • Java Web
  • Java EE
  • HTML
  • CSS
技术
Python
  • 友情链接
关于
索引
GitHub (opens new window)
  • JavaSE

    • 初识Java:Java帝国的诞生
    • java基础语法
    • 类型转换、运算符、流程控制语句
    • switch&循环语句
    • IDEA安装与使用
    • 数组
    • 方法
    • Debug&基础练习
    • 进制转换&原码反码补码
    • 二维数组
    • 面向对象
      • 1. 类和对象
        • 1.1 类和对象的关系(理解)
        • 1.2 类的定义(应用)
        • 1.3 对象的创建和使用(应用)
        • 1.4 案例-手机类的创建和使用
      • 2. 对象内存图
        • 2.1 单个对象内存图(理解)
        • 2.2 多个对象内存图(理解)
        • 2.3 多个对象指向相同内存图(理解)
      • 3. 成员变量和局部变量
        • 3.1 成员变量和局部变量的区别
      • 4. 封装
        • 4.1 private关键字(理解)
        • 4.2 this关键字(应用)
        • 4.3 this内存原理(理解)
        • 4.4 封装思想
      • 5. 构造方法
        • 5.1 构造方法概述
        • 5.2 构造方法的注意事项(理解)
        • 5.3 标准类的代码编写和使用
    • 常用API & String & StringBuilder
    • ArrayList集合&学生管理系统
    • 继承&关键字
    • 权限修饰符&代码块
    • 多态&抽象类&接口
    • 内部类&API
    • 常用API&异常
  • Java
  • JavaSE
Frank
2021-10-29
目录
1. 类和对象
1.1 类和对象的关系(理解)
1.2 类的定义(应用)
1.3 对象的创建和使用(应用)
1.4 案例-手机类的创建和使用
2. 对象内存图
2.1 单个对象内存图(理解)
2.2 多个对象内存图(理解)
2.3 多个对象指向相同内存图(理解)
3. 成员变量和局部变量
3.1 成员变量和局部变量的区别
4. 封装
4.1 private关键字(理解)
4.2 this关键字(应用)
4.3 this内存原理(理解)
4.4 封装思想
5. 构造方法
5.1 构造方法概述
5.2 构造方法的注意事项(理解)
5.3 标准类的代码编写和使用

面向对象

# 面向对象

思维导图 (opens new window)

# 1. 类和对象

**面向对象和面向过程的思想对比 : **

  • 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
  • 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能

# 1.1 类和对象的关系(理解)

客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。

  • 类
    • 类的理解
      • 类是对现实生活中一类具有共同属性和行为的事物的抽象
      • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
      • 简单理解:类就是对现实事物的一种描述
    • 类的组成
      • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
      • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
  • 类和对象的关系
    • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
    • 对象:是能够看得到摸的着的真实存在的实体
    • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

image-20211029094613724

# 1.2 类的定义(应用)

类的组成是由属性和行为两部分组成

  • 属性:在类中通过成员变量来体现(类中方法外的变量)
  • 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)

类的定义步骤:

​ ① 定义类

​ ② 编写类的成员变量

​ ③ 编写类的成员方法

格式:

public class 类名 {
	//成员变量
	变量1的数据类型 变量1
	变量2的数据类型 变量2
	…
	//成员方法
	方法1;
	方法2;
}
1
2
3
4
5
6
7
8
9

示例:

public class Student {
    // 属性 : 姓名, 年龄
    // 成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外
    String name;
    int age;

    // 行为 : 学习
    // 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字.
    public void study(){
        System.out.println("好好学习,天天向上");
    }
    
    public void doHomework() {
        System.out.println("键盘敲烂,月薪过万");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 1.3 对象的创建和使用(应用)

  • 创建对象的格式:
    • 类名 对象名 = new 类名();
  • 调用成员的格式:
    • 对象名.成员变量
    • 对象名.成员方法();

PS:直接输出对象,会输出全类名(包名 + 类名)@内存地址。例如:

System.out.println("stu");
1

输出为day07.Student@28d93b30。

  • 示例代码 :
package day07;

public class StudentDemo {
    /*
        创建对象的格式:
                类名 对象名 = new 类名();
        调用成员变量的格式:
                对象名.变量名
        调用成员方法的格式:
                对象名.方法名();
     */
    public static void main(String[] args) {
        // 类名 对象名 = new 类名();
        Student stu = new Student();
        // 对象名.变量名
        // 默认初始化值
        System.out.println(stu.name);  // null
        System.out.println(stu.age);   // 0

        stu.name = "张三";
        stu.age = 23;

        System.out.println(stu.name);  // 张三
        System.out.println(stu.age);   // 23

        // 对象名.方法名();
        stu.study();
        // 直接输出对象会输出 全类名(包名 + 类名)@内存地址
        // day07.Student@28d93b30
        System.out.println(stu);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 1.4 案例-手机类的创建和使用

# 1.4.1 需求

首先定义一个手机类,然后定义一个手机测试类,在手机测试类中通过对象完成成员变量和成员方法的使用

# 1.4.2 分析

  • 成员变量:品牌, 价格

  • 成员方法:打电话, 发短信

  • 示例代码:

package day07;
/*
    手机类:
        类名:
        手机(phone)

        成员变量:
        品牌(brand)
        价格(price)

        成员方法:
        打电话(call)
        发短信(sendMessage)
 */

public class Phone {
    //成员变量
    String brand;
    int price;

    //成员方法
    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }

    public void sendMessage() {
        System.out.println("发短信");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package day07;

public class PhoneDemo {
    public static void main(String[] args) {
        //1.创建对象
        Phone p = new Phone();
        //2.给成员变量赋值
        p.brand = "小米";
        p.price = 2999;
        //3.打印赋值后的成员变量
        System.out.println(p.brand);
        System.out.println(p.price);
        //4.调用成员方法
        p.call("星子");
        p.sendMessage();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2. 对象内存图

# 2.1 单个对象内存图(理解)

1590938666222

# 2.2 多个对象内存图(理解)

1590938693756

  • 总结:

    多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份

# 2.3 多个对象指向相同内存图(理解)

1590938711726

  • 总结 :

    当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)

    只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

# 3. 成员变量和局部变量

# 3.1 成员变量和局部变量的区别

  • 类中位置不同:
    • 成员变量:类中方法外
    • 局部变量:方法内部或方法声明上
  • 内存中位置不同:
    • 成员变量:堆内存
    • 局部变量:栈内存
  • 生命周期不同:
    • 成员变量:随着对象的存在而存在,随着对象的消失而消失
    • 局部变量:随着方法的调用而存在,醉着方法的调用完毕而消失
  • 初始化值不同:
    • 成员变量:有默认初始化值
    • 局部变量:没有默认初始化值,必须先定义,赋值才能使用

# 4. 封装

# 4.1 private关键字(理解)

# 4.1.1 概述

private是一个权限修饰符,可以用来修饰成员(成员变量,成员方法),作业是保护成员不被别的类使用,被private修饰的成员只能在本类中访问。

# 4.1.2 特点

被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,需要按照下面的操作:

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

# 4.1.3 示例代码

package day07;

public class Student {
    //成员变量
    private String name;
    private int age;

    //get&set方法
    public void setName(String n) {
        name = n;
    }

    public String getName(){
        return name;
    }

    public void setAge(int a) {
        //可以在set方法中对变量定义进行条件限制
        if (a<0 || a>120) {
            System.out.println("你给的年龄有误");
        } else {
            age = a;
        }
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println("姓名为" + name + ",年龄为" + age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package day07;

public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student stu = new Student();

        //给成员变量赋值
        stu.setName("林青霞");
        //stu.age = 30;
        //stu.setAge(-30);
        stu.setAge(30);
        //调用show()方法
        stu.show();
        //使用get方法获取成员变量的值
        System.out.println("姓名为" + stu.getName() + "。年龄为" + stu.getAge());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 4.2 this关键字(应用)

# 4.2.1 概述

this修饰符用于指代成员变量,主要作用是区分同名的局部变量和成员变量。

  • this修饰的变量为成员变量,不带this修饰的是形参
  • this所在方法被哪个对象调用,this就代表哪个对象

# 4.1.2代码实现 :

public class Student {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 4.3 this内存原理(理解)

注意 : this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象

1590938942838

1590938969305

# 4.4 封装思想

# 4.4.1 封装概述

  • 封装是是面向对象三大特征之一(封装,继承,多态)
  • 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的

# 4.4.2 封装原则

  • 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
  • 成员变量private,提供对应的getXxx()/setXxx()方法

# 4.4.3 封装的优点

  • 通过方法来控制成员变量的操作,提高了代码的安全性
  • 把代码用方法进行封装,提高了代码的复用性

# 5. 构造方法

# 5.1 构造方法概述

构造方法是一种特殊的方法

  • 格式

    • 修饰符为public

    • 方法名与类名相同,大小写也要一致

    • 没有返回值类型,连void都没有

    • 没有具体的返回值(不能由retrun带回结果数据)

      public class 类名 {
      	public 类名(参数) {
      	
      	}
      }
      
      1
      2
      3
      4
      5
  • 执行时机

    • 创建对象的时候调用,每创建一次对象,就会执行一次构造方法
    • 不能手动调用构造方法
  • 作用:完成对象数据的初始化

  • 示例:

class Student {
    private String name;
    private int age;

    //构造方法
    public Student() {
        System.out.println("无参构造方法");
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        s.show();
    }
}
1
2
3
4
5
6
7

# 5.2 构造方法的注意事项(理解)

  • 构造方法的创建
    • 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
    • 如果定义了构造方法,系统将不再提供默认的构造方法
  • 构造方法的重载
    • 如果定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法。
  • 推荐的使用方式
    • 无论是否使用,都手动书写无参数构造方法。
  • 重要功能
    • 可以使用带参构造,为成员变量进行初始化。
package day07;

public class Student {
    //成员变量
    private String name;
    private int age;

    public Student() {}

    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 void show() {
        System.out.println("姓名为" + name + ",年龄为" + age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package day07;

public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        //调用public Student()
        Student s1 = new Student();
        s1.show();
        //调用public Student(String name)
        Student s2 = new Student("林青霞");
        s2.show();
        //调用public Student(int age)
        Student s3 = new Student(30);
        s3.show();
        //调用public Student(String name, int age)
        Student s4 = new Student("林青霞",30);
        s4.show();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 5.3 标准类的代码编写和使用

  1. 成员变量
    • 使用private修饰
  2. 构造方法
    • 提供一个无参构造方法
    • 提供一个带多个参数的构造方法
  3. 成员方法
    • 提供每一个成员变量对应的get和set方法
    • 提供一显示对象信息的show()
  4. 创建对象并为其成员变量赋值的两种方式
    • 无参构造方法创建对象后使用set方法赋值
    • 使用带参构造方法直接创建带有属性值的对象

代码 :

package day07;
/*
    成员变量
        使用private修饰
    构造方法
        提供一个无参构造方法
        提供一个带多个参数的构造方法
    成员方法
        提供每一个成员变量对应的setXxx()/getXxx()
        提供一个显示对象信息的show()
    创建对象并为其成员变量赋值的两种方式
        无参构造方法创建对象后使用setXxx()赋值
        使用带参构造方法直接创建带有属性值的对象
 */

public class Student {
    //成员变量
    private String name;
    private int age;

    //无参构造方法
    public Student() {}

    //带参构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //set方法
    public void setName(String name) {
        this.name = name;
    }

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

    //get方法
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println("姓名为" + name + ",年龄为" + age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package day07;

public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        //无参构造方法创建对象后使用set方法赋值
        Student s1 = new Student();
        s1.setName("林青霞");
        s1.setAge(25);
        s1.show();
        //使用带参构造方法直接创建带属性值的对象
        Student s2 = new Student("张曼玉",30);
        s2.show();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
评论 Powered by GitHub & Vssue
使用 GitHub 帐号登录后发表评论
使用 GitHub 帐号登录后发表评论

登录后查看评论

在Github中编辑 (opens new window)
上次更新: 2021/11/29, 11:19:50
二维数组
常用API & String & StringBuilder

← 二维数组 常用API & String & StringBuilder→

最近更新
01
面试问题套路
04-21
02
Mysql多版本安装
05-28
03
Go语言基础类型
05-04
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Master Frank | 粤ICP备2021148573号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×