【javaSE】面向对象程序设计

面向对象和面向过程的区别

面向过程

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展

面向对象

是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低

面向对象的三大特性:封装、继承、多态

java语言是如何实现多态的

学习网址:https://cloud.tencent.com/developer/article/1447574

  1. 子类继承父类
  2. 实现接口

重载和重写的区别

重写

  1. 发生在父类与子类之间
  2. 方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
  3. 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
  4. 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

重载

  1. 重载Overload是一个类中多态性的一种表现
  2. 重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
  3. 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

面试:重载和重写的区别

答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

接口和抽象类的异同

相同点

  1. 抽象类和接口都不能被实例化,但可以定义抽象类和接口类型的引用。

  2. 一个类如果继承了抽象类和接口,必须要对其中的抽象方法全部实现。(接口中方法默认的是public abstract修饰的)否则该类仍然需要被声明为抽象类。

不同点

  1. 抽象类可以有构造方法,抽象方法和具体方法。
    接口不能有构造方法,而且其中的方法全部都是抽象方法。(接口中方法默认的是public abstract修饰的)
  2. 抽象类中的成员可以使private、默认、protected、public的。
    接口中的成员全部都是public的。
  3. 抽象类可以 定义成员变量。
    接口中定义的成员变量其实都是常量。(接口中的成员变量默认是public static final 修饰的 )

总结

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

对象相等的判断

Java语言不支持运算符重载。Java规定,在设计一个类时,编写名为equals的方法成员,用于判断两个对象是否相等。设M是已经定义的类,通常把M类的equals方法设计成:

boolean equals(M t)
    {   if(this所指向的实例 与 t所指向的实例 相等)
            return true;
        else
            return false;
    }

其中,if语句中的判定条件由程序员编写代码设定。

== VS equals

  • “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
  • equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。

值传递和引用传递的区别的什么?为什么说Java中只有值传递?

值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。

引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

基本类型作为参数被传递时肯定是值传递;引用类型作为参数被传递时也是值传递,只不过“值”为对应的引用。

hashcode的用法,以及和equals的关系

hashcode

该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)true。可以推出obj1.hashCode()obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。

内部类的作用,有哪些分类

将一个类定义在一个类或者一个方法里面,这样的类称着内部类

  1. 成员内部类
    成员内部类是最普通的一种内部类,成员内部类可以访问外部类所有的属性和方法。但是外部类要访问成员内部类的属性和方法,必须要先实例化成员内部类。
    注意:成员内部类里面不能包含静态的属性和方法
    image

  2. 静态内部类
    静态内部类就是在成员内部类多加了一个 static 关键字。静态内部类只能访问外部类的静态成员变量和方法(包括私有静态)
    image

  3. 匿名内部类
    匿名内部类:顾名思义就是没有名字的类。什么时候用到匿名内部类呢?在Android中最常见得回调监听事件 就是匿名内部类
    image
    image

  4. 局部内部类
    局部内部类就是定义在代码块内的一个内部类。比如在方法里面定义一个内部类,就是局部内部类。
    局部内部类的作用范围仅仅就在它所在的代码块里。局部内部类不能被public ,protected,private以及static修饰,但是可以被final修饰。
    image

内部类的作用

  1. 内部类可以很好的实现隐藏。
    非内部类是不可以使用private和protected修饰的,但是内部类却可以,从而达到隐藏的作用。同时也可以将一定逻辑关系的类组织在一起,增强可读性。
  2. 间接的实现多继承。
    每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。所以说内部类间接的实现了多继承。

子类初始化的顺序

① 父类静态代码块和静态变量。
② 子类静态代码块和静态变量。
③ 父类普通代码块和普通变量。
④ 父类构造方法。
⑤ 子类普通代码块和普通变量。
⑥ 子类构造方法。

深拷贝VS浅拷贝

针对的是对象类型(对象,数组,函数)
浅拷贝拷贝的对象的成员中的基本类型(8大基本类型,见Java之基本类型和引用类型、引用传递和值传递、“”和equals())与原来的的值相同,但是物理地址与原来不同,及拷贝成员与原成员“equals”为True而“”为False。但是对象类型的成员则不同,我们知道对象名是引用,而拷贝成员和原成员引用地址相同。
基本类型真拷贝,引用类型假拷贝

深拷贝对基本类型的成员与浅拷贝相同,对对象类型的成员与深拷贝不同。它首相将对象类型的成员所引用的对象拷贝到新的地址,然后将该新的对象的的引用赋值给对应的对象类型的成员。
基本类型真拷贝,引用类型真拷贝
实现深拷贝

  • 实现Cloneable接口实现深拷贝
  • 序列化实现深拷贝

设计模式:

https://design-patterns.readthedocs.io/zh_CN/latest/
(重点掌握核心关键的几个,比如工程模式、单例模式、代理模式、策略模式等等)

posted @ 2022-12-27 23:39  沫漓fighting  阅读(24)  评论(0)    收藏  举报