JAVASE 【Java基础五之面向对象1】

本文介绍了Java中的面向对象思想,包括面向对象的概述、类与对象的概念、创建类和对象的步骤、类中的属性和方法的定义。还探讨了面向对象的三大特征——封装、继承和多态,并通过实例解释了对象的内存分析和方法的使用。文章适合初学者理解Java面向对象编程的基础知识。
摘要由CSDN通过智能技术生成

JAVASE 【Java基础五之面向对象1】

1、面向对象概述

  • 1.1 什么是面向对象

Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。

  • 1.2 面向过程与面向对象

面向过程: 完成一个功能时,功能的每一个步骤,都需要我们进行参与,每一个细节都需要了解清楚,才能完成。强调的是过程。
面向对象强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现

举例 洗衣服
面向过程:把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉一揉–>清洗衣服–>拧干–>晾起来
面向对象:把衣服脱下来 --> 打开全自动洗衣机 -->扔衣服 --> 按钮 --> 晾起来

举例 吃饭
面向过程 :> 买菜 --> 切菜 --> 洗菜 --> 上锅烧油 爆炒(调料) --> 上盘 --> 开吃 --> 洗碗
面向对象: 饭馆 --> 老板娘来一盘饺子 --> 开吃

  • 1.3 面向对象的特点
1. 符合了我们人类思考习惯的思想
2. 将复杂的事情进行简单化了
3. 将执行者变成了指挥者(角色发生了改变)
  • 1.4 面向对象的三大特征

1.封装
2.继承
3.多态

2、类和对象

  • 2.1、什么是类

是一组相关属性行为的集合。类就是现实生活的一个事物,事物由属性和行为组成。

【类就是描述现实生活中的某一个事物,这个事物是由属性和行为组成】

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

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

  • 2.2、什么是对象

对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为

  • 举例:一只小猫。

    • 属性:tom、5kg、2 years、yellow。

    • 行为:溜墙根走、蹦跶的跑、喵喵叫。

  • 2.3 、类与对象的关系

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

类:学生                             汽车图纸
对象: 班长,一个具体的对象        大众   宝马   MG

3、创建类和对象

  • 3.1类的组成部分

[1]属性(对应程序中的数据)
通过程序中的各种数据类型,来描述一个类的『特征』,例如:汽车的颜色、汽车的排量、汽车的价格……

[2]行为(对应程序中的操作)
通过程序中的方法(也就是面向过程视角中的函数),来执行这个类的对象能够做的『动作』。例如:汽车的行驶、汽车的鸣笛、汽车的启动、汽车的停泊……

 属性行为
毛色
品种
年龄
体重
性别
吃猫粮
抓老鼠
走猫步
撒娇
喵喵
品种
年龄
高度
功用
生长
落叶
结果
枯萎
英文名面向过程角度名称面向对象角度名称
Filed成员变量属性
Method成员函数方法
  • 3.2、声明类
    在这里插入图片描述
public class Person {

    // 属性/成员变量
    // 暂时先不管声明属性的具体规则,像以前一样声明变量先使用
    // 这个成员变量即使没有初始化,系统也会为它分配初始值
    // int类型的初始值是0
    int weight;

    // 方法/成员函数
    // 暂时先不管声明函数的具体规则,先声明一个最简单的
    // public:表示这个方法可以在任何地方被调用
    // void:表示这个方法没有返回值
    // (int food):声明这个方法在被调用时可以传入的参数
    public void eat(int food) {
        weight = weight + food;
    }

    public void say() {
        System.out.println("我现在的体重是:" + weight);
    }

}
  • 声明一个对Person进行测试的类
public class PersonTest {

    public static void main(String[] args) {

        // 1.创建Person类的对象
        // 第一步:声明一个Person类这个类型的变量
        // 第二步:使用new关键字创建Person类的对象,对象赋值给第一步声明的变量
        //          在new关键字后面的,是Person类的『构造器』
        //          构造器在以后还会介绍更多细节,现在大家就按照:类名()的格式写就行
        Person person = new Person();

        // 2.调用Person对象的eat()方法:让这个人吃饭
        // 调用有参数方法的格式:指向对象的那个变量.方法名(参数)
        person.eat(5);

        // 3.调用Person对象的say()方法:让这个人说说他的体重
        // 调用无参数方法的格式:指向对象的那个变量.方法名()
        person.say();

        // 4.直接修改weight属性
        // 在类之外的其他地方是否可以操作类的属性,取决于属性的修饰符
        // 在将来学习了面向对象的『封装』特性后,我们会知道,在类的外部不建议直接操作类的属性
        person.weight = 20;

        person.say();
    }

}

