【学习笔记之JavaSE】-4.1面向对象


在这里插入图片描述
面向对象,将功能封装进对 象,强调具备功能的对象,以类/对象为最小单位,考虑谁来做。
面向过程,强调的 是功能行为,以函数为最小单位,考虑怎么做。

万事万物皆对象:

  1. 在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
  2. 涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。

1.构成

面向对象的两个要素:

  • 类:对一类事物的描述,是抽象的、概念上的定义
  • 对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)

java面向对象学习的三条主线:

  • 1.Java类及类的成员:属性(成员变量)、方法、构造器;代码块、内部类
  • 2.面向对象的三大特征:封装性、继承性、多态性、(抽象性)
  • 3.其它关键字:this、super、static、final、abstract、interface、package、import等
    在这里插入图片描述

2.属性

在这里插入图片描述PS:private的属性或方法,只能类内调用(即只允许本类的其它方法定义时调用该private属性或方法,实例化的对象不可调用

属性 vs 局部变量
在这里插入图片描述PS:

  • 非static属性加载到堆空间中
  • 形参在调用时,我们赋值即可。形参定义时不可赋值
  • 属性默认初始化值:
    在这里插入图片描述

2.方法

在这里插入图片描述
返回值类型:(无返回值用void

  • 方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
  • 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。

PS:return关键字后面不可以声明执行语句。因为多余不会执行(类似continue与break)

类的访问机制

  • 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。 (例外:static方法访问非static,编译不通过。)
  • 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。

3.内存解析

在这里插入图片描述

如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
在这里插入图片描述

4.再谈方法

4.1.值传递机制

  1. 形参(or变量)是基本数据类型:此时实参赋给形参(or变量)的是实参真实存储的数据值
  2. 形参(or变量)是引用数据类型:此时实参赋给形参(or变量)的是实参存储数据的地址值。(PS:多了一个引用)

来举个例子咱来分析一波

public class TransferTest3 {
    public static void main(String args[]) {
        TransferTest3 test = new TransferTest3();
        test.first();
    }
    public void first() {
        int i = 5;
        Value v = new Value();
        v.i = 25;
        second(v, i);
        System.out.println(v.i);
    }
    public void second(Value v, int i) {
        i = 0;
        v.i = 20;
        Value val = new Value();
        v = val;
        System.out.println(v.i + " " + i);
    }
}
class Value {
    int i = 15;
}

在这里插入图片描述

4.2.重载+递归

重载:“两同一不同”:同一个类、相同方法名;参数列表不同:参数个数不同,参数类型不同
PS:跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
在通过对象调用方法时,如何确定某一个指定的方法:方法名 —> 参数列表

char[] arr1 = new char[10];
System.out.println(arr1);//输出的不是对象地址,还是字符组成的串,这是对字符数组的println重载造成

匿名对象:我们创建的对象,没有显式的赋给一个变量名。匿名对象只能调用一次

可变个数的形参

  1. 声明格式:方法名(参数的类型名 参数名)
    例如:public void show(int a ,String… strs) 即public void show(int a,String[] strs).故二者不能同时存在,要不重复定义
  2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
  3. 可变个数形参的方法与同名的方法之间,彼此构成重载
  4. 可变参数方法的使用与方法参数部分使用数组是一致的
  5. 方法的参数部分有可变形参,需要放在形参声明的最后
  6. 在一个方法的形参位置,最多只能声明一个可变个数形参

递归:一个方法体内调用它自身 PS:递归一定要向已知方向递归
以Fibonacci数列为例(PS:生活中爬n阶楼梯有多少种方式也是Fibonacci数列。

public class Recursion {
    public static void main(String args[]) {
        Recursion recursion = new Recursion();
        int fib = recursion.fibonacci(3);
        System.out.println(fib);
    }
    public int fibonacci(int n) {
        if (n == 1) {
            return 1;
        } else if (n == 2) {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

5.封装和隐藏

程序设计追求:
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。

封装性的设计思想:隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提 高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来

将类的属性xxx声明为私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()实现对该属性的操作。IDEA中可以通过Alt+Insert快捷创建
在这里插入图片描述
PS:4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类;
修饰类的话,只能使用:缺省、public

6.构造器(或构造方法)

构造器的作用:1.创建对象;2.初始化对象的信息 注:实例化类时是new+构造器

说明:

  1. 如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
  2. 定义构造器的格式:权限修饰符 类名(形参列表){}
  3. 一个类中定义的多个构造器,彼此构成重载
  4. 一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
  5. 一个类中,至少会有一个构造器。

属性赋值的先后顺序

  1. 默认初始化
  2. 显式初始化
  3. 构造器中初始化
  4. 通过"对象.方法" 或 "对象.属性"的方式,赋值

JavaBean是一种Java语言写成的可重用组件。符合如下标准的Java类:

  1. 类是公共的
  2. 有一个无参的公共的构造器
  3. 有属性,且有对应的get、set方法

7.关键字:this、package、import

this关键字的使用:

  1. this可以用来修饰、调用:属性、方法、构造器
  2. this修饰属性和方法: this理解为:当前对象 或 当前正在创建的对象(谁调用就是谁
    PS:在类的方法或构造器中,如果方法或构造器的形参和类的属性同名时,我们必须显式的使用"this.变量 = 形参"的方式,表明此变量是属性,而非形参。
  3. this调用构造器
    ① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
    ② 构造器中不能通过"this(形参列表)“方式调用自己(要不死循环了)
    ③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)”
    ④ 规定:"this(形参列表)“必须声明在当前构造器的首行
    ⑤ 构造器内部,最多只能声明一个"this(形参列表)”,用来调用其他的构造器

package关键字的使用

  1. 使用package声明类或接口所属的包,声明在源文件的首行
  2. 每"."一次,就代表一层文件目录。

PS:同一个包下,不能命名同名的接口、类;不同的包下,可以命名同名的接口、类。

import关键字的使用:import:导入

  1. 在源文件中显式的使用import结构导入指定包下的类、接口
  2. 可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入
  3. 如果使用的类或接口是java.lang包下定义的,则可省略import结构(但java.lang包下的子包仍需显示导入)
  4. 如果使用的类或接口是本包下定义的,则可以省略import结构
  5. 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。

6. import static:导入指定类或接口中的静态结构:属性或方法。(不常用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空•物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值