Final、覆写、多态、抽象、接口

多态

1、多态是什么

父类引用指向子类对象
父类引用:指的是 用父类型声明的引用类型变量
指向:通过内存地址可以找到哪个对象
子类对象:new子类 创建的堆内存对象
子类 变量=new  子类();
Cat c= new Cat();
父类类型 变量名 =new  子类();
Animal  a=new Cat();

2、相关知识

软件设计六大原则 :

1 单一职责原则 : 功能单一,只拥抱一种变化

2 里氏替换原则 : 能使用父类的情况下,一定可以使用子类

因为继承,父类有的功能,子类都有

3 依赖倒置原则 : 细节应该依赖抽象,而抽象不应该依赖细节

4 接口隔离原则 : 先不管

5 迪米特法则 : 最少知识原则,和其他类或对象,尽可能有更少的了解

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

3、优点:

同一操作,作用于不同对象,可可以有不同的解释,产生不同的结构,这就是多态性

当一件事会有多种不同实现方式的时候,我们选择依赖高层,来拥抱多种变化

本质还是降低类和细节之间的耦合度

缺点:丢失了子类特有的属性 

语法:

 多态的缺点:丢失子类的特有属性
多态进行属性调用:
  如果父类没有,直接报错,不管子类有没有
    如果父类有,子类没有,直接执行父类
  父类子类都没有,成员方法执行子类,因为成员方法可以覆写,其他的都执行父类
       

多态的几种形式:

// 1 直接多态
        Sup sup = new Sub();
        // 2 形参和实参,方法参数列表为父类类型,调用方法传入子类对象
        m1(new Sub());
        // 3 返回值多态,返回值类型是父类类型,但是返回子类对象
        Sup result = m2();

2、Final

1、是什么:final是个修饰符,表示最终的,不可更改的

2、能做什么:final修饰的类 不能被继承

final修饰的成员方法 不能被覆写

final修饰的变量 不能二次赋值 没有默认值 必须显示赋值

一般我们把final修饰的变量叫做常量,也就是public static final 数据类型 变量名=值;

3、类的final变量和普通变量有什么区别?

  当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

instanceof 

 3、abstract(抽象)

abstract : 修饰符,修饰的类,是抽象类,修饰的是抽象方法
*
*抽象类,不能实例化对象
*抽象方法 ,没有方法体,只定以功能,没有功能实现,并且抽象方法必须在抽象类中
*反之,抽象类中,可以没有抽象方法、
*abstract不能和final同时出现
*1.abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

2.abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。

注意:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。
abstract修饰符在修饰类时必须放在类名前。

abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。

注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。

4、interface(接口)

*接口 可以完全理解为完全抽象的一个类,类名只有抽象方法和常量
*但是1.8开始,允许出现静态方法和默认方法
*语法 修饰符 interface 接口名
*接口中的抽象方法,不需要加abstract修饰,方法默认但是public abstract
*接口中,没有变量,只有常量,并且public static final可以省略
*类和接口之间,不再是继承关系,变成了实现关系,由extends换成了implements
*接口名 变量=呢哇 子类实现类() 也是会发生多态的
*一个类 只能继承一个类,但是可以实现N个接口,以逗号隔开,可以解决单继承功能变弱问题
*class类名 implements接口1,接口2,接口3....{}
*接口和接口之间是多继承,多个 以逗号隔开
*interface 接口名extends 父接口名1,父接口名2...{}
*一个类如果实现了一个接口,那么必须实现接口中所有的抽象方法,否则该类需要加abstract修饰
*一个抽象类,实现一个接口,可以实现0-N个抽象方法
*1.7 只能有抽象方法
*1.8可以有静态方法,也可以有default方法(就理解成成员方法即可)
*静态方法,用接口调用即可
*default方法需要通过子类实现调用,同时也可以覆写
*1.9 开始支持private 方法
*如果接口和抽象都能做到一件事,优先使用接口,因为这样会保留类的继承
 

5、Object 

Object 是所有类祖类,是Java中的根类
*一个类没有明显继承另一个类的时候,默认继承object
*Object xx=new xxx():是可以发生多态的
*==:比较基本类型的时候,比较值的大小,但是比较引用类型的时候,比较的是内存地址
*而比较内存地址,是没有任何价值的,我们一般会比较两个对象的属性值,是否一致,而不是比较两个对象地址是否一致
*   equals():该方法设计目的:用来比较两个对象是否相等,但是  默认比较地址
*   Java中的Object 里面的equals方法,默认比较内存地址(==)需要我们根据需求进行重写

6、finalize 

finalize: 该方法会在垃圾被回收的时候自动被调用,无需程序员手动调用
*
*垃圾:当一个对象,没有更多引用指向它的时候,该对象被视为垃圾数据(就是创建了一个对象,谁也找不到他)
*
*protected void finalize() throws Throwable{}
*
*Object中的finalize方法,声明也没有做,需要之间根据需求进行重写

7、toString 

*tostring :代表了当前对象的字符串表示形式
*当我们打印一个引用类型变量的时候,会自动调用该对象的tostring方法
*而Object中的默认tostring方法 是打印该对象的内存地址(hash值)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值