首页 课程 师资 教程 报名

java核心技术基础知识

  • 2019-08-10 09:00:00
  • 2343次 动力节点

 


 一、类、子类,超类


  1、扩展一个子类继承父类,子类的私人领域之间的关系在一个由子类调用父类没有,只有通过超类方法可以访问父类的私有部分,可以使用超级。方法()调用超类的方法,但是超级不是一个对象引用,它只是一个指示编译器调用超类方法的特定的关键词。


  2、使用超级调用父类的构造函数声明必须首先一个子类的构造函数声明。如果子类的构造函数没有显式地调用父类的构造函数,它会自动调用父类的构造函数默认情况下,如果父类的构造函数没有参数,而在子类构造函数和其他没有显式地调用超类的构造函数,Java编译器错误。学习,而不是自然让我想起一个结构:内部类。个人觉得可以把子类具有父类的继承关系的内部类对象和结构安全初始化,所有可以使用超级必要时。对象的方法()方法来访问公共(通常是)直接调用方法的方法名,如果子类覆盖父类的方法,所谓的时间外,解释器会去找子类方法以盾牌超类对象。


  3、一个对象变量可以引用对种实际类型的现象被叫做多态,对象变量遵行置换法则:超类对 象的任何地方都可以用子类对象置换,但是声明为类型为超类对象的变量就算引用了一个子 类的对象,用该引用还是不能调用子类特有的方法,因为"超类不是子类",而"子类肯定超类 "。在运行时能够自动地选择调用哪个方法的现象叫做动态绑定,调用方法依赖于隐式参数的 实际类型,在JAVA5 以前的版本中,要求覆盖方法的返回类型必须是一样的,而现在允许子 类将覆盖方法的返回类型定义为原返回类型的子类型。


  4、继承关系程度,动态绑定方法被调用过程是:如果一个子类定义了方法被调用时,或者需要找到父类,而不是继续寻找类。每个类(虚拟机会提前为了节约成本,创建一个方桌,调用方法与顺序搜索方法表)。子类覆盖父类的方法,子类方法不能在类方法低能见度。


  以上内容的例子:


  class MyParentClassA{


  private String str;


  public MyParentClassA(String s){


  str=s; }


  public String getStr(){


  return str;


  }


  }


  class MyParentClassB


  {


  public MyParentClassB(String s){


  super(s);


  }


  }


  public class SuperClassTest extends MyParentClassB


  {


  private String str;


  public SuperClassTest(String s)


  {


  super(s);


  str="this is child";


  }


  public String getStr()


  {


  return super.getStr()+" "+str;


  }


  public void methodTochild()


  {


  }


  public static void main(String args[])


  {


  MyParentClassA[]mpcArray=new MyParentClassA[2];


  mpcArray[0]=new www.123yc.com MyParentClassA("parent");


  mpcArray[1]=new SuperClassTest("parent's child");


  for (MyParentClass m:mpcArray){ System.out.println(m.getStr());


  }


  mpcArray[0].methodTochild();


  //error: parent is not a child


  }


  }



  需要注意的是:


  SuperClassTest []test=new SuperClassTest [2];


  MyParentClass []mpc=test; 这样做可以通过编译,SuperClassTest 是一个 MyParentClass ,但是当 mpc[0]=new MyParentClass();此时test[0]和mpc[0]引用同一个对象,当调用test[0].methodTochild() 会导致调用一个不存在的实例域,从而打乱了相邻存储空间的内容,所以在 mpc[0]=new MyParentClass(原创论文网)时就会抛出:java.lang.ArrayStoreException,不允许放入子类的引用。


  5、final 类:用来阻止继承。final 类中的所有方法自动变为 final 的,但是类的域不会。 类被声明为final 就不能被继承,方法声明为final 就不能被覆盖。在设计类层次的时候应 该仔细考虑哪些方法和类声明为final。


  6、强制类型转型:如果在继承链上进行向下的强制转型,并且本来就不是向下的类型,这个 时候会产生ClassCastException 异常。所以在进行类型转型之前,先要检查一下是否能够转 型成功:o instanceof Object,如果x 为null,不会产生异常,只会返回false,因为null 没有引用任何对象。注意当需要强制转型的时候应该坚持下类是否设计的合理,是否真的需 要用超类的引用去调用子类的方法。


  7、抽象类:包含一个抽象方法的类本身必须声明为抽象类。其实抽象方法充当着占位的角色, 这样子类实现该方法,用抽象父类的引用可以统一调用占位的方法。



  二、Object:所有类的超类


  1、equals,用于检测一个对象是否等于另外一个对象,可以重载,String 就重载了它,只要 内容相同就返回true,当我们重载equals 时需要注意以下几点: 自反性 :对任意引用值X,x.equals(x)的返回值一定为true. 对称性: 对于任何引用值x,y,当且仅当y.equals(x)返回值为true 时,x.equals(y) 的返回值一定为 true;注意如果equals 的语义在每个子类中有所改变,就要用 getClass 检 测 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 覆盖Object 的equals 方法参数一定是Object 类型的。


  2、HashCode 方法:用同样的内容构造的String 和StringBuilder 的HashCode 是不同的, 因为StringBuilder 类中没有定义hashCode 方法,他的散列码是由Object 的默认方法导出的对象存储地址(所有没有覆盖HashCode 方法的类导出的都是这个)。 Arrays 类有静态方法hashCode(type[] a),这个散列码由数组元素的散列码组成。 


       注意:equals 与hashCode 的定义必须一致,如果equals 方法返回true,那么hashCode 就 必须相同,所以hashCode 需要散列的东西要来自equals 方法里要比较的域。


  3、toString:大部分的类的toString 方法遵循这样的格式:类的名子,随后是一对方括号 括起来的值域。 数组类型按照旧格式打印:[类型第一个字符@地址,所以我们想知道数组的内容要调用 Arrays 的静态方法toString(type[]),多维数组调用Arrays.deepToString(type[])。 建议为自定义的每一个类都添加一个toString 方法。 Object 主要有以上 3 个重要方法,还有的就是 clone()和 getClass。可以注意到,Arrays 类里都有以上3 个静态方法,所以我们要用数组调用的以上3 个方法时要用Arrays 的静态类。



  三、泛型数组列表


  ArrayList 构造方法接受一个 int,用来设置初始容量,也可以用 对象调用 ensureCapacity(int i)来设置初始容量,一旦能够确认数组列表的大小不再发生 变化,可以调用trimToSize 方法,这个方法将存储区域的大小调整为当前元素数量所需要的 存储空间数目,垃圾回收器将回收多余的存储空间。 add(Object o):添加元素添加到最后,add(int i,Object o)在 i 位置插入一个新元素; remove(int i)删除i 位置的元素;size():返回当前元素数量;set(int i,Object o)设置 第i 个元素,get(int i)得到到第i 个元素;toArray 返回一个包还所有元素的数组。可以 使用for each 语法。



  四、基本类型的包装器与自动打包


  从公共超类Number 派生出来的有:Byte Short Integer Long Float Double;其他的还有:Character Void Boolean。对象包装器类都是final 的,不能定义他们的子类,而且一旦构造了包装器,就不允许更改包装在其中的值。泛型要 用基本类型都要用包装器。 自动打包是指在需要int 的地方,编译器会自动的添加必要的方法调用,(代写论文)自动让他们变为int 后又自动封装回去。


  包装器可以提供很多有用的方法(以Integer 为例,其他的类似):


  1、int intValue()返回Integer 对象的值


  2、Static toString(int i) ||toString(int i,int num)返回指定数值i 的串,第2 种协 变参数的num 指定进制。


3、Static int parseInt(String s) ||toString(String s,int num) 返回字符串s 表示的 整型数值,第2 种协变参数的num 指定进制。


  4、Static Integer valueOf(String s) ||toString(String s,int num) 返回字符串s 表 示的整型数值进行初始化后的Integer 对象,第2 种协变参数的num 指定进制。



  五、参数数量可变的方法


  callMethod(type... args)表明可以接受任意数量的对象,其实 编译器将其打包成了数组。



  六、反射


  能够分析类能力的程序被称为反射。java 运行时系统始终为所有的对象维护一个 被称为运行时的类型标示,这个信息保存着每个对象所属的类足迹。


  1、class 类:用来保存对象运行时的信息,得到该对象的方法有


a、Object 类中的getClass() 方法返回一个Class 类型的实例。


b、Static forName(String classname):通过类名获得一 个对应的Class 对象。


c、用 类名.class 代表对应的Class 对象。一个class 对象实际上表 示的一个类型,而这个类型未必是一种类,例如可以:int.class。class 类里的一般的方法有:getName()返回类的名子。如果类在一个包里,那么包名也会作 为类名的一部分。 newInstance():可以用来快速地创建一个类的实例 ,调用的是默认的构造器,如果这个类没 有默认的构造起就会抛出一个异常。


  2、利用反射分析类的能力:Class 类中的 getFields(),getMethods(),getConstructors() 这三个方法分别返回对应类的 field(封装域信息),method(封装方法信息),constructor(封 装构造器信息)对象的数组(都是public 的域,方法或则构造器),getMethods()返回的是所 有的公有方法,包括从超类继承来的方法。 getDeclareMethod()返回这个类的全部方法包括该类的私有方法,但不包括由超类继承了的 方法。 getDeclareField()返回的是这个类的所有域,但不包括由超类继承了的方法。 getDeclareConstructor()返回的是所有的构造器。


  Field、Method、Constructor 类都有的方法:


  String getName()返回该域的名字;int getModifiers()返回一个整形数值用来描述成员的修饰符,Modifier 类有很多静态方法可以 对这个整型做判断,比如isPublic 等;Class getDeclaringClass()返回一个用于描述定义的 构造器、方法或者域的Class 对象。


  field 类:


  Class getType()方法返回描述域所属类型的Class 对象。Object get(Object o) 方法的参数是某个包含域F 的类的对象,返回该对象的这个域的原始对象,对于基本类型有 相应的getInt 等。注意的是如果没有调用setAccessible(true)(这个方法并不是永远的能 有效的,在一些服务器比如 weblogic,可以通过安全性设置来屏蔽这个函数的功能),只能得 到可访问(public)的域的值。(很明显,通过这个机制,多少破坏了封装性)


  Method 类:


  Class[] getParameterTypes()返回描述该方法参数类型的 Class 数组。


  Class getReturnType()返回描述该方法返回值类型的Class 对象。Class[] getExceptionTypes 返 回描述该构造器方法抛出异常类型的Class 对象数组。


  Constructor 类:


  Class[] getParameterTypes()返回描述该构造器方法参数类型的Class 数 组。Class[] getExceptionTypes 返回描述该构造器方法抛出异常类型的Class 对象数组。


  3、使用反射里的数组:Class 类里的有getComponentType 方法确定数组对应的类型。 Array:Static Object newInstance(Class cl,int length)可以通过CL 类型创建一个长 度为length 的数组。


  Static Object get(Array a,int index)通过索引返回数组A 指定位置的对象。 基本类型就是相应的get 方法,如:毕业论文范文getInt(Array a,int index); statci int getLength(Object o)返回数组o 的长度。


  4、方法指针:Method 类 : Object invoke(Object,Object...args)方法第一个参数是隐式 参数(要在哪个对象上调用,如果是静态方法,其可以为 null),其余的对象提供的是显式 参数,如果没有就传一个null,如果方法返回的是基本类型,那么调用invoke 可以返回基本 类型的包装类。


  Method getMethod(String s,Class...parameterTypes) :提供了参数的类型信息,可以在很 多重载的方法中返回准确的对象。



  七、继承设计技巧


1、把公共超类的操作和域。


2、最好不使用保护域。


3、明”是一个“继承关系。


4、除非所有继承的方法是有意义的,否则最好不要使用继承。


5、当覆盖方法,不改变预期的行为。


6、使用多态,而不是类型信息。


7、不要过多使用反射。



选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交