JAVA 基础核心面试问题分析,看懂了轻( 二 )


多态特性
多态是对对象行为的一种描述,在java中基于封装和继承特性,定义了编译时多态和运行时多态 。编译时的多态就是方法的重载(方法名相同,参数列表不同),运行时的多态是基于继承特性实现的一种重写 。本质上就是把做什么和具体怎么做分开了,例如我们定义了要做什么,但具体怎么做完全取决于具体的对象 。例如睡觉是一种行为,但是有的人睡觉时磨牙,有的人说梦话,有的人打呼噜,有的人梦游 。同样,吃饭也是一种行为,有的人吃饭细嚼慢咽,有的人狼吞虎咽 。在程序中我们通常将多态特性应用在方法的返回值和参数类型上,方法的返回值和参数类型能用抽象则用抽象,便于后于进行多态拓展 。
如何理解Java中的字节码对象?每个类在加载(将类读到内存)时都会创建一个字节码对象,其类型为Class类型,且这个对象在一个JVM内存中是唯一的.此对象中存储的是类的结构信息(元数据信息),节码对象的获取方式常用的有如下三种:
a) 类名.class
b) Class.forName(“包名.类名”)
c) 类的实例对象.getClass();
代码演示:
package com.java.oop;//呈现类加载过程(通过配置JVM参数实现)//-XX:+TraceClassLoading public class TestClassObject01 {static public void main(String[] args)throws Exception {Class<Object> c1=Object.class;Class<?> c2=Class.forName("java.lang.Object");System.out.println(c1==c2);Class<?> c3=new Object().getClass();System.out.println(c2==c3); }}你是如何理解Java中的泛型的?泛型是JDK1.5推出的一种参数化的类型,我们可以将定义类型时使用的泛型,理解为形参 。例如,List、Map<K,V>接口中的E,K,V都可以看成是泛型,也就是一种特殊的形参,当我们应用这些集合时传入的具体类型可以看成是实际参数 。例如List这里的String可以看成是实际参数 。泛型也是是编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如List在运行时String会被擦除,最终系统会认为都是Object类型 。
说说泛型应用在什么场景呢?泛型是实现通用编程的一种手段,通常应用在类,接口,方法的定义上,例如:
1.泛型类: class 类名<泛型,…>{}
2.泛型接口: interface 接口名<泛型,…>{}
3.泛型方法: 访问修饰符 <泛型> 方法返回值类型 方法名(形参){}
代码演示:
泛型接口的定义,例如:
interface Container<T>{ //泛型接口void add(T t);T get(int i);int size();}interface Task<Param,Result>{ //思考map中的泛型Map<K,V> /*** 此方法用于执行任务* @param arg 其类型由泛型参数Param决定* @return 其类型由泛型参数result决定*/ Result execute(Param arg1);}【JAVA 基础核心面试问题分析,看懂了轻】泛型类的定义,例如:
interface Result<T>{ //泛型类 T data;}泛型方法定义,例如:
class ObjectFactory{//泛型方法public <T>T newInstance(Class<T> cls)throws Exception{return cls.newInstance();}}class ContainerUtils{//泛型方法 //1)静态方法假如有泛型肯定是泛型方法 //2)泛型类和泛型接口不作用于静态方法 //3)泛型方法一定是静态方法吗?不是 public static <T>void sort(List<T> list) { }}总结:

  1. 泛型类和泛型接口用于约束类或接口中实例方法参数类型,返回值类型 。
  2. 泛型类或泛型接口中实际泛型类型可以在定义子类或构建其对象时传入 。
  3. 泛型方法用于约束本方法(实例方法或静态方法)的参数类型或返回值类型 。
  4. 泛型类上的泛型不能约束类中静态方法的泛型类型 。
如何理解Java中的泛型通配符?Java中的泛型通配符一般可以理解为一种通用的类型,也可认为不确定性类型 。从应用上,它可分为三种类型:
1)无届通配符:<?>
2)上届通配符:<? extends 类型>
3)下届通配符:<类型 extends ?>
代码演示:
//无届通配符 Class<?> c2=Class.forName("java.lang.Object");//上界通配符static void doPrint(List<? extends CharSequence> list){System.out.println(list);}//下界通配符static void doPrint(Set<? super Integer> set){ //下届System.out.println(list);}说说什么是泛型类型擦除?泛型是编译时的一种类型,在运行时无效,运行时候都会变成Object类型 。
例如基于反射向List list=new ArrayList() 集合中添加整数,关键代码如下:


推荐阅读