java泛型通配符和类型参数的范围
泛型里如果不限制类型参数,它可以接受任意已定义的类型。很多时候我们只需要其中一部分,用户传入其他类型会在运行期出错。本节先限制类型参数的范围,再讲通配符 ?。 例如编写一个泛型方法,返回 Integer、Double 等数组中的最大值:元素得能取数值,就不能让 T 是任意类型。 写法 用在哪 含义 …
泛型里如果不限制类型参数,它可以接受任意已定义的类型。很多时候我们只需要其中一部分,用户传入其他类型会在运行期出错。本节先限制类型参数的范围,再讲通配符 ?。 例如编写一个泛型方法,返回 Integer、Double 等数组中的最大值:元素得能取数值,就不能让 T 是任意类型。 写法 用在哪 含义 …
所谓泛型,就是“宽泛的数据类型”:不但值可以通过参数传递,类型也可以。它解决的是:既不想为每种类型写一遍重载,又不愿依赖不安全的向下转型。 Java 1.5 起引入泛型,参照 C++ 模板,本质是参数化类型(Parameterized Type)。类型参数只能表示引用类型;传入 int、double…
从功能上看,new 和 newInstance() 都能创建类的实例。前者是关键字,后者是方法。差别在于:newInstance() 走类加载机制,按运行时拿到的类名来反射创建;new 在源码里写死类型,直接创建。 为什么要两种方式?主要是软件的可伸缩、可扩展、可复用:明确知道要哪个类时用 new;…
Java 反射指:运行时对任意类都能查出全部属性和方法,对任意对象都能调用任意方法和属性。动态拿到这些信息、动态调用对象方法,就是语言层面的反射机制。 它依赖运行时由类加载器装入的 Class 对象:编译期看不到的信息都记在这份元数据里,程序才能在启动后按需装载、查看、生成对象并改写信息。远程方法调…
两个进程远程通信时,无论发送什么类型的数据,网络上走的都是二进制序列。发送方要把 Java 对象变成字节序列,接收方再把字节序列恢复成对象。 把 Java 对象转换为字节序列叫做序列化;把字节序列恢复为 Java 对象叫做反序列化。常见用途有两个:把对象的字节序列永久存到磁盘(通常是一个文件);在网…
声明类、变量和方法时可以用 final 修饰,表示终态:这个东西定下来以后就不能再改继承关系、不能再被覆盖、不能再被重新赋值。 具体规定:final 类不能被继承;final 方法不能被子类重写;final 变量(成员或局部)只能赋值一次,成为常量。 修饰对象 效果 补充 类 不能再派生子类 方法隐…
static 修饰变量或方法,表示它们是静态的:属于类,而不属于某一个对象。 静态变量和静态方法可以通过类名访问,不必先 new 出对象,所以也叫类变量和类方法。实例变量则必须通过对象访问,因为每个对象自己有一份,值可以不同。 对比 静态(类)成员 实例成员 内存 类加载时一份,所有对象共享 每 n…
super 和 this 成对出现:this 表示当前类的实例,super 用来访问父类。 子类里可以用点号取父类的成员变量和方法;方法定义在更上面的祖先类时,Java 会自动向上追溯,直到找到为止。调用看起来就像本类自己的行为一样。 对比 this super 指向 当前对象 不是对象引用,只是让…
this 用来表示当前对象:哪个实例正在执行这段代码,this 就指向谁。通过它可以访问本对象的成员变量和实例方法。 this 只在实例化之后才有意义,静态方法里没有当前对象,因此不能用 this。 常见用法可以先放在一张表里对照: 写法 含义 注意 this.成员 访问当前对象的字段或方法 没有重…
这里说的对象类型转换,只发生在有继承关系的类型之间。没有继承关系却强制转,运行时会抛 java.lang.ClassCastException。 继承链上,子类转成父类叫向上转型,父类转成子类叫向下转型。向上转型很常见:变量写成父类,实际引用子类,运行时靠动态绑定调用子类方法,也就是多态。若要做父类…