第06章_面向对象编程(基础)

本文介绍了面向对象编程的基础知识,主要包括Java中的类和对象、成员变量与方法、构造器等核心概念。讲解了面向对象的三大特征,强调了封装的重要性,并通过实例详细阐述了如何在Java中实现数据封装。此外,还涉及了对象的内存解析、方法的重载、参数传递机制以及递归等高级话题。最后,提到了包和导入的关键字package和import在Java编程中的作用。
摘要由CSDN通过智能技术生成

学习面向对象内容的三条主线

  • Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类

  • 面向对象的特征:封装、继承、多态、(抽象)

  • 其他关键字的使用:this、super、package、import、static、final、interface、abstract等

1. 面向对象编程概述(了解)


1.1 程序设计的思路

面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程指令式编程函数式编程。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。

早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式。

1. 面向过程的程序设计思想(Process-Oriented Programming),简称POP

  • 关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。

  • 典型的语言:C语言

  • 代码结构:以函数为组织单位。

  • 是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大。

2. 面向对象的程序设计思想( Object Oriented Programming),简称OOP

  • 关注的焦点是:在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,用类来表示。

  • 典型的语言:Java、C#、C++、Python、Ruby和PHP等

  • 代码结构:以为组织单位。每种事物都具备自己的属性行为/功能

  • 是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。

2. Java语言的基本元素:类和对象


2.1 引入

人认识世界,其实就是面向对象的。比如,我们认识一下美人鱼(都没见过)

 经过“仔细学习”,发现美人鱼通常具备一些特征:

  • 女孩

  • 有鱼尾

  • 美丽

这个总结的过程,其实是抽象化的过程。抽象出来的美人鱼的特征,可以归纳为一个美人鱼类。而图片中的都是这个类呈现出来的具体的对象

2.2 类和对象概述

类(Class)对象(Object)是面向对象的核心概念。

1、什么是类

:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。

2、什么是对象

对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)

2.3 类的成员概述

面向对象程序设计的重点是类的设计

类的设计,其实就是类的成员的设计

  • 现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java代码世界是由诸多个不同功能的构成的。

     

  • 现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、…

    Java中用类class来描述事物也是如此。类,是一组相关属性行为的集合,这也是类最基本的两个成员。

    • 属性:该类事物的状态信息。对应类中的成员变量

      • 成员变量 <=> 属性 <=> Field

    • 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法

      • (成员)方法 <=> 函数 <=> Method

  •  举例:

2.4 面向对象完成功能的三步骤(重要)

步骤1:类的定义

类的定义使用关键字:class。格式如下:

[修饰符] class 类名{
    属性声明;
    方法声明;
}

举例:

public class Person{
    //声明属性age
    int age ;	                   
    
    //声明方法showAge()
    public void eat() {        
	    System.out.println("人吃饭");
    }
}

步骤2:对象的创建

  • 创建对象,使用关键字:new

  • 创建对象语法:

//方式1:给创建的对象命名
//把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了
类名 对象名 = new 类名();

//方式2:
new 类名()//也称为匿名对象

  •  举例:
class PersonTest{
	public static void main(String[] args){
		//创建Person类的对象
		Person per = new Person();
	}
}

步骤3:对象调用属性或方法

  • 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。

  • 使用"对象名.属性" 或 "对象名.方法"的方式访问对象成员(包括属性和方法)

举例:

//声明Animal类
public class Animal { //动物类
    public int legs;

    public void eat() {
        System.out.println("Eating.");
    }

    public void move() {
        System.out.println("Move.");
    }
}


//声明测试类
public class AnimalTest {
    public static void main(String args[]) {
        //创建对象
        Animal xb = new Animal();
        xb.legs = 4;//访问属性
        System.out.println(xb.legs);
        xb.eat();//访问方法
        xb.move();//访问方法
    }
}

2.5 匿名对象 (anonymous object)

  • 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。

    • 如:new Person().shout();

  • 使用情况

    • 如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。

    • 我们经常将匿名对象作为实参传递给一个方法调用。

3. 对象的内存解析


3.1 JVM内存结构划分

HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。

其中:

堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

栈(Stack):是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。

方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

3.2 对象内存解析

举例:

class Person { //类:人
    String name;
    int age;
    boolean isMale;
}

public class PersonTest { //测试类
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "赵同学";
        p1.age = 20;
        p1.isMale = true;

        Person p2 = new Person();
        p2.age = 10;

        Person p3 = p1;
        p3.name = "郭同学";
    }
}

内存解析图:

说明:

  • 堆:凡是new出来的结构(对象、数组)都放在堆空间中。

  • 对象的属性存放在堆空间中。

  • 创建一个类的多个对象(比如p1、p2),则每个对象都拥有当前类的一套"副本"(即属性)。当通过一个对象修改其属性时,不会影响其它对象此属性的值。

  • 当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创建新的对象。而是两个变量共同指向了堆空间中同一个对象。当通过一个对象修改属性时,会影响另外一个对象对此属性的调用。

 4. 类的成员之一:成员变量(field)


4.1 如何声明成员变量

  • 语法格式:

[修饰符1] class 类名{
    [修饰符2] 数据类型 成员变量名 [= 初始化值]; 
}

  • 说明:

    • 位置要求:必须在类中,方法外

    • 修饰符2(暂不考虑)

      • 常用的权限修饰符有:private、缺省、protected、public

      • 其他修饰符:static、final

    • 数据类型

      • 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。

    • 成员变量名

      • 属于标识符,符合命名规则和规范即可。

    • 初始化值

      • 根据情况,可以显式赋值;也可以不赋值,使用默认值

示例:

public class Person{
	private int age;             //声明private变量 age
	public String name = “Lila”;    //声明public变量 name
}

4.2 成员变量 vs 局部变量

1、变量的分类:成员变量与局部变量

  • 在方法体外,类体内声明的变量称为成员变量。

  • 在方法体内部等位置声明的变量称为局部变量。

2、成员变量 与 局部变量 的对比

  • 相同点

    • 变量声明的格式相同: 数据类型 变量名 = 初始化值

    • 变量必须先声明、后初始化、再使用。

    • 变量都有其对应的作用域。只在其作用域内是有效的

  • 不同点

1、声明位置和方式 (1)实例变量:在类中方法外 (2)局部变量:在方法体{}中或方法的形参列表、代

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值