面向对象的基本理解

一、面向对象的三大基本特征以及五大原则

三大基本特征:

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)

  不应强迫客户端实现一个它用不上的接口,或是说客户端不应该*依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!

比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

大部分内容来自:

https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%802%E5%BC%80%E6%94%BE%E5%B0%81%E9%97%AD%E5%8E%9F%E5%88%99ocp

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.