Java知识Part02(协变、接口)

1、协变返回类型 表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型
	JavaSE5 和Java较早之前的主要差异就是较早版本强制 导出类只能返回基类返回的类型(基类),而不能返回基类返回的类型的导出类,尽管这个导出类是从基类导出的,因此也应该允许返回。协变返回类型允许返回更具体的导出类。
2、由于向上转型(在继承层次中向上移动)会丢失具体的类型信息。所以我们尝试通过向下转型——在继承层次中向下移动————来获取类型信息。
因为我们无法知道导出类具体是什么类,为了确保向下转型的正确性,我们必须执行一个特殊的操作来获得安全的向下转型。在Java语言中,所有转型都会得到检查,即使只是进行一次普通的加括弧形式的类型转换,在进入运行期时仍然会对其进行检查,以确保它的确是我们希望的那种类型。如果不是,就会返回一个ClassCastException(类转型异常)。这种在运行期间对类型进行检查的行为称作“运行时类型识别”(RTTI)
3、多态意味着“不同的形式”,在面向对象的程序设计中,我们持有从基类继承而来的相同接口,以及使用该接口的不同形式:不同版本的动态绑定方法。
4、接口和内部类为我们提供了一种将接口与实现分类的更加结构化的方法————抽象
	因为只是表示了一个接口,但是没有具体实现内容,创建这个接口对象是没有意义而且我们要阻止使用者这样做。为了在编译时捕获问题而不是在运行时发现,Java提供了抽象方法的基址。抽象仅有声明而没有方法体
5、abstract关键字允许人们在类中创建一个或多个没有任何定义的方法————提供了接口部分,但是没有提供任何相应的具体实现,这些实现由此类的继承者创建的。interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现。它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供了形式,而未提供任何具体实现。
一个接口表示“所有实现了该特定接口的类看起来都像这样”,接口被用来建立类与类之间的协议。
6、Interface不仅仅是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继变种的特性
7、当实现一个接口的时,在接口中被定义的方法必须被定义为pbulic;否则,它们就只能得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这是Java编译器所不允许的。
8、只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。如果你想要将这个方法应用于不在此继承结构中的某个类,那么就很麻烦。接口可以在很大程度上放宽这种限制,因此,它使得我们可以编写可复用性更好的代码。
9、创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式。
	这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分。策略就是传递进去的参数对象,它包含要执行的代码。
10、接口的实现类的对象可以被传递给他的接口,这意味着它能被向上转型成每一个接口。
11、使用接口的的核心原因:
	为了能够向上转型为多个基类型(以及由此而带来的灵活性)。
	与使用抽象基类相同:防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。
12、如何选择使用接口还是抽象类?
	如果要创建不带任何方法定义和成员变量的基类,那么应该选择接口而不是抽象类。如果知道某事物应该称为一个基类,那么第一选择为接口。
13、Java标识具有常量初始化值的static final时,会使用大写字母的风格(在一个标识符中用下划线来分隔多个单词)。接口中的域自动是public的,所以没有显式地指明这一点。
14、接口可以嵌套在类中或其他接口中
	在类中的接口可以实现为private,这个private接口可以强制自己的方法定义不要添加任何类型信息(不允许向上转型)
	嵌套在另一个接口中的接口自动就是public,而不能声明为private
		当实现某个接口时,并不需要实现嵌套在其内部的任何接口,而且private接口不能在定义它的类之外被实现。
15、接口是实现多重继承的途径,而生成遵循某个接口的对象的典型方法就是工厂方法设计模式。这与直接调用构造器不同,我们在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某个实现的对象。理论上,通过这种方式,我们的代码将完全与接口的实现分离,这就使得我们可以透明地将某个实现替换为另一个实现。
16、使用字节流来深度拷贝的时候,堆栈溢出发现有个数据很多过万
	使用hashset来去重
17、重载就是静态绑定,静态多态。重写是动态绑定,通过虚函数实现
2、向下转型 运行时类型识别(RTTI)
 class Useful {
    void start(){
        System.out.println("ConstructorMethod");
    }
    void end(){
        System.out.println("end");
    }
}

class MoreUseful extends  Useful{
   void test(){
       System.out.println("test");
   }
}

public class TestUseful {
    public static void main(String[] args) {
        Useful[] a = {new Useful(),new MoreUseful()};
        a[0].start();
        a[1].start();
        a[1].end();
//        a[1].test();//cannot resolve method test()
        ((MoreUseful)a[1]).test();//run
    }
}
-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值