4、类中的属性

  • 4.1、声明属性的语法格式

修饰符 数据类型 属性名;

修饰符 数据类型 属性名 = 初始化值;

  • 4.2、初始化值

声明一个属性时,如果没有明确的对这个属性进行初始化值的设置,那么系统会给这个属性设置默认值。所以如果有确定的需要可以设置属性的默认值,如果没有特殊需要,不设置也行。
在这里插入图片描述

  • 4.3、数据类型
  • 基本数据类型
  • 引用数据类型
  • 4.4、权限修饰符

权限修饰符不仅对类的属性有要求,对类中的方法的要求是完全一样的:

修饰符名称含义本类同包其他类子类同工程其他类
private私有×××
default缺省××
protected受保护×
public公共
  • 同包类访问私有属性:

在这里插入图片描述

  • 同工程、不同包的类访问缺省权限属性:

在这里插入图片描述

  • 同工程、不同包的类访问受保护权限属性:

在这里插入图片描述

  • 4.5、属性名

属性也叫成员变量,所以属性名作为标识符适用变量的标识符规则和规范。

在这里插入图片描述

5、对象的内存分析

public class Cat {

    private String catName = "dingdang";
    int weight;

    public void say(String master) {

        boolean emotion = true;

        if (emotion) {

            int food = 5;

            System.out.println("My name is " + catName + ",I want food:" + food);

        }

    }

}
  • 5.1基本情况

[1]声明变量

// 1.声明Cat类型的变量
Cat cat;

在这里插入图片描述

[2]创建对象

大家可以记住:只要看见使用了new关键词,就表示在堆内存中一定开辟了新的空间,一定创建了新的对象。

        // 2.给Cat类型的变量赋值一个Cat类型的对象
        cat = new Cat();

在这里插入图片描述

[3]调用方法

        // 3.调用Cat对象的方法
        cat.say("tom");

在这里插入图片描述

[4]say()方法执行完成

局部变量就会被释放掉

在这里插入图片描述

[5]main()方法执行完成

main()方法中的cat局部变量也会被释放掉。然后Cat对象就成了“断了线的风筝”被垃圾回收机制回收。

在这里插入图片描述

  • 5.2创建两个对象

证明:两个对象在堆空间中分别有自己的副本,分别进行操作时互不影响。

[1]创建第一个对象

Cat cat01 = new Cat();

在这里插入图片描述

[2]创建第二个对象

Cat cat02 = new Cat();

在这里插入图片描述

[3]第一个变量设置属性

cat01.weight = 10;

在这里插入图片描述

[4]第二个变量设置属性

cat02.weight = 20;

在这里插入图片描述

  • 两个变量指向同一对象
        Cat cat03 = new Cat();
        Cat cat04 = cat03;

在这里插入图片描述

分别用两个变量修改weight属性:

        cat03.weight = 66;

在这里插入图片描述

cat04.weight = 88;

在这里插入图片描述

  • 变量置空

[1]将cat04置空

cat04 = null;

在这里插入图片描述

[2]将cat03置空

cat03 = null;

在这里插入图片描述

6、方法

  • 6.1 为什么使用方法

  • [1]代码复用

在这里插入图片描述

  • [2]参数和返回值

方法的参数和返回值都不是必须有的,根据需要设置。
在这里插入图片描述

  • 方法的参数:我们命令方法替我们干活的时候,有时需要给方法提供一些数据。
    • 形式参数:声明方法时指定的参数,用来说明这个方法可以接受哪些参数(简称形参)
    • 实际参数:调用方法时实际传入的参数,用于方法执行过程中实际的运算(简称实参)
  • 方法的返回值:方法执行完成后,给方法的调用者返回的结果数据。
  • 6.2、方法的声明和调用
洗衣机方法
工厂生产洗衣机声明方法
用户使用洗衣机调用方法

[1]声明方法的代码

// 声明一个方法:求两个整数的和
// int a,int b声明方法的参数:形式参数
// public int:表示方法的访问权限是public,返回值是int类型
// 方法名:add
public int add(int a, int b) {

    // 计算a + b的和
    int addResult = a + b;

    // 使用return关键字将a + b的和返回给方法的调用者
    return addResult;
}

