java学习--面向对象Ⅱ

面向对象Ⅱ

多态

相关知识

软件设计六大原则

  • 单一职责原则:一个类或一个方法只做一件事,只拥抱一种变化

  • 里氏替换原则:能使用父类的地方就一定可以使用子类

  • 依赖倒置原则:底层应该是依赖高层,高层不应该依赖底层,实现应该依赖抽象

  • 接口隔离原则:应该依赖最小接口

  • 迪米特法则:只和有关系的类进行通信

  • 开闭原则:扩展开放,修改关闭

概述

多态:多形态

java中提供了两种多态机制

  • 编译时多态:是静态的,主要是指方法重载,根据传入不同的参数做出不同的响应

  • 运行时多态:时动态的,主要指动态绑定来实现,是我们现在的重点

多态核心:父类引用指向子类对象

  • 父类引用:就是父类类型创建的引用变量

  • 指向:就是可以找到谁

  • 子类对象:子类的实例化对象

通过父类创建的引用类型变量,保存了子类对象的内存地址

父类 变量 = new 子类();

如何使用

 
public class Poly_01 {
     public static void main(String[] args){
         SupClass sup = new SubClass();
         sup.m1();
     }
 }
 class SupClass{
     public void m1(){
         System.out.println("父类m1");
     }
 }
 class SubClass extends SupClass{
     @Override
     public void m1(){
         System.out.println("子类m1");
     }
 }

应用场景和优点

  • 如果一个功能只对应一种实现,就不使用多态

  • 如果一个功能可能有多种实现,一定是多态

优点:低耦合,降低需求变动带来的代码变动风险

 // 用户类
 class User {
     // public void test(Cat cat) {
     // cat.eat();
     // }
     // public void test(Dog dog) {
     // dog.eat();
     // }
     public void test(Animal animal) {
         animal.eat();
     }
 }
 ​
 class Animal {
     public void eat() {
     }
 }
 ​
 // 猫
 class Cat extends Animal {
     public void eat() {
         System.out.println("猫吃鱼");
     }
 }
 ​
 // 狗类
 class Dog extends Animal {
     public void eat() {
         System.out.println("狗吃肉");
     }
 }
 class Pig extends Animal {
     public void eat() {
         System.out.println("猪拱白菜");
     }
 }
 ​

缺点

丢失子类特有的属性(父类没有子类有,就是特有)

多态进行属性调用

  • 父子类都没有:报错

  • 父子类都有:成员方法执行子类,其他执行父类

  • 父类没有子类有:报错,丢失子类特有属性

  • 父类有子类没有:父类

Instanceof

多态又叫向上转型

强制转换回子类类型,又叫向下转型

必须先发生向上转型,才能发生向下转型

抽象

概述

抽象:往往用来表示设计中得出的抽象概念,一般不会有具体的实体表示

比如动物,他只是一个抽象的概念,并没有一个具体的东西叫动物

所以动物就不能代表一个具体的实体,就意味着,动物类,是不能创建对象的,所以,此时动物类,应该定义为抽象类

abstract:修饰符,表示抽象的

abstract:修饰类为抽象类,并且抽象类不能创建对象,但是依然有构造方法,用于子类创建对象时调用(super()

abstract修饰的方法为抽象方法,抽象方法没有{} 方法体,用于被子类实现

抽象方法,必须在抽象类中,而抽象类中不一定有抽象方法

如何使用

注意

finalabstract不能同时修饰

因为final表示最终,不可修改,修饰的类不能被继承,修饰的成员方法不能被覆写

abstract表示抽象的,抽象类和抽象方法,就是用于被继承.被子类实现覆写的

接口

概述

接口是解决java中单继承导致功能变弱问题

一个类只能继承一个类,但是可以实现很多接口

使用接口,也可以发生多态,接口可以看做特殊的抽象类,完全抽象

接口中没有变量,只有常量public static final ,并且 psf可以省略

1.8之前,接口中没有其他方法,只有抽象方法和常量

1.8开始 新特性 接口中可以出现default方法和静态方法

由定义类关键字class改为interface

如何使用

  • 类和类 单继承 extends

  • 类和接口 多实现 implements,多个逗号隔开

  • 接口和接口之间 多继承,多个逗号隔开

继承和实现 可以同时存在,先继承,后实现

一个类实现接口后,需要实现所有的抽象方法;一个抽象类实现接口后,可以实现0~N个抽象方法;接口不能创建对象,并且没有构造方法

接口和抽象类的区别

如果某个功能通过抽象类和接口都能完成,优先使用接口

因为类和类是单继承,而类和接口是多实现

我们使用接口的话,会保留类继承,扩展性更强

扩展

Object

Objectjava提供的根类,所有类都直接或者间接继承Object

Object中的方法是所有类都有的

Object b = new xxx() 可以发生多态

toString

Equals(重要)

  • equals设计目的:用于比较两个对象是否相同,默认比较内存地址

  • ==:比较基本类型的时候,比较的是值的大小,而比较引用类型的时候,只能比较内存地址是否相同

Finalize

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值