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 父类构造器(实参列表)|实现接口(){

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

}

匿名内部类的特点:

必须继承父类或实现接口

只能有一个对象

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

 

posted @ 2019-11-21 10:37  java_取名南  阅读(173)  评论(0编辑  收藏  举报