Java关键知识点之继承部分

汇总:Android小白成长之路_知识体系汇总【持续更新中…】

类、父类和子类

  • super与this引用是不同的,super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字

  • 关键词this有两个用途:

    • 引用隐式参数
    • 调用该类其他的构造器

    super也有两个用途:

    • 调用父类的方法
    • 调用父类的构造器
  • 多态:父类引用指向子类对象,分为运行时多态和编译时多态,运行时多态通过动态绑定实现的,例如重写父类方法,运行时决定调用哪个子类的重写后的方法。编译时多态是通过静态绑定实现的,例如方法重载,编译时已经选择了需要调用的同名不同参的方法

    • 静态绑定:private方法、static方法、final方法或者构造器,编译器可以很准确地知道调用的哪个方法
    • 动态绑定:调用时依赖于隐式参数的实际类型,在运行时动态选择
  • 内联:如果一个方法没有被覆盖并且很短,编译器就会对它进行优化处理,这个过程称为内联,例如,内联调用a.getName()将被替换成访问a,.name域

  • 强制类型转换:不同数据类型可以互相转换,将一个父类的引用赋给一个子类变量,也必须进行类型转换,但如果转换不成功,将报异常,因此一般需要加上判断a instantceof A,这个语句中,如果a 为null,不会产生异常,只会返回false

  • 抽象类:包含一个或多个抽象方法的类本身必须被声明为抽象的,抽象类也可以包含具体的数据和方法

  • 枚举类:枚举类用enum来声明定义,不能被继承,里面的所有成员都相当于当前类的实例

Object类

  • Object类:所有类的基类,每个类都由它扩展而来,如果没有明确地指出父类,那么父类就默认为Object类
  • equals方法:用于检测一个对象是否等于另一个对象,在Object类中,这个方法判断两个对象是否具有相同的引用
  • hashCode方法:每个对象都有一个默认的散列码,其值为对象的存储地址,应该返回一个整型数值,null返回0
  • 如果重写equals方法,就必须重新定义hashCode方法,如果a.equals(b)返回true,那么a.hashCode()和b.hashCode()必须具有相同的值

自动装箱和拆箱

  • 对象包装器:所有的基本类型都有一个与之对应的类,例如Integer。Long、Float。Double、Short、Byte、Character、Boolean,对象包装器类是fianl不可变的,因此无法定义子类,也无法改变其中的值
  • 自动装箱:自动将基本类型转换成包装器类型,例如Integer a = 99;实际上执行了Integer a = Integer.valueOf(99);,需要注意的是,Integer.valueOf方法会首先判断参数的大小,如果在[-128~127]之间,就会返回已经创建好的Integer对象,这些对象保存在一个叫SMALL_VALUES的数组里。如果超出区间范围,则会创建一个Integer对象,这就导致了两种情况:在区间内是返回的是同一个对象,在区间外返回的是不同的对象,在判断相等的时候就会出现差异
  • 自动拆箱:自动将包装器类型转换成基本数据类型,例如Integer a = 99; int b = a;
  • equals(Object o) :原equals方法中的参数类型是封装类型,所传入的参数类型(a)是基本数据类型,会自动对其装箱,反之,会对其进行拆箱
  • 当两种不同类型用==比较时,包装器类需要拆箱, 当同种类型用==比较时,会自动拆箱
  • 可变参数:void a(Object... args){},这里的省略号表明这个方法可以接收任意数量的对象,该参数会绑定到数组上,并且在必要的时候自动装箱,例如变成这样:a(new Object[]{new Integer(n),"name"}),这里也可以直接传递一个数组作为可变参数方法的参数

反射

  • 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,虚拟机利用运行时类型信息选择相应的方法执行。这些信息也可以通过专门的Java类访问,保存这些信息的类被称为Class,这个名称很容易让人混淆,Object类中的getClass()方法将会返回一个Class类型的实例

  • 一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类,例如int不是类,但int,.class是一个Class类型的对象

  • java.lang.reflect包中有三个类FieldMethodConstructor分别用于描述类的域、方法和构造器

  • Field[] getFields():返回一个包含Filed对象的数组,这些对象记录了这个类或其超类的公有域

  • Field getField(String name):返回指定名称的公有域

  • Field[] getDeclaredFields():也返回一个包含Filed对象的数组,但记录的是全部域,如果类中没有域,或者Class对象描述的是基本类型或数组类型,这些方法将返回一个长度为0的数组

  • Field getDeclaredField():返回指定名称的域

  • Method[] getMethods():返回包含Method对象的数组,将返回所有的公有方法,包括从超类继承的公有方法

  • Method[] getDeclaredMethods():返回这个类或接口的全部方法,但不包括继承来的方法

  • Constructor[] getConstructors():返回包含了Class对象的类所有公有构造器

  • Constructor[] getDeclaredConstructors():返回包含了Class对象的类所有构造器

  • void setAccessible(boolean flag):为反射对象设置可访问标志

  • Object get(Object obj):返回obj对象中用Field对象表示的域值

  • void set(Object obj, Object newValue):用一个新值设置Obj对象中Filed对象表示的域

  • 一个利用反射修改域值的例子:

    Class cl = a.getClass();
    Object obj=cl.newInstance()
    Field f = cl.getDeclaredFiled(name);
    f.setAccessible(true);
    f.set(obj,"aaa");
    

猜你喜欢

转载自blog.csdn.net/Nbin_Newby/article/details/120554469