01. 面向对象的四个特性;对多态的理解(多态的实现以及多态在项目中的使用);
- 四个特性:
- 抽象:是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象。抽象只关注对象的哪些属性和行为,并不关心细节是什么;
- 继承:从已有类得到信息并创建新类的过程。
- 封装:隐藏一切可隐藏的东西,只向外提供简单的结构。
- 多态:允许不同类型的子类对象对**同一消息**做出不同的响应。
- 对多态的理解:
- 方法重载:在编译时的多态性;
- 方法重写:在运行时的多态性;
要实现多态主要要做的两件事:- 方法重写
- Fi obj = new Zi();
- 项目中对多态的运用:
Android开发中,Activity有一些共同的操作,比如说initView,getLayoutResId,initData,等基本通用操作,可以抽取在BaseActivity中,子类继承它,重写相应的方法。
02 面向对象和面向过程的区别?面向过程可以用面向对象实现吗?那是不是不能面向对象?
03 重载和重写区别
- 重载:发生在父类和子类之间。同名方法,参数列表不同(参数的类型不同,参数个数不同或者两者都不同),视为重载。
- 重写:发生在同一个类中。要求:1.方法范围类型相同;2.子类重写父类方法的访问权限比父类大。
04 面向对象开发的六个基本原则,迪米特法则,在项目中用过哪些?
-
六个基本原则:
- 单一职责:一个类只做他该做的事情(高内聚);
- 开放封闭:软件实体应该做到:对扩展开放,对修改关闭;
要做到开闭有两个要点:
1. 抽象。一个系统中如果没有抽象类或者接口,那么这个系统就没有扩展性。
2. 封装可变性。将系统中的各种可变因素封装在一个继承结构中,如果多个可变因素混在在一个在一起,系统将变得混乱; - 里氏替换:任何时候都可以用子类替换父类。因为子类一定是增加父类的能力,而不是减少父类的能力。
- 依赖倒置:面向接口编程。其实就是 声明方法参数类型、返回值类型、引用变量类型的时候,尽量使用抽象类型而不使用具体类型,因为抽象类型可以被他的任何一个子类替代。
- 合成聚合复用:优先使用合成或者聚合关系复用代码。
- 接口隔离:接口应该小而专,不应该大而全。臃肿的接口往往是一种接口污染,接口表示一种能力,那么接口应该也是高内聚的。
迪米特法则:
也叫最少知识法则。一个对象应当对其他对象有尽可能少的了解;项目中用到的原则:
单一原则。接口隔离。依赖倒置。
05 static和final的区别:
06 HashMap和HashTable的区别;HashMap中的key可以是任何数据对象或者数据类型吗?HashTable是线程安全的吗?
07 HasMap和ConcurrentHashMap的区别,ConcurrentHashMap线程安全吗?ConcurrentHashMap如何保证线程安全?
08 String有重写Object的hashcode和toString方法吗?如果重写equals不重写hashcode有什么问题?
09 String、StringBuffer、StringBuilder的区别和String的不可变性。
-
String、StringBuffer、StringBuilder的区别:
- 都是Final类,都不允许被继承;
- String长度不可变,StringBuffer和StringBuilder长度是可变的;
- StringBuffer是线程安全的,StringBuilder是线程不安全的 。但是他们的方式都是相同的,StringBuffer 主要是在StringBuilder的方法上添加了synchronized方法,保证线程安全。
- StringBuilder比StringBuffer更加高效。
- 重点:如果一个String类型的字符串,在编译的时候就确定了是常量,那么编译完成之后,字符串会自动拼接成一个常量,此时String的效率比StringBuffer、StringBuilder都要高;
-
String的不可变性:
- 被final修饰,不能被继承;
- 用+号连接字符串的时候会创建新的 字符串;
- String s =new String(“Hello Word”);//可能创建一个或者连个对象。因为 如果静态区中有“Hello Word”,那么仅在 堆 中创建对象;如果静态区中没有,那么堆和静态区都将创建对象;
- 在java中,如果用+号来拼接字符串,那么底层将通过StringBuilder的append方法来实现。