面向对象总结

it2022-05-05  107

什么面向对象

局部变量 成员变量

变量所处的位置的不同,分为局部变量和成员变量(全局变量、实例变量)

变量三要素: 变量类型 变量名 作用范围/声明周期

局部变量:

声明在方法中或者是代码块中的变量称之为局部变量。 只在当前声明的方法中有效 出了方法之后啥也不是 变量要声明之后 初始化之后才能被使用

成员变量:

声明位置: 类中 方法外

​ 在整个类当中都有效,要注意下面代码报错的原因是由于static的问题而不是成员变量的问题。

​ 在main方法中方法非static修饰的成员变量,需要在成员变量前加static修饰

成员变量都存在默认值:

​ 整形->0

​ 浮点型->0.0

​ 逻辑->false

​ 字符-> 空格 ‘\u0000’

​ 引用类型->null

代码块:

以一组大括号组成的一个代码段 代码块

递归

​ 一种编程技巧,程序中自己调用自己

​ 递归头 终止环节

​ 递归体

优势: 能够更快的写出代码 复杂度特别低

劣势: 特别消耗内存

凡是可以使用递归程序的都可以使用循环,但是能够使用循环的不一定能够使用递归

使用场景:数据结构和算法

能够做到栈帧复用的递归程序称之为尾递归

面向对象和面向过程的关系

面向对象: ​ 语言在发展过程中, ​ ​ 人开车 ​ 面向过程: ​ 1:买辆车 ​ 2:考驾照 ​ 3:打开车门 ​ 4:踩离合,打火 ​ 5:挂挡、松离合、踩油门 ​ 。。。。 ​ 将一个问题,分成N多个小步骤,按步骤 按照顺序依次完成 整个功能就完成 ​ 面向对象: ​ 对象: 对象可以帮助你完成一些功能或者是愿望 ​ 完成该功能中遇到的所有问题都和你无关 -> 更加轻松 ​ 驾驶员、人 ​ 车 ​

面向对象和面向过程不是相对的,而是相辅相成。

面向对象和面向过程的对比: ​

面对对象:宏观上把控整个事务的完成度以及事务走向。 是对象帮我们处理具体的问题,而对象是如何做的,和调用者无关,调用者只需要负责结果即可。 调用的复杂度降低。底层具体的实现思路还是过程式的。 面向过程:微观上更精细化的处理具体问题

类和对象的关系

​ 类中编写的内容有哪些?

​ 成员变量:从属于当前类的 ​ 方法:对象完成 功能

编写类: Person类: 将张三、李四。。。的相同的部分抽离出来: 外在的表现形式: 姓名、年龄。。。。 -> 成员变量 内在的功能: 能够做什么 -> 方法

​ java中如何创建对象?

创建的对象的方法: ​ 类名 变量名=new 类名();

创建对象要做的三件事:

1.开空间(在内存中开空间) 2.初始化(成员变量初始化) 3.指向引用 class类和对象的关系? 类: 分门别类。抽象的概念。祖先为了能够让后来的人更好的去认识这个世界,将各个具象的内容抽离出来一个一个的类。 对象: 将类中所有抽象的内容进行了具象化 。 现实生活中真实存在的。 类和对象: 类是对于对象的抽象,抽象就是抽取像的部分 对象就是对于类的具象化的体现。

​ 问题:

先有类还是先有对象? 如果是编写过程: 先有类 再有对象 如果是构建过程: 先有对象,将对象的共性抽离出来,外在、内在->类

面向对象的第一个程序

static

static用法

static叫做 静态的 共享的 所属于类的 类被加载的时候会优先加载静态内容 static修饰的内容只有一份,被所有的对象以及类共享,对于static修饰的内容改变,也被所有对象可见 static修饰的内容两种调用方式: 通过类名直接点 类名. (建议) 通过对象调用 对象. 如何在一个静态内容中调用非静态内容: 1:在非静态内容中加static 2:创建非静态内容的所属对象 通过对象调用 在非静态内容中调用静态方法: 1:可以直接调用, 非静态内容隶属于对象,如果非静态内容能够被调用,对象一定存在,对象存在证明类一定能被加载。 而类被加载,静态内容一定被加载。

问题:

什么时候类会被加载? 1:调用当前类中的静态方法 2:创建当前类的实例对象的时候

构造器

构造器

什么是构造器

在类中用来创建对象那个的方法称之为构造器 构造函数 构造方法

注意事项

1:构造器是一个特殊的方法:

a:方法名称和类名相同 b:方法无返回值 c:在方法中无须显示return返回数据 d:构造器是允许方法重载的 e:所有类默认情况下都会存在一个无参构造器,如果在当前类中显式的声明了构造器之后,无参构造器就不存在了

构造器的作用

构造器的作用就是用来创建对象的

构造器的调用只能通过new关键词去调用当给一个类中的成员变量的类型声明为基本数据类型之后,导致基本数据类型存在默认值。未赋值的情况下存在值,后续的逻辑可能存在问题。

this的用法

1. this.

当前对象的-》 谁在调用 代表谁

可省略: 不需要区分区分同名变量,局部变量和成员变量的时候可以省略不可省略: 区分同名变量,局部变量和成员变量不可以省略 \\为了区分同名变量这里的this 不能省略 public Student(String name) { this.name = name; }
2. this()
构造器之间的互相调用this()一定要在构造器的首行

引用类型进过方法

基本数据类型经过方法之后 其值不变。值传递引用数据类型进过方法之后 其值会变,值传递(地址值)通过两个变量指向了同一个内存地址,一个对内存进行改变 另一个可见

继承

继承的优势

在一定程度上提高了代码的复用性

什么是继承

子承父业, 将多个类中的共性再一次抽取,可以抽取为一个父类。父类的作用就是用来将一些重复的内容不再多次编写(提高代码复用性)

