面向对象总结
Posted 我来自火星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象总结相关的知识,希望对你有一定的参考价值。
我认为封装解决了代码的私密性,继承解决相同代码复用,多态解决不同代码的使用。
面向对象是一种思维方式。类就相当于模板,对象相当于具体实例,类的方法和属性是先于对象。在内存分析中,类是加载代码时就存在堆内存中的方法区,而对象是在new后才存在是堆内存中,栈内存存在变量名称和方法名称。new的实质是调用类中的构造器,用于初始化值,构造器有不同重载,可用于不同参数列表的初始化。面向对象的三大特征,封装是为了保密和安全,属性私有,只暴露少量的方法供外面使用。继承是父子关系的类,提高代码的利用,父类的方法,子类可以直接使用。多态,也是为了提高代码的利用,可以使用多态用于方法参数和返回值,避免了使用重载重复。类在不同位置可有不同特点。
什么是面向对象
本质是以类的方式组织代码,以对象的形式组织(封装)数据。
方法的定义
- 修饰符
- 返回类型
- break:跳出switch,for循环,return:结束方法,返回值
- 方法名:
- 参数列表:参数类型,参数名 ...
- 异常抛出
方法的调用
- 静态方法
- 非静态方法
- 形参和实参
- 值传递和引用传递
- this关键字
创建与初始化对象
new
分配内存空间,默认初始化以及调用类中的构造器。
构造器
new调用相应构造器,用于实例化初始值
特点
- 必须与类的名字相同
- 必须没有返回类型,也不能写void
注意:定义了有参构造器,想用无参构造器,必须显式定义无参构造器。
创建对象内存分析
类与对象
- 类是一个模板,对象是一个具体的实例。
- 对象是通过引用来操作,堆-->栈(地址)
- 类的结构:成员变量(默认初始化),方法(定义和调用)
封装
数据的隐藏
高内聚:类内部数据操作细节自己完成
低耦合:暴露少量方法供外部使用。
属性私有(private):get/set
。可用于数据安全性的判断。
继承
extends
子类与父类是一个"is a"关系,子类拥有父类的所有方法。
object
类
final 修饰的类不能继承
没有多继承,但是接口可以多继承。
super
super()
调用父类构造器,必须要在子类构造器的第一行。
子类调用父类属性和方法。父类权限在public,protected
.
方法重写(override)
需要有继承关系,子类重写父类方法。
- 方法名必须相同。
- 参数列表必须相同。
- 修饰符:范围可以扩大,但不能缩小。
public>protected>default>private
- 抛出异常:范围可以缩小,但不能扩大。
父类的引用指向子类
静态方法与非静态方法的区别:
静态方法:方法的调用只和左边定义的数据类型有关。两种状态:多态。
非静态方法:重写。只与子类方法有关。
不能重写:
static
方法,属于类,不属于实例final
常量private
方法
多态
即同一方法可以根据发送对象的不同而采取多种不同行为方式。
存在条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
instanceof
类型转换,引用类型,用于判断一个对象是什么类型。
X instanceof Y
:编译能不能通过看X引用与Y是否有关系,true 还是 false注意看X的对象是Y的什么关系。
类型之间的转化:
-
父换子,需要强制转换,才能使用子类的方法。
-
子转父,自动转化,可能丢失自己本来的一些方法。
方便方法的调用,减少重复代码。
Static
加载顺序:静态代码块(只执行一次),匿名(非静态)代码块(创建对象执行),构造方法。
静态导入包:
import static java.lang.Math.random;
抽象类
abstract-可修饰方法,也可修饰类。
抽象方法,只有方法的声明,没有方法体。
有抽象方法的类必须申明抽象类。
抽象类不能使用new创建对象,只能子类继承。且子类必须实现抽象方法,否则申明为抽象类。
接口interface
需要通过实现类implements
接口,可以多继承
只有规范,实现约束与方法的分离。
所有的方法定义默认都是 public abstract
,所有变量默认都是常量,public static final
内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
以上是关于面向对象总结的主要内容,如果未能解决你的问题,请参考以下文章