CT的Java基础学习笔记(五)——面向对象(上)

Java基础学习笔记整理了我从零开始学习Java时所学习到的内容。
以下内容参考尚硅谷Java教程。

五.面向对象(上)

1 类与对象

1.1 面向对象内容

①Java类及类的成员:属性、方法、构造器;代码块、内部类;
②面向对象的特征:封装、多态、继承;(抽象);
③其他关键字:this、super、static、final、abstract、interface、package、import等。

1.2 面向对象与面向过程

面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。

面向对象:强调了具备具体功能的对象,以类/对象为最小单位,考虑谁来做。

1.3 设计思路

  • 根据问题需要,选择问题所针对的现实世界中的实体
  • 从实体寻找解决问题的相关属性和功能,这些属性和功能形成了概念世界中的类
  • 把抽象的实体用计算机语言描述,形成计算机的类的定义
  • 类实例化成计算机中的对象,对象是处理问题的最终工具。

1.4 面向对象的重要概念

类(class):对一类事物的描述,是抽象的、概念上的定义。
对象(abstract):是实际存在的该类事物的个体,因此也被称为实例。

面向对象程序设计重点是类的设计
设计类,就是设计类的成员

1.5 面向对象编程基本规则

  1. 创建类,设计类的成员;
  2. 创建类的对象;
  3. 通过“对象.属性”或“对象.方法”调用对象的结构。

补充:

属性=成员变量=field=域
方法=成员方法=函数=method
创建类的对象=对象实例化=实例化类

1.6 对象的创建与对象的内存解析

代码:

Person p1 = new Person();
Person p3 =p1;//共用一个对象实体

说明:
如果创建了一个类的多个对象,则每个对象都有一套独立的类的属性(非static)。这意味着我们更改对象一的属性时,不会影响到另一个对象的属性。

1.7 内存解析

创建一个类的对象=在栈中放入一个指针,指向堆空间中的一块区域
该区域中包含属性、方法。

1.8 匿名对象

我们创建的对象,没显式的赋给一个变量名,即为匿名对象。

特点:匿名对象只能调用一次。

应用场景:

PhoneMall mall = new PhoneMall;
mall.show(new Phone());

class PhoneMall{
    public void show(Phone phone){
        phone.sendEmail();
        phone.playGame();
   }
}

番外:JVM的内存解析

编译.java文件后,生成一个或多个字节码文件。
JVM的类加载器与解释器对生成的字节码文件进行解释运行。
在这里插入图片描述
虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中。
堆,我们将new出来的结构(比如:数组、对象)加载在堆空间中。补充:对象的属性(非static的)加载在堆空间中。
方法区:类的加载信息、常量池、静态域。

2 属性

属性(成员变量) vs 局部变量
相同点

1.定义变量的格式:数据类型 变量名 = 变量值
2.先声明,后使用
3.变量都有其作用域

不同点

  1. 在类中声明的位置不同
    属性:直接定义在类的{ }内
    局部变量:声明在方法内、方法形参、代码块内、 构造器形参、构造器内部的变量
  1. 关于权限的修饰符不同
    属性:可以在声明属性时,指明其权限,使用权限修饰符
    常用private、public、缺省、protected
    局部变量:不可以使用权限修饰符
  1. 默认初始化值
    属性:根据其类型自动装填默认值
    局部变量:无初始化值。即我们调用局部变量之前必须先给它赋值
  1. 在内存中加载的位置
    属性:加载到堆空间中(非static)
    局部变量:加载到栈空间

在这里插入图片描述

3 方法

描述应该具有的功能。

比如:Math类:sqrt() \ random() \ …
Scanner类:nextXxx() \ …
Arrays类:sort() \ binarySearch() \ toString() \ equals() \ …

3.1 声明格式

权限修饰符 返回值类型 方法名(形参列表){
方法体
}

举例

public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}

3.2 说明

  1. 关于权限修饰符:默认一般使用public。
  2. 返回值类型:有返回值 vs 无返回值
    如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中需要使用return关键字来返回指定类型的变量或常量“return 返回值;”。
    如果方法无返回值,则方法声明时,使用void来表示,且不需要return。若要强行使用,只能用“return;”来表明结束此方法。
  3. 方法名:属于标识符,遵循标识符的规则与规范。
  4. 形参列表:方法可以声明0个、1个或多个形参。
    格式:数据类型1 形参1,数据类型2 形参2,…
  5. 方法体:方法功能的体现。
  6. 方法的使用中,可以调用当前类的属性或方法。
    特殊的:方法A又调用了方法A:递归方法。
    方法中不可以定义方法。