继承的编写

子类 extends 父类 (子类拥有父类中的所有的属性以及方法)

继承的注意事项

java中只支持单继承 一个子类有且只能有一个父类 复用性的提高是有限的

Q:多继承好还是单继承好?

多继承 :极大提高代码复用性 但是代码调用的复杂度也提升了 单继承:代码调用的复杂度比较低,但是复用性比较有限

假设在应用场景中: A->B 后期随着业务不断扩展,导致A需要继承C时一般的解决办法:A->B->C 但是该种解决办法随着后期业务的不断升级,导致整个继承连会变得极其复杂,既不利于后期维护以及拓展。 所以,能不能用继承就别用继承。

super的用法

当创建子类对象时 会先执行父类的构造器

super: 和this的用法一模一样

super. 表示当前对象的父类对象的

1.super.

可省略的: super和this的用法是重复的 都可以省略super. 不可省略 如果子类和父类中出现了同名变量或者是同名方法

2.super()

调用父类的构造器,默认情况下调用的父类的无参构造器(默认情况下每个类中都存再一个无参构造器 哪怕不写也存在)

当父类中存在其他构造器时,无参构造器不存在,此时如果再子类中没有通过super()显示的指定调用的构造器会导致程序报错。

在构造器中this()和super()不能同时出现,如果两个都不存在,默认是存在的super()。

方法重写

定义

在子类中定义了和父类中同名的方法 我们将该方法称之为重写方法(覆盖)

为什么需要重写?

父类的功能不能满足子类的需求。子类在父类的基础上进行了扩展。

如何确定一个方法是重写方法?

在子类的方法上加入@Overried 注解 如果不报错 证明是重写

重写的前提:

一定要发生继承关系。并且子类的方法名和父类的方法名同名参数列表要一样返回类型要一样

object类

什么是object

Object: 是所有类的根基类 超类 父类

当一个类没有显式的继承关系的时候,默认情况下他的父类都是Object

Object: ctrl+O 罗列当前类中的所有方法 finalize: gc回收垃圾时 自动调用finalize wait notify notifyAll --- 学习多线程时候会讲 clone: 克隆 (创建对象的一种方式 深浅复制) hashCode: 哈希码 -> 哈希算法 唯一的值 getClass:获取当前类的Class对象 反射 输出一个对象的时候默认情况下会调用当前对象的toString

==与equals的区别

== 比较基本数据类型比较的是值 比较引用类型比较的是地址equals:用来比较相等的 如果相等返回true 反之返回falseObject中的比较是通过==比较的

封装

四个修饰符

public 修饰的人见人爱型 都能访问 被public修饰的方法、类、变量能被所有类可见protected 同包下可见 异包下子类可见默认的: 不写 远亲不如近邻 同包下可见 异包下不可见private: 自私自利 本类可见 本类同包下子类同包下无关类异包子类异包无关类public√√√√√protected√√√√×默认的√√√××private√××××

修饰变量

局部变量只能通过final修饰

1:将类中的成员变量通过public 默认的 protected 修饰之后,导致在某些情况下 可以随意.出来。这些修饰符修饰的变量不够安全。2:将这些变量通过private 修饰。但是导致无法正常访问

修饰方法

修饰符的作用是用来屏蔽一些底层的实现逻辑,降低调用者(程序员)的复杂度。确保当前类更加安全。 修饰符可以修饰 类

属性(成员变量) : 避免随意.属性,修改获取属性 造成数据不安全 如果用private修饰的话 一定要保证对外提供get、set方法让外部可见方法屏蔽底层调用细节,降低调用者(程序员)的复杂度 使得代码更加健壮public private 比较常用

设计模式:

前人总结的(编码)套路 23种: 遵循5大原则,以开闭原则为基础 (模式推荐书籍:大话设计模式、设计模式之禅、ODD)

单例模式:

什么是单例:

一个类只能产生一个实例对象

什么场景下使用单例:windows 任务管理器 Spring SessionFactory

如何编写?

1:构造器私有2:对外提供过去对象的方法3:声明一个static的成员变量 类加载的时候创建当前单例对象4:在获取对象方法中返回成员变量的值

饿汉式

优缺点分析:

缺点: 不能做到延迟加载优点: 天然线程安全

注意:

public : 外界一定是通过该方法获取当前类的实例对象 所以对外一定要可见static : 构造器都私有了 外部肯定无法获取到当前类的实例对象 所以只能用 static修饰 属于类的 可以通过类名调用。不加static要通过对象调用 对象没有返回值 : 当前类的实例

懒汉式

优缺点分析:

lazy: 懒汉式 能够做到延迟加载 但是线程不安全

多态

多种形态

构成多态的前提条件:

1:继承关系2:父类变量指向了子类对象3:一定要有方法的重写 注意:编译看左边 运行看右边

代码块

{} 代码块:

局部代码块:

声明在方法中的代码块 缩减局部变量的生命周期 提高内存是使用率

成员代码块:

初始化块 声明在方法外 类中的代码块 初始化块在类加载的时候是不会执行的 在创建对象之前会被调用(对于对象中的一些初始进行初始化操作)

静态代码块:

声明在类中 方法外 且使用static修饰 类加载的时候就会被加载 并且只加载1次 静态内容

类中的执行顺序:

1:首先执行静态内容(加载) 静态代码块2:初始化块3:构造器

类加载:

使用当前类中的静态方法、静态变量创建当前类的实例对象

类型转换

自动转换

父类型 变量名 = 子类对象;【new 子类对象|子类对象的变量】

强制转换

子类型 变量名 = (子类型)父类变量; [事先确定了父类变量中实际存储的对象是什么类型]

错误提示:ClassCastException 类型转换异常


最新回复(0)