Java面向对象

一、

1.(了解)面向过程 vs 面向对象

  • 不管是面向过程,面向对象,都是程序设计的思路
  • 面向过程:以函数为基本单位,适合解决简单问题。比如:开车
  • 面向对象:以类为基本单位,适合解决复杂问题。比如:造车
  1. 类,对象
  • 类:抽象类,概念上的定义
  • 对象:具体的,类的一个一个的实例
  • 面向对象完成具体操作功能的操作的三步流程(非常重要)

步骤一:创建类,并设计类的内部成员(属性和方法)

步骤二:创建类的对象。比如:Phone p1 = new phone();

步骤三:通过对象, 调用器内部声明的属性或方法,完成相关的功能

  • 对象的内存解析
  • 创建类的一个对象;创建类的多个对象;方法的调用的内存解析
  • Java中内存结构的划分
  • Java中内存结构划分为:虚拟机栈、堆、方法区;程序计数器、本地方法栈
    • 虚拟机栈:以栈帧为基本单位,有入栈和出栈操作;每个栈帧入栈操作对应一个方法的执行;方法内的局部变量会存储在栈帧中。
    • 堆空间:new 出来的结构(数组、对象):① 数组,数组的元素在堆中 ② 对象的成员变量在堆中。
    • 方法区:加载的类的模板结构。

3. 类的成员之一:属性(或成员变量)

  • 属性 vs 局部变量
    • 声明的位置
    • 内存中存放的位置
    • 作用域
    • 权限修饰符
    • 初始化值
    • 生命周期
  • 属性 <=> 成员变量 <=>field <=> 字段、域