3.3 return关键字的使用

  1. 使用范围:使用在方法体中。
  2. 作用:
    ①结束方法;
    ②针对于有返回值的方法,使用“return 返回值”方法返回所需要的数据。
  3. return关键字后面不可以声明执行语句。

3.4 方法的重载

定义:在同一个类中,允许存在一个以上的同名方法,只要它们的形参个数类型不同即可。
举例

public void eat(int n){}
public void eat(int n,int m){}
public void eat(String n){}

以上三种方法互为重载。

如何确定类中的某一个方法的调用
依照方法名—>参数列表

3.5 可变个数形参的方法

  1. 格式:数据类型 … 变量名;
  2. 当调用可变个数形参的方法时,传入的参数可以是:0个、1个、n个;
  3. 可变个数形参的方法与方法名相同,形参类型不同的方法构成重载;
  4. 形参类型相同则不构成重载;
  5. 可变个数形参的方法必须声明在末尾,即优先级最低;
  6. 可变个数形参只能声明一个。

举例

public void show(int ... strs){
    //使用数组遍历的方式调用每个strs。
    for(int i = 0;i<strs.length;i++){
    System.out.println(strs[i]);
    }
}

3.6 Java的值传递机制

形参:方法定义时,声明的小括号里的参数
实参:方法调用时,实际传递给形参的数据

规则

如果变量是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
如果变量是引用数据类型,此时实参赋给形参的是实参存储数据的地址值

3.7 递归方法

定义:一个方法体内调用它自身。

如何理解递归方法

方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。
递归一定要朝已知方向递归,否则就变成了无穷递归。

举例

//计算1-n的和
public int getSum(int n){
        if(n==1){
            return 1;
        }else{
            return n + getSum(n-1);
        }
}

4 面向对象的特征一:封装与隐藏

4.1 为什么要引入封装性

程序设计追求“高内聚、低耦合”。隐藏对象内部的复杂性,只对外公开简单的接口,这就是封装性的设计思想。

4.2 封装性的体现

体现一:

将类的属性xxx私有化(private),同时,提供公共(public)的方法来获取(getXxx)和设置(setXxx)属性值

体现二:不对外展示的方法

体现三:单例模式(将构造器私有化)

体现四:如果不希望类在包外被调用,可以将类设为缺省的。

4.2 Java规定的四种权限修饰符

1.权限修饰符的排序(从小到大):

private < 缺省 < protected < public

2.具体的修饰范围

修饰符类内部同一个包不同包的子类同一个工程
privateYes
(缺省)YesYes
protectedYesYesYes
publicYesYesYesYes

3.说明:
4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类。

修饰类的话,只能用:缺省、public

5 类的结构:构造器

5.1 构造器的作用

1.创建对象

2.初始化对象的信息

5.2 使用说明

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

5.3 举例

public class Student {
    String name;
    int age;
    String school;
    String major;

    public Student(){}

    public Student(String n,int a){
        name = n;
        age = a;
    }

    public Student(String n,int a,String s){
        name = n;
        age = a;
        school = s;
    }

    public Student(String n,int a,String s,String m){
        name = n;
        age = a;
        school = s;
        major = m;
    }
}

6 属性赋值的顺序

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

以上的先后顺序为:1 - 2 - 3 - 4

7 JavaBean

所谓JavaBean,是指符合如下标准的Java类:

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

8 关键字:this

范围:属性、方法;构造器

理解:this意为当前对象 或 当前正在创建的对象
通常情况下省略"this",当形参与类的属性同名时,则需要使用this.变量的方式声明该变量是属性

8.1 this调用构造器

  1. 在类的构造器中可以显式的使用 this(形参列表) 方式,调用本类中指定的其他构造器
  2. 构造器不能用这种方式调用自己
  3. 如果一个类中有n个构造器,则最多有n-1个构造器使用了该港式
  4. 规定: **this(形参列表)**必须声明在当前构造器的首行
  5. 构造器内部,最多只能声明一个 this(形参列表),用来调用其他构造器。

9 关键字:package/import

9.1 package的使用

9.1.1 使用说明
  1. 为了更好的实现项目中类的管理,提供包的概念
  2. 使用package声明类或接口所属的包,声明在源文件的首行
  3. 包,属于标识符,遵循标识符的命名规则、规范
  4. 每" . "一次就代表一层文件目录。
9.1.2 举例

MVC设计模式:在这里插入图片描述

9.1.3 JDK中主要的包介绍

在这里插入图片描述

9.2 import使用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值