今天复习了一下JavaSE,重新巩固并理解了一下面向对象编程,JDK&JRE,方法等等一些基础知识。
OOP
面向对象(OOP)是什么
用百度百科的话来说就是以建立模型体现出来的抽象思维过程和面向对象的方法,是一种编程思维,也是一种思考问题的方式。说白了就是使用对象进行程序设计,本质就是以类的方式组织代码,以对象的形式封装数据。
与SP(面向过程)的对比
面向过程 | 面向对象 | |
设计思路 | 自顶向下、层次化、分解 | 自底向上、对象化、全局 |
程序单元 | 函数模块 | 类(对象) |
两者关系 | 具体执行的流程 | 设计的框架 |
总结:用面向对象的思路去分析整个系统,然后具体到微观操作仍然使用面向过程的思想去处理,即先整体,再局部,先抽象,再具体,能做什么,再怎么做,而怎么做就需要将其分解成函数(使用SP的思路去解决)。
抽象
对象是OOP的核心部分,具有明确定义的状态和行为,是类的一个实例,是具体的事物。
类=属性+方法。它描述一类对象的行为和状态,是一组具有相同特性(属性)与行为(方法)的事物集合,是抽象的,是对对象的抽象,所以可以说先有对象才有类。
不过从运行的角度来看,是先有类后有对象,类是对象的模板,通过接口来实现。
三大特性
封装
把对象包(封)装起来,有选择性地公开或隐藏某些信息,然后对外留一个接口,方便使用访问。优点在于模块化、信息隐藏、代码重用、插件化易于调试、具有安全性。一般通过private私有化属性,使得其他对象不能直接访问属性,通过get/set方法对封装的属性进行操作。这里就要说一下成员变量和局部变量了。
成员变量和局部变量的区别
参数及方法内定义的变量是局部变量,
属性是成员变量:private String name;int id;
1.在类中的位置不同
成员变量:在类中定义
局部变量:在方法中定义或者方法的参数
2.在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
3.生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4.初始化值不同
成员变量:有默认初始化值,引用类型默认为null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
继承
继承指子类拥有父类的所有属性和方法,并且可以对其方法进行重写,只能单继承,可以多重继承。
父类是被继承的类(超类),继承父类的类是子类(派生类)。
让类与类产生联系,是多态的前提,子父类用extends实现,使用super调用父类的属性、方法和构造方法。
方法重写与重载
有时候子类继承自父类的方法不适合或需要修改,这时就可以自己编写继承的方法,这种方式就称为方法的重写又称方法覆盖。当调用方法时会优先调用子类的方法。
方法重载:即在一个类中,有相同的函数名称,但形参不同的函数。
面试:重写重载的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写则是运行时的多态性。重载发生在类中,同名的方法如果有不同的参数列表那就是重载(参数类型或参数个数都不同或单个不同);重写发生在子类和父类中间,重写子类被重写的方法与父类有相同的参数列表、兼容的返回类型、比父类被重写方法更好访问、不能比父类被重写方法声明更多的异常。
重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
多态
多态是以封装和继承为基础的。指同一函数在不同的类中有不同的实现,即“一个接口,多个方法”;多态的好处就是使类更灵活,更便于扩充。
父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式,称之为多态性。其可以大致分为两类:方法的重载与重写以及对象的多态性。
对象的多态性
对象多态性是从继承关系中的多个类而来。向上转型:将子类实例转为父类引用;向下转型:将父类实例转为子类实例。
注意:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
Java八大数据类型及其封装类
基本类型和对应的封装类由于本质的不同,有一些区别:
- 基本类型只能按值传递,而封装类按引用传递。
- 基本类型会在栈中创建,而对于对象类型,对象在堆中创建,对象的引用在栈中创建,基本类型由于在栈中,效率会比较高,但可能存在内存泄漏的问题。
接口
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范,约束和实现分离:面向接口编程
接口本质就是规范,定义的是一组规则,就像法律一样,大家都遵守。
OO的精髓,是对对象的抽象,最体现这一点的就是接口,比如设计模式所研究的实际上就是如何合理的去抽象。
内部类
内部类就是在一个类的内部定义的类。
成员内部类:内部类对象依赖外部类对象而存在,即在创建一个普通内部类对象时首先需要创建其外部类对象。内部类对象可以访问外部类对象中所有访问权限的字段,同时,外部类对象也可以通过内部类的对象引用来访问内部类中定义的所有访问权限的字段
局部内部类:把类放在方法内定义(不常用,匿名内部类可以显示局部内部类的功能)。
在局部内部类里面可以访问外部类对象的所有访问权限的字段,而外部类却不能访问局部内部类中定义的字段
静态内部类:静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。静态内部类中无法访问外部类的非静态成员。
匿名内部类:匿名内部类就是没有名字的内部类。
部分参考:https://www.cnblogs.com/zsql/p/11115244.html
暂时先聊这么多,后续看情况继续更新,有什么问题请回我。希望一键三连!