• Java基础第十五天总结——面向对象(下)


    目录:

    一、抽象类与抽象方法

    二、接口(interface)

    三、类的成员之五:内部类

    /*--------------------分割线----------------*/

    一、抽象类与抽象方法

    > 用abstract关键字来修饰一个类,这个类叫做抽象类。

    > 用abstract来修饰一个方法,改方法就叫做抽象方法。

    > 抽象方法,只有方法的声明,没有方法的实现。以分号结束:

    比如:public abstract void talk();

    > 含有抽象方法的类必须被声明为抽象类

    > 抽象类不能被实例化,抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍然为抽象类。

    注意:

    > 不能用abstract修饰变量、代码块、构造器

    > 不能用abstract修饰私有方法、静态方法、final的方法、final的类

    抽象类是用来模块化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

    多态的应用:模板方法设计模式

    抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

    解决的问题:

    > 当功能内部一部分实现是确定的,一部分实现是不确定的。这时,可以把不确定的部分暴露出去,让子类去实现。

    > 换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。

    模板方法涉及模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,比如常见的有:

    > 数据库访问的封装

    > Junit 单元测试

    > JavaWeb的Servlet中关于doGet/doPost 方法调用

    > Hibernate中模板程序

    > Spring中JDBCTemplate、HibernateTemplate等

    二、接口(interface)

    Java不支持多重继承,有了接口,就可以得到多重继承的效果。

    接口就是规范,定义的是一组规则,体现了显示世界中“如果你是。。则必须能。。”的思想。继承是一个“是不是”的关系,而接口实现则是“能不能”的关系。

    接口的本质是七月,标准,规范,就想我们的法律,制定好了大家就得遵守。

     > 接口(interface)是抽象方法和常量值定义的集合

    接口夫人特点:

    用interface来定义

    接口中的所有成员变量都默认是由public static final修饰的。

    接口中的所有抽象方法都默认是由public abstract修饰的。

    接口中没有构造器

    接口采用多继承机制

    定义Java类的语法格式:先写extends,后写implements

    一个类可以实现多个接口,接口也可以继承其他接口。

    实现接口的类中必须提供接口中所有的具体实现内容,方可实例化。否则,认为抽象类。

    接口的主要用途就是被实现类实现(面向接口编程)

    与继承关系类似,接口与实现类之间存在多态性

    接口和类是并列关系,或者可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

    代理模式:

    代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。

    应用场景:

    安全代理:屏蔽对真实角色的直接访问。

    远程代理:通过代理类处理远程方法调用(RMI)

    延迟加载:先加载轻量级的代理对象

    分类:

    静态代理:(静态定义代理类)

    动态代理:(动态生成代理类)

    JDK自带的动态代理,需要反射等知识

    接口和抽象类之间的对比

    Java8中关于接口的改进

    java8中,你可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反接口作为一个抽象定义的理念。

    静态方法:使用static关键字修饰。可以通过接口直接调用静态方法,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。你可以在标准库中找到像Collection

    n/Collections或者Path/Paths这样成对的接口和类。
    默认方法:默认方法使用default关键字修饰。可以通过实现类对象来调用。我们在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。
     
    接口中的默认方法:
    若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法(不管此方法是否是默认方法),在实现类同时实现了这两个接口时,会出现:接口冲突。
    解决办法:实现类必须覆盖接口中同名同参数的方法,来解决冲突。
    若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,则不会出现冲突问题。因为此时遵守:类优先原则。接口中具有相同名称和参数的默认方法会被忽略。
     
    三、类的内部成员之五:内部类

    Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

    Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。

    分类:成员内部类(static成员内部类和非static成员内部类)

       局部内部类(不谈修饰符)、匿名内部类

    成员内部类作为类的成员的角色:

    和外部类不同,Inner class还可以声明为private或protected;

    可以调用外部类的结构

    Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量

    成员内部类作为类的角色:

    可以在内部定义属性、方法、构造器导尿管结构

    可以声明abstract类,因此可以被其他的内部类继承

    可以声明为final的

    编译以后生成OuterClass¥InnerClass.class字节码文件

    注意:

    非static的成员内部类中的成员不能声明为static的,只有在外部类或static的成员内部类中才可声明static成员。

    外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式

    成员内部类可以直接使用外部类的所有成员,包括私有的数据

    当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的

    如何声明局部内部类:

     如何使用局部内部类

    只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方都不能使用该类

    但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类的父类或父接口类型

     

    匿名内部类:

    匿名内部类不能定义任何静态成员、方法、和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

    格式:

    new 父类构造器(实参列表)|实现接口(){

    //怒名内部类的类体部分

    }

    匿名内部类的特点:

    必须继承父类或实现接口

    只能有一个对象

    对象只能使用多态形式引用

  • 相关阅读:
    sdut 2413:n a^o7 !(第三届山东省省赛原题,水题,字符串处理)
    poj 2406:Power Strings(KMP算法,next[]数组的理解)
    hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
    hrbustoj 1179:下山(DFS+剪枝)
    [Linux] 通过指令修改时区 tzselect
    Ubuntu 历史版本下载
    RK3288 USB UVC camera 摄像头 VIDIOC_DQBUF Failed!!! err[I/O error]
    Android Activity活动状态及生存周期
    Android 系统四大组件
    Android JNI访问Java成员
  • 原文地址:https://www.cnblogs.com/zhoutie170821/p/11904053.html
Copyright © 2020-2023  润新知