[2]调用方法的代码

// 1.要调用一个方法,需要先创建方法所在类的对象
Calculator calculator = new Calculator();

// 2.通过对象调用方法
// 这里传入给方法的5、11,我们叫做实际参数
int addResult = calculator.add(5, 11);

[3]方法相关规则

  • 方法调用一次就会执行一次
  • 方法必须写在类中,不能独立存在。
  • 方法如果没有返回值,方法体内可以没有return;如果写了return,那么表示方法结束。
  • 方法声明的返回值类型必须和实际返回的数据类型一致。
  • 方法内部不能再声明方法。

返回值是int类型
// 方法名:add

public int add(int a, int b) {

    // 计算a + b的和
    int addResult = a + b;

    // 使用return关键字将a + b的和返回给方法的调用者
    return addResult;
}

[4]调用方法的代码

// 1.要调用一个方法,需要先创建方法所在类的对象
Calculator calculator = new Calculator();

// 2.通过对象调用方法
// 这里传入给方法的5、11,我们叫做实际参数
int addResult = calculator.add(5, 11);
  • 6.3 方法相关规则
  • 方法调用一次就会执行一次
  • 方法必须写在类中,不能独立存在。
  • 方法如果没有返回值,方法体内可以没有return;如果写了return,那么表示方法结束。
  • 方法声明的返回值类型必须和实际返回的数据类型一致。
  • 方法内部不能再声明方法。
  • 6.4、方法重载

①需求

计数器类中已有方法:做两个int类型的加法

public int add(int a, int b)

想要增加新的方法:做两个double类型的加法

public double add(double a, double b)

为了满足更多使用情况,还想有更多方法:

public int add(int a, int b, int c)

小结:在一个类中,很可能会有很多类似的需求,为了满足这些需求,我们会声明很多相似的方法。同时为了让方法的调用者体验更好、更容易找到所需方法,这些功能相近的方法最好使用『同一个方法名』。

②前提

  • 同一个类中
  • 同名的方法

③方法重载的好处

  • 没有重载不方便:让方法调用者,在调用方法的时候,不必为了相似的功能而查阅文档,查找各种不同的方法名,降低学习成本,提高开发效率。
  • 有了重置很方便:在调用一系列重载的方法时,感觉上就像是在调用同一个方法。对使用者来说,只需要知道一个方法名就能够应对各种不同情况。

④规则限制

限制的来源:本质上只要让系统能够区分清楚我们具体要调用哪一个方法。

  • 在同一个类中,如果两个方法的方法名一致,那么参数列表必须不同。
  • 参数列表区分
    • 要么是参数个数不同
    • 要么是参数类型不同
  • 重载方法举例

[1]参数个数不同

public int add(int a, int b)
public int add(int a, int b, int c)

[2]参数类型不同

public int add(int a, int b)
public double add(double a, double b)

或:

public double add(int a, double b)
public double add(double a, int b)
  • 方法可变参数

①需求

在实际开发过程中,确实有一些情况不确定在调用方法时传入几个参数。所以为了让调用方法时能够弹性传参,JavaSE5.0标准增加了可变参数功能。

②声明和调用

// 能够计算任意个数整数之和的加法
// 使用String ... args来声明可变参数
public String add(String ... args) {

    System.out.println("暗号:可变参数");

    String sum = "";

    // 在方法体内,可变参数按照数组形式来处理
    for (int i = 0; i < args.length; i++) {
        sum = sum + args[i];
    }

    return sum;
}

测试代码:

String addResultStr = calculator.add("a");
System.out.println("addResultStr = " + addResultStr);

addResultStr = calculator.add("a", "b");
System.out.println("addResultStr = " + addResultStr);

addResultStr = calculator.add("a", "b", "c");
System.out.println("addResultStr = " + addResultStr);

addResultStr = calculator.add();
System.out.println("addResultStr = " + addResultStr);

③语法规则

  • 可变参数必须在整个参数列表的最后
    在这里插入图片描述

  • 当调用方法时实际传入的参数既匹配可变参数列表方法,又匹配一个具体的参数列表方法,那么系统会优先调用具体的参数列表方法

举例:调用方法add(5, 3)

可变参数方法:add(int … args)

具体参数方法:add(int i, int j)【系统会调用这个方法】

  • 一个方法只能声明一个可变参数
  • 方法参数值传递

  • ①基本数据类型

在这里插入图片描述

  • ②引用数据类型
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值