4. 类的成员之二:方法

  • 方法的声明:权限修饰符 返回值类型 方法名(形参列表){ // 方法体}
    • 重点:返回值类型、形参列表
  • return关键字的使用

5. 再谈方法

5.1 方法的重载(overload)

  • 方法的重载的要求:“两同一不同”
  • 调用方法时,如何确定调用的是某个指定的方法呢?① 方法名 ② 形参列表

5.2 可变个数形参的方法

  • 格式:(int ... args)

5.3 方法的参数传递机制:值传递(重点、难点)

> 如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参。
> 如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参。

5.4 递归方法

  • 递归方法构成了隐式的循环
  • 对比:相较于循环结构,递归方法效率稍低,内存占用偏高。

6. 对象数组

  • String[] ;Person[] ; Customer[]

7. package、import关键字的使用

  • package:指明声明的类所属的包。
  • import:当前类中,如果使用其它包下的类(除java.lang包),原则上就需要导入。

8. oop的特征之一:封装性

Java规定了4种权限修饰,分别是:private、缺省、protected、public。
我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。

举例:

> 场景1:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改
> 场景2:将类中不需要对外暴露的方法,设置为private
> 场景3:单例模式中构造器private的了,避免在类的外部创建实例。(放到static关键字后讲)

上理论:程序设计的原则之一

理论上:
  -`高内聚`:类的内部数据操作细节自己完成,不允许外部干涉;
    (Java程序通常以类的形态呈现,相关的功能封装到方法中。)
  -`低耦合`:仅暴露少量的方法给外部使用,尽量方便外部调用。
    (给相关的类、方法设置权限,把该隐藏的隐藏起来,该暴露的暴露出去)

9. 类的成员之三:构造器

  • 如何定义:权限修饰符 类名(形参列表){}
  • 构造器的作用:① 搭配上new,用来创建对象 ② 初始化对象的成员变量

10. 三个小知识

10.1 类的实例变量的赋值过程(重要)

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

2. 这些位置执行的先后顺序是怎样?
① - ② - ③ - ④/⑤

10.2 JavaBean

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

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

二、

1. this关键字的使用

  • this调用的结构:属性、方法;构造器
  • this调用属性或方法时,理解为:当前对象或当前正在创建的对象。
public void setName(String name){ //当属性名和形参名同名时,必须使用this来区分
	this.name = name;
}

public Person(String name){
    this.name = name;
}

  • this(形参列表)的方式,表示调用当前类中其他的重载的构造器。

2. 面向对象的特征二:继承性

  • 继承性的好处
    • 减少了代码的冗余,提高了复用性;
    • 提高了扩展性
    • 为多态的使用,提供了前提。
  • Java中继承性的特点
    • 局限性:类的单继承性。后续我们通过类实现接口的方式,解决单继承的局限性。
    • 支持多层继承,一个父类可以声明多个子类。
  • 基础:class A extends B{}
  • 理解:子类就获取了父类中声明的全部的属性、方法。可能受封装性的影响,不能直接调用。

3. 方法的重写(override / overwrite)

  • 面试题:方法的重载与重写的区别?
    • 方法的重载:“两同一不同”
    • 方法的重写:
      • 前提:类的继承关系
      • 子类对父类中同名同参数方法的覆盖、覆写。

4. super关键字的使用

  • super可以调用的结构:属性、方法;构造器
  • super:父类的
  • super调用父类的属性、方法:
    • 如果子父类中出现了同名的属性,此时使用super.的方式,表明调用的是父类中声明的属性。
    • 子类重写了父类的方法。如果子类的任何一个方法中需要调用父类被重写的方法时,需要使用super.
  • super调用构造器:
    • 在子类的构造器中,首行要么使用了"this(形参列表)",要么使用了"super(形参列表)"。

5. (熟悉)子类对象实例化的全过程

  • 结果上来说:体现为继承性
  • 过程上来说:子类调用构造器创建对象时,一定会直接或间接的调用其父类的构造器,以及父类的父类的构造器,...,直到调用到Object()的构造器。

6. 面向对象的特征三:多态性

  • 广义上的理解:子类对象的多态性、方法的重写;方法的重载
    狭义上的理解:子类对象的多态性。
  • 格式:Object obj = new String("hello");   父类的引用指向子类的对象。
  • 多态的好处:减少了大量的重载的方法的定义;开闭原则
    • 举例:public boolean equals(Object obj)
    • 多态,无处不在!讲了抽象类、接口以后,会有更好的理解。
  • 多态的使用:虚拟方法调用。“编译看左边,运行看右边”。属性,不存在多态性。
  • 多态的逆过程:向下转型,使用强转符()。
    • 为了避免出现强转时的ClassCastException,建议()之前使用instanceOf进行判断。

7. Object类的使用

  • 根父类
  • equals()的使用
    • 重写和不重写的区别
    • 面试题: == 和 equals()
  • toString()的使用
    • Object中toString()调用后,返回当前对象所属的类和地址值。
    • 开发中常常重写toString(),用于返回当前对象的属性信息。

三、

1. 关键字:static

  • static:静态的,随着类的加载而加载、执行。
  • static用来修饰:属性、方法、代码块、内部类
  • 熟悉:static修饰的类变量、类方法与不使用static修饰的区别。
    • 类变量:类的生命周期内,只有一个。被类的多个实例共享。
  • 掌握:我们遇到属性或方法时,需要考虑是否声明为static的。

2. 单例模式(或单子模式)

  • 经典的设计模式有23种
  • 解决的问题:在整个软件系统中,只存在当前类的唯一实例。
  • 实现方式:饿汉式、懒汉式、枚举类等
  • 对比饿汉式和懒汉式
    • 饿汉式:“立即加载”,线程安全的。
    • 懒汉式:"延迟加载",线程不安全。
  • 需要会手写饿汉式和懒汉式

3. 理解main()方法

  • public static void main(String[] args){}
  • 理解1:作为程序的入口;普通的静态方法
  • 理解2:如何使用main()与控制台进行数据的交互。
    • 命令行:java 类名 "Tom" "Jerry" "123"

4. 类的成员之四:代码块

  • 分类:静态代码块、非静态代码块
  • 使用频率上来讲:用的比较少。
  • 静态代码块:随着类的加载而执行
  • 非静态代码块:随着对象的创建而执行

总结:对象的实例变量可以赋值的位置及先后顺序

① 默认初始化
② 显式初始化  或 ⑤ 代码块中初始化
③ 构造器中初始化

④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值

执行的先后顺序:
① - ②/⑤ - ③ - ④

5. 关键字:final

  • 最终的
  • 用来修饰:类、方法、变量(成员变量、局部变量)
    • 类:不能被继承
    • 方法:不能被重写
    • 变量:是一个“常量”,一旦赋值不能修改。

6. 关键字:abstract

  • 抽象的
  • 用来修饰:类、方法
    • 类:抽象类:不能实例化。
    • 方法:抽象方法:没有方法体,必须由子类实现此方法。

7. 关键字:interface

  • interface:接口,用来定义一组规范、一种标准。
  • 掌握:接口中可以声明的结构。
    • 属性:使用public static final修饰
    • 方法:jdk8之前:只能声明抽象方法,使用public abstract修饰
                 jdk8中:声明static方法、default方法。
                 jdk9中:声明private方法。
  • 笔试题:抽象类、接口的对比。

8. 类的成员之五:内部类

> 成员内部类的理解
> 如何创建成员内部类的实例
> 如何在成员内部类中调用外部类的结构
> 局部内部类的基本使用(关注:如何在方法内创建匿名局部内部类的对象)

9. 枚举类:enum

  • 掌握:使用enum关键字定义枚举类即可。

10. 注解:Annotation

  • 框架 = 注解 + 反射 + 设计模式
  • Java基础阶段:简单。@Override  、 @Deprecated、@SuppressWarnings
  • 元注解:对现有的注解进行解释说明。
    • @Target:表明可以用来修饰的结构
    • @Retation:表明生命周期
  • 如何自定义注解。

11. 包装类的使用

  • 掌握:基本数据类型对应的包装类都有哪些?
  • 掌握:基本数据类型、包装类、String三者之间的转换
    • 基本数据类型 <-> 包装类:自动装箱、自动拆箱
    • 基本数据类型、包装类 <-> String
      • String的valueOf(xxx)
      • 包装类的parseXxx(String str)

12. IDEA:快捷键和debug

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值