java lesson 13
Java SE Lesson 2 Java SE Lesson 2Java SE Lesson 2Java SE Lesson 2Java SE Lesson 2 Java SE Lesson 2Java SE Lesson 2Java SE Lesson 2 Java SE Lesson 2Java SE Lesson 2Java SE Lesson 2
1. 多态:父类型的引用可以指向子对象。
2. Parent p = new Child();Parent p = new Child(); Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child();Parent p = new Child(); Parent p = new Child(); Parent p = new Child();Parent p = new Child();Parent p = new Child();当使用多态方式调法时,首先检查父类中是否有 sing() sing() sing()方法, 如果没有则编译
错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 如果没有则编译错误;,再去调用子类的 sing()sing()sing()sing()sing() 方法。 方法。
3. 一共有两种类型的强制转换:
a) 向上
类型转换( 向上类型转换( upcastupcastupcastupcast upcast):比如说将 ):比如说将 ):比如说将 Cat Cat类型转换为 Animal Animal 类型 ,即将子类型 ,即将子转换为父类型。
对于向上,不需要显式指定b) 向下类型转换( 向下类型转换( downcastdowncastdowncastdowncastdowncastdowncast downcast):比如将 ):比如将 ):比如将 Animal Animal 类型转换为 类型转换为 Cat Cat类型 。即将父类型 。即将父转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 转换为子类型。对于向下,必须要显式指定 (必须要使用强制类型 (必须要使用强制类型 (必须要使用强制类型 (必须要使用强制类型 转换) 。
4. 抽象类( 抽象类( abstract class abstract classabstract classabstract classabstract class abstract classabstract classabstract class ): 使用了 abstract abstractabstractabstractabstract
关键字所修饰的 关键字所修饰的 类叫做抽象。 抽 象类无法实例化,也就是说不能 newnew 出来一个抽象类的对(实例)。 出来一个抽象类的对(实例)。 出来一个抽象类的对(实例)。
5. 抽象方法( abstract method abstract methodabstract methodabstract methodabstract method abstract methodabstract method abstract methodabstract methodabstract methodabstract method): 使用 abstractabstractabstractabstractabstractabstract abstract关键字所修饰的方 法叫做抽象关键字所修饰的方 法叫做抽象法。 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 抽象方法需要定义在类中 。相对于抽象方法,之前所定义的叫 。相对于抽象方法,之前所定义的叫 。相对于抽象方法,之前所定义的叫 做具体方法(有声明,实现)。 做具体方法(有声明,实现)。
6. 如果一个类包含了抽象方法,那么这定是。
7. 如果某个类是抽象,那么该可以包含具体方法(有声明、实现)。 如果某个类是抽象,那么该可以包含具体方法(有声明、实现)。
8. 如果一个类中包含了抽象方法,那么这定要声明成 abstract class abstract classabstract classabstract classabstract class abstract classabstract classabstract classabstract class ,也 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 就是说,该类一定抽象;反之如果某个那么既可以 包含抽象方法,也可以具体。
9. 无论何种情况,只要一个类是抽象那么这就法实例化。
10. 在子类 继承父(是个抽象)的情况下,那么该必须要实现在子类 继承父(是个抽象)的情况下,那么该必须要实现在子类 继承父(是个抽象)的情况下,那么该必须要实现在子类 继承父(是个抽象)的情况下,那么该必须要实现中所定义的有 抽象方法;否则,该子类需要声明成一个 abstract class abstract classabstract classabstract classabstract class abstract classabstract classabstract class abstract class 。
11.
接口( interface interfaceinterface interface ): 接口的地位等同于 接口的地位等同于 classclass class,接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象接口中的所有方 法都是抽象法。在声明接口中的方法时,可以使用 。在声明接口中的方法时,可以使用 abstract abstractabstractabstractabstractabstractabstract关键字,也可以不使用。通 常情况下,都会省略掉 abstract abstractabstractabstractabstract 关键字。
12. 可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也可以将接口看作是特殊的抽象 类(中有具体方法,也方法,而接口中只能有抽象不具体)。 方法,而接口中只能有抽象不具体)。
13. 类可以 实现 接口。 实现使用关键字 实现使用关键字 implements implements implementsimplementsimplementsimplements表示,代了 某个类实现表示,代了 某个类实现某个接口。
14. 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 一个类实现了某接口,那么该必须要中声明的所有方法。如果 该类是个抽象,那么就无需实现接口中的方法了。
15. Java JavaJava是单继承的,也就说某个类只能有唯一父;可以实现多 个接口,多之间使用逗号分隔。
16. 多态:所谓,就是父类型 的引用可以指向子对象或者接口多态:所谓,就是父类型 的引用可以指向子对象或者接口多态:所谓,就是父类型 的引用可以指向子对象或者接口多态:所谓,就是父类型 的引用可以指向子对象或者接口的引用可以指向实现该接口类例。 的引用可以指向实现该接口类例。 的引用可以指向实现该接口类例。 的引用可以指向实现该接口类例。 的引用可以指向实现该接口类例。 的引用可以指向实现该接口类例。 关于接口与实现的类之间强 关于接口与实现的类之间强 关于接口与实现的类之间强 关于接口与实现的类之间强 关于接口与实现的类之间强 制类型转换方式与父和子之间的强完全一样。
17. staticstaticstaticstaticstatic 关键字: 可以用于修饰 属性,也方法还可以用于修饰 属性,也方法还类(后面的课程讲)
18. statictatictatictatic 修饰属性: 无论一个类生成了多少对象,所有这些共同使用唯 无论一个类生成了多少对象,所有这些共同使用唯 一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他一份静态的成员变量;个对象 该进行了修改,其他的该静态成员变量值也会随之发生化。 如果一个成员变量是 staticstaticstaticstaticstaticstatic的,
那么我们可以通过 类名 .成员变量名 成员变量名 成员变量名 的方式来使用它 的方式来使用它 (推荐使用这种方式) 。
19. staticstaticstaticstaticstatic 修饰方法: staticstaticstaticstaticstatic 修饰的方法叫做静态。 对于
静态方法来说,可以 使用 类名 .方法名 方法名 的方式来访问。 的方式来访问。
20. 静态方法只能继承,不重写( 静态方法只能继承,不重写( 静态方法只能继承,不重写( 静态方法只能继承,不重写( 静态方法只能继承,不重写( 静态方法只能继承,不重写( 静态方法只能继承,不重写( OverrideOverrideOverrideOverrideOverrideOverrideOverrideOverride)。
21. finalfinal final 关键字: finalfinal final 可以修饰属性、方法类。 可以修饰属性、方法类。
22. finalfinal final 修饰类:当一个被 修饰类:当一个被 修饰类:当一个被 finalfinal final 所修饰时,表示该类是一个终态即不能被 所修饰时,表示该类是一个终态即不能被 所修饰时,表示该类是一个终态即不能被 所修饰时,表示该类是一个终态即不能被 继承。
23. finalfinal final 修饰 方法 :当一个方法被 :当一个方法被 finalfinal finalfinal所修饰时, 表示该方法是一个终态所修饰时, 表示该方法是一个终态即不能被重写( Override Override Override Override)。
24. finalfinal final 修饰属性: 当一个属性被 当一个属性被 finalfinal final 所修饰时,表示该属性不能被改写。 所修饰时,表示该属性不能被改写。
25. 当 finalfinalfinalfinalfinal修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 修饰一个原生数据类型时,表示该的值不能发变化 (比如说不能从 (比如说不能从 (比如说不能从 (比如说不能从 10 变为 20 );如果 );如果 );如果 finalfinalfinalfinalfinal修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该修饰一个引用 类型时,表示该类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 类型不能再指向其他对象了,但该引用所的内容是可以发生变化 的。
26. 对于 finalfinal final 类型成员变量,一般来说有两种赋初值方式: 类型成员变量,一般来说有两种赋初值方式:
a) 在声明 finalfinal final 类型的成员变量时就赋上初值 类型的成员变量时就赋上初值
b) 在声明 finalfinal final 类型的成员变量时不赋 初值,但在所有构造方法中都为其类型的成员变量时不赋 初值,但在所有构造方法中都为其类型的成员变量时不赋 初值,但在所有构造方法中都为其上初值。
27. staticstaticstaticstaticstatic 代码块 :静态代码块 :静态代码块 :静态。静态代码块的作用也是完成一些初始化工。首 静态代码块的作用也是完成一些初始化工。首 先执行静态代码块, 然后构造方法。在类被加载的时候先执行静态代码块, 然后构造方法。在类被加载的时候先执行静态代码块, 然后构造方法。在类被加载的时候而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 而构造方法是在生成对象的时候执行;要想调用某个类来,首先需 要将类加载到 Java JavaJava虚拟机上(
JVM JVM),然后由 ),然后由 JVMJVMJVM加载这个类来生成对象。 加载这个类来生成对象。
28. 类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个类的静态代码块只 会执行一次,是在被加载时候因为每个会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 会被加载一次,所以静态代码块也只执行;而构造方法则不然每 次生成一个对象的时候都会调用类构造方法,所以 次生成一个对象的时候都会调用类构造方法,所以 newnew 一次就会调用构造 方法一次。
29. 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 如果继承体系中既有构造方法,又静态代码块那么首先执行最顶层的类 的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的静态代码块,一直执行到最底层类 然后再去顶的构造方法,一直执行到最底层类。 的构造方法,一直执行到最底层类。 的构造方法,一直执行到最底层类。 的构造方法,一直执行到最底层类。 的构造方法,一直执行到最底层类。 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 注意:静态代码块只会执行 一次。 一次。
30. 不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的不能在静态方法中访问非成员 变量;可以的变量。可以在非静态方法中访问 静态的成员变量。
31. 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。 总结:静态的只能访问;非可以一切。
32. 不能在静态方法中使用 不能在静态方法中使用 不能在静态方法中使用 不能在静态方法中使用 不能在静态方法中使用 this thisthis关键字。 关键字。