【Java】面向对象 OOP

发布时间:2024年01月16日


面向对象OOP概述

OOP
OOP为组成单位,
的内部由成员构成,
成员包括:成员变量(Field) 与 成员方法(Method)

  • :相当于一个模板/蓝图
    • 相同特征事物的抽象描述(抽象上的人)
  • 对象:通过这个蓝图 创建(new)出来的 “实例(instance)” 。
    • 可以new很多实例,每个实例都是独立的。
    • 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
    • (具体的人)
  • OOP设计 -> 类的设计 -> 类的成员设计

一、对象内存相关

  1. Heap:
    new 出来 对象的数据 都放这, 存储对象的数据

  2. Stack:
    存放 引用类型 地址(指向堆空间数据)
    以及 值类型 的具体值

  3. 方法区 Method Area:
    常量、静态变量、class字节码…

二、类的成员之一:成员变量(Field)

2.1 如何声明成员变量

  1. 位置要求:必须在类中,方法外
  2. 修饰符 : private、缺省、protected、public 还有 static final
  3. 初始化值:可以显式赋值,也可以不赋值,使用默认值
    4.当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值

2.2 成员变量 与 局部变量

与类 有关 成员变量
根据类的创建而创建 , 类or 对象 消失而消失
在类内,方法外

与方法 有关 局部变量
方法执行到存在 , 方法执行完毕跟随方法一起消失
在类内的方法内

2.2

static可以将成员变量分为两大类,静态变量非静态变量
其中静态变量又称为类变量,非静态变量又称为实例变量或者属性。

相同点:

  1. 变量声明的格式相同: 数据类型 变量名 = 初始化值
  2. 变量必须先声明、后初始化、再使用。
  3. 变量都有其对应的作用域。只在其作用域内是有效的

不同点:

  • 声明位置和方式
    • 实例变量:在类中方法外
    • 局部变量:在方法体{}中或方法的形参列表、代码块中
  • 在内存中存储的位置不同
    • 实例变量:堆
    • 局部变量:栈
  • 生命周期
    • 实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
    • 局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
  • 作用域
    • 实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量”
    • 局部变量:出了作用域就不能使用
  • 修饰符
    • 实例变量:public,protected,private,final等
    • 局部变量:final
  • 默认值
  • 实例变量:有默认值
  • 局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。
    2.21

三、类的成员之一:成员方法(Method)

  1. 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
  2. 将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码
  3. Java里的方法不能独立存在,所有的方法必须定义在类里。

3.1 方法调用内存分析

  • 方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储。
  • 方法被调用的时候,需要进入到内存中运行。
    • 方法每调用一次就会在栈中有一个入栈动作,即
    • 给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值。
    • 当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。
  • 栈结构:先进后出,后进先出

3.2 方法的重载

方法名相同,参数列表不同(个数、类型),与修饰符、返回值类型无关

重载方法调用:
JVM通过方法的参数列表,调用匹配的方法。
先找个数、类型最匹配的
再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错

3.3 可变个数的形参

在JDK 5.0 中提供了Varargs(variable number of arguments)机制。
即当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变个数的形参
格式:

//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String...books);

举例:

需求:n个字符串进行拼接,每一个字符串之间使用某字符进行分割,如果没有传入字符串,那么返回空字符串""

public class StringTools {
    String concat(char seperator, String... args){
        String str = "";
        for (int i = 0; i < args.length; i++) {
            if(i == 0){
                str += args[i];
            }else{
                str += seperator + args[i];
            }
        }
        return str;
    }
}

//测试:
		StringTools tools = new StringTools();
        System.out.println(tools.concat('-'));
        System.out.println(tools.concat('-',"hello"));
        System.out.println(tools.concat('-',"hello","world"));
        System.out.println(tools.concat('-',"hello","world","java"));

3.4 形参与实参:参数传递机制->值传递

Java里方法的参数传递方式只有一种:值传递
即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

  • 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
  • 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

四、 类的成员之一:构造(Constructor)

new完对象时,所有成员变量都是默认值,用构造器可以为当前对象的某个或所有成员变量直接赋值。
没写构造,java 会提供一个默认的无参构造

构造器的修饰符只能是权限修饰符,不能被其他任何修饰。
比如,不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。

五、OOP三大特性之一:封装

如何实现封装

实现封装性 即 控制类或成员的可见性
修
具体修饰的结构:
外部类:public、缺省
成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private

一般成员实例变量都习惯使用private修饰,再提供相应的public权限的get/set方法访问。
对于final的实例变量,不提供set()方法。
对于static final的成员变量,习惯上使用public修饰。

六、OOP三大特性之一:继承

is-a 的关系 , 父类与子类 , JAVA是单继承,多实现

七、OOP三大特性之一:多态

多态(Polymorphism) 在继承的前提条件下,实现多态。 即 “ 父类引用指向子类对象 ”
编译时,看左边;运行时,看右边。


总结

1、在类的属性中,可以有哪些位置给属性赋值?
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过"对象.属性"或"对象.方法"的方式,给属性赋值

  1. JavaBean

    • 类是公共的
    • 有一个无参的公共的构造器
    • 有属性,且有对应的get、set方法
  2. UML类图
    UML(Unified Modeling Language,统一建模语言),用来描述软件模型和架构的图形化语言。
    UML类图可以更加直观地描述类内部结构(类的属性和操作)以及类之间的关系(如关联、依赖、聚合等)。
    3

  • +表示 public 类型, - 表示 private 类型,#表示protected类型
  • 方法的写法: 方法的类型(+、-) 方法名(参数名: 参数类型):返回值类型
  • 斜体表示抽象方法或类。
文章来源:https://blog.csdn.net/GavinGroves/article/details/135428957
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。