一、面向对象的三大基本特征以及五大原则
三大基本特征:
1、 封装:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问;只能通过规定的方法访问数据;隐藏类的实例细节,方便修改和实现;(对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。)
访问修饰符 |
本类 |
同包 |
子类 |
其他 |
private |
✔ |
|||
dafule |
✔ |
✔ |
||
protected |
✔ |
✔ |
✔ |
|
public |
✔ |
✔ |
✔ |
✔ |
2、 继承:
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为,子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用; (java中的继承是单继承,即一个类只有一个父类);
只要在子类加上extends关键字继承相应的父类:
Class 子类 extends 父类{
方法体
}
子类不能继承父类的private成员以及父类的构造方法
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。(Object类中的方法,适合所有子类!!!)
优点:提高了代码的复用性以及维护性
缺点:耦合增加
3、 多态:
多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态存在的三个必要条件:
- 继承
- 重写(子类继承父类后对父类方法进行重新定义)
- 父类引用指向子类对象
多态的优点:
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
五大基本原则:
1、单一职责原则(SRP)
一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
2、开放封闭原则(OCP)
对象或实体应该对扩展开放,对修改封闭。
3、里氏替换原则(LSP)
比如,假设有两个类,一个是Base类,另一个是Child类,并且Child类是Base的子类。那么一个方法如果可以接受一个基类对象b的话:method1(Base b)那么它必然可以接受一个子类的对象method1(Child c).
里氏替换原则是继承复用的基石。只有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才能真正的被复用,而衍生类也才能够在基类的基础上增加新的行为。
但是需要注意的是,反过来的代换是不能成立的,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。如果一个方法method2接受子类对象为参数的话method2(Child c),那么一般而言不可以有method2(b).
4、依赖倒置原则(DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对抽象(接口)编程,而不是针对实现细节编程。
5、接口隔离原则(ISP)
不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!
比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
大部分内容来自:
OOA:面向对象分析
OOP:面向对象编程
OOD:面向对象设计
AOP:面向切面编程
二、局部变量和全局变量的区别
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
以上内容来自:https://blog.csdn.net/u012979602/article/details/78334246
三、OO中先有对象还是先有有类?
OOP中:类的定义:类(Class)实际上是对某种类型的对象定义变量和方法的原型。是具有相同属性和操作的一组对象的集合!它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。看到这里,已经无需多言,标准答案,是先有对象,再有类。
大佬有详细说明:
https://www.cnblogs.com/kubixuesheng/p/4132116.html
1、 在实例化对象时(new 对象),构造方法会进入方法区并开辟空间;而通过this或者super来调用构造方法时,相当于调用的方法进入方法区,并没有开辟空间;值得一提的是,这里在《JAVA编程思想》中有点小出错,它把构造方法归为静态方法,构造方法具有静态方法的一些特点,但并不属于静态方法;
2、 今天问了老师一个问题,这个问题我本应该先去思考,查看源码,虽然是个小问题,但也体现了我的基础上很多不足,以及思考方式的错误,况且以前还是学过以及看过源码,都给忘了;
在这个Teacher类中,我重写了toString方法,以前一直没有当回事,直接实例化对象后,把引用变量输出了,并未调用这个重写了的toString方法,
那么为什么没有调用这个重写了的toString还是会输出toString的内容了?从源码上看来:
是不是有点懂了?那就把它看懂并且去理解这种方式,试着去举一反三:
我们在上图的valueOf的源码看来:
原来这个valueOf已调用了toString方法,而回到开头我们讲的
图片上的第二行相当于第三行,直接输出teacher引用变量调用的并不是Teacher类里我们重写的toString方法,而是println里的toString.