Java 面向对象进阶内容

目录
== 和 equals 方法== 代表比较双方是否相同 。

  • 比较基本类型,表示 值相同
  • 比较引用类型,表示 地址相等 即为同一对象
Object类中定义有: public boolean equals(Object obj) 方法,提供定义“ 对象内容相等 ”的逻辑
Object 的 equals 方法默认就是比较两个对象的 hashcode,是同一个对象的引用时返回 true 否则返回 false 。可以根据自己的要求重写equals方法 。
封装需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装 。即封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节 。
编程中封装的具体优点:
  • 提高代码的安全性 。
  • 提高代码的复用性 。
  • “高内聚”:封装细节,便于修改内部代码,提高可维护性
  • “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作 。
多态多态指的是 同一个方法调用 ,由于对 象不同 可能会有 不同的行为  。现实生活中,同一个方法,具体实现会完全不同 。比如:同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭 。
多态的要点:
  • 多态是方法的多态,不是属性的多态( 多态与属性无关 ) 。
  • 多态的存在要有3个必要条件: 继承,方法重写,父类引用指向子类对象 。
  • 父类引用指向子类对象后,用该父类引用调用子类 重写 的方法,此时多态就出现了 。
抽象类和抽象方法抽象方法使用 abstract 修饰的方法, 没有方法体,只有声明  。定义的是一种“规范”,就是告诉 子类 必须要给抽象方法提供具体的 实现 。
抽象类【Java 面向对象进阶内容】包含抽象方法的类就是抽象类 。通过 abstract 方法定义规范,然后要求子类必须定义具体实现 。通过抽象类,我们就可以做到 严格限制子类的设计 ,使子类之间更加通用 。
抽象类的使用要点
  1. 有抽象方法的类只能定义成抽象类
  2. 抽象类不能实例化,即不能用new来实例化抽象类 。
  3. 抽象类可以包含属性、方法、构造方法 。但是构造方法不能用来new实例, 只能用来被子类调用 。
  4. 抽象类只能用来被继承 。
  5. 抽象方法必须被子类实现
接口为什么需要接口? 接口和抽象类的区别?
  • 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束 。全面地专业地实现了: 规范和具体实现的分离 。
  • 抽象类还提供某些具体实现, 接口不提供任何实现 ,接口中所有方法都是抽象方法 。接口是 完全面向规范的 ,规定了一批类具有的公共方法规范 。
  • 接口和实现类不是父子关系,是实现规则的关系 。比如:定义一个接口Runnable,Car实现它就能在地上跑,Train实现它也能在地上跑,飞机实现它也能在地上跑 。就是说,如果它是交通工具,就一定能跑,但是一定要实现Runnable接口 。
接口使用[访问修饰符]interface 接口名[extends父接口1,父接口2…]{常量定义;方法定义;}
  • 访问修饰符:public 或默认
  • extends:可多继承
  • 常量:接口中的属性只能是常量,总是:public static final 修饰 or 省略
  • 方法:接口中的方法只能是:public abstract or 省略
  • JDK1.7之前,接口中只能包含静态常量、抽象方法, 不能有普通属性、构造方法、普通方法 。
  • JDK1.8后,接口中包含普通的静态方法
内部类内部类的作用:
  1. 内部类提供了更好的封装 。 只能让外部类直接访问 ,不允许同一个包中的其他类直接访问 。
  2. 内部类可以 直接访问外部类的私有属性 ,内部类被当成其外部类的成员 。但 外部类不能访问内部类 的内部属性 。
  3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整 。


    推荐阅读