No_16_0229 Java基础学习第九天

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No_16_0229 Java基础学习第九天相关的知识,希望对你有一定的参考价值。

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.02.29 lutianfei none


final 关键字

  • final关键字是最终的意思,可以修饰成员变量成员方法

  • 特点:

    • 修饰的,类不能被继承
    • 修饰的变量,变量就变成了常量,只能被赋值一次
    • 修饰的方法,方法不能被重写
  • final关键字面试题

  • Eg1: final修饰局部变量

    • 在方法内部,该变量不可以被改变
    • 在方法声明上,分别演示基本类型和引用类型作为参数的情况
      • 基本类型,是值不能被改变
      • 引用类型,是地址值不能被改变,但是该对象堆内存的值可以改变。
  • Eg2: final修饰变量的初始化时机

    • 对象构造完毕前即可
  1. class Student {
  2. int age = 10;
  3. }
  4. class FinalTest {
  5. public static void main(String[] args) {
  6. //局部变量是基本数据类型
  7. int x = 10;
  8. x = 100;
  9. System.out.println(x);
  10. final int y = 10;
  11. //无法为最终变量y分配值
  12. //y = 100;
  13. System.out.println(y);
  14. System.out.println("--------------");
  15. //局部变量是引用数据类型
  16. Student s = new Student();
  17. System.out.println(s.age);
  18. s.age = 100;
  19. System.out.println(s.age);
  20. System.out.println("--------------");
  21. final Student ss = new Student();
  22. System.out.println(ss.age);
  23. ss.age = 100;
  24. System.out.println(ss.age);
  25. //重新分配内存空间
  26. //无法为最终变量ss分配值
  27. ss = new Student();
  28. }
  29. }

多态

多态概述

  • 某一个事物,在不同时刻表现出来的不同状态。
    • 举例:
      • 猫可以是猫的类型。猫 m = new 猫();
      • 同时猫也是动物的一种,也可以把猫称为动物。
        • 动物 d = new 猫();
      • 再举一个例子:水在不同时刻的状态
  • 多态前提和体现
    • 有继承关系
    • 有方法重写
    • 有父类引用指向子类对象
      • Fu f = new Zi();

多态的分类:

  • 具体类多态:
    • class Fu{}
    • class Zi extends Fu{}
    • Fu f = new Zi();
  • 抽象类多态:
    • abstract class Fu{}
    • class Zi extends Fu{}
    • Fu f = new Zi();
  • 接口多态:
    • interface Fu{}
    • class Zi implements Fu{}
    • Fu f = new Zi();

多态中的成员访问特点:

  • A:成员变量
    • 编译看左边,运行看左边
  • B:构造方法
    • 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
  • C:成员方法
  • 编译看左边,运行看右边。由于成员方法存在方法重写,所以它运行看右边。
  • D:静态方法
    • 编译看左边,运行看左边。
    • (静态和类相关,算不上重写,所以,访问还是左边的)
  1. /*
  2. 多态:同一个对象(事物),在不同时刻体现出来的不同状态。
  3. 举例:
  4. 猫是猫,猫是动物。
  5. 水(液体,固体,气态)。
  6. 多态的前提:
  7. A:要有继承关系。
  8. B:要有方法重写。
  9. 其实没有也是可以的,但是如果没有这个就没有意义。
  10. 动物 d = new 猫();
  11. d.show();
  12. 动物 d = new 狗();
  13. d.show();
  14. C:要有父类引用指向子类对象。
  15. 父 f = new 子();
  16. 用代码体现一下多态。
  17. 多态中的成员访问特点:
  18. A:成员变量
  19. 编译看左边,运行看左边。
  20. B:构造方法
  21. 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
  22. C:成员方法
  23. 编译看左边,运行看右边。
  24. D:静态方法
  25. 编译看左边,运行看左边。
  26. (静态和类相关,算不上重写,所以,访问还是左边的)
  27. 由于成员方法存在方法重写,所以它运行看右边。
  28. */
  29. class Fu {
  30. public int num = 100;
  31. public void show() {
  32. System.out.println("show Fu");
  33. }
  34. public static void function() {
  35. System.out.println("function Fu");
  36. }
  37. }
  38. class Zi extends Fu {
  39. public int num = 1000;
  40. public int num2 = 200;
  41. public void show() {
  42. System.out.println("show Zi");
  43. }
  44. public void method() {
  45. System.out.println("method zi");
  46. }
  47. public static void function() {
  48. System.out.println("function Zi");
  49. }
  50. }
  51. class DuoTaiDemo {
  52. public static void main(String[] args) {
  53. //要有父类引用指向子类对象。
  54. //父 f = new 子();
  55. Fu f = new Zi();
  56. System.out.println(f.num);
  57. //找不到符号
  58. //System.out.println(f.num2);
  59. f.show();
  60. //找不到符号
  61. //f.method();
  62. f.function();
  63. }
  64. }
  65. /*
  66. * 运行结果:
  67. 100
  68. show Zi
  69. function Fu
  70. */
  • 多态的好处
    • 提高了程序的维护性(由继承保证)
    • 提高了程序的扩展性(由多态保证)
  • 多态的弊端

    • 父类不能访问子类特有功能
  • 如何才能访问子类的特有功能呢?

    • 创建子类对象,调用方法即可。(然而很多时候不合理,且太占内存)
    • 向下转型:把父类的引用强制转换为子类的引用。
      • Zi z = (Zi)f; //要求该f必须是能够转换为Zi的
  • 现象: 子可以当做父使用,父不能当作子使用。

多态中的转型问题

  • 向上转型
    • 从子到父
    • 父类引用指向子类对象
  • 向下转型

    • 从父到子
    • 父类引用转为子类对象
  • 孔子装爹案例

  1. //多态的问题理解:
  2. class 孔子爹 {
  3. public int age = 40;
  4. public void teach() {
  5. System.out.println("讲解JavaSE");
  6. }
  7. }
  8. class 孔子 extends 孔子爹 {
  9. public int age = 20;
  10. public void teach() {
  11. System.out.println("讲解论语");
  12. }
  13. public void playGame() {
  14. System.out.println("英雄联盟");
  15. }
  16. }
  17. //Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
  18. //但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
  19. //然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
  20. //向上转型
  21. 孔子爹 k = new 孔子();
  22. //到人家那里去了
  23. System.out.println(k爹.age); //40
  24. k爹.teach(); //讲解论语
  25. //k爹.playGame(); //这是儿子才能做的,一做就报错!
  26. //讲完了,下班回家了
  27. //脱下爹的装备,换上自己的装备
  28. //向下转型
  29. 孔子 k = (孔子) k爹;
  30. System.out.println(k.age); //20
  31. k.teach(); //讲解论语
  32. k.playGame(); //英雄联盟

技术分享

  • 多态中的对象变化内存图
    技术分享


  • 多态练习:猫狗案例
  1. class Animal {
  2. public void eat(){
  3. System.out.println("吃饭");
  4. }
  5. }
  6. class Dog extends Animal {
  7. public void eat() {
  8. System.out.println("狗吃肉");
  9. }
  10. public void lookDoor() {
  11. System.out.println("狗看门");
  12. }
  13. }
  14. class Cat extends Animal {
  15. public void eat() {
  16. System.out.println("猫吃鱼");
  17. }
  18. public void playGame() {
  19. System.out.println("猫捉迷藏");
  20. }
  21. }
  22. class DuoTaiTest {
  23. public static void main(String[] args) {
  24. //定义为狗
  25. Animal a = new Dog();
  26. a.eat();
  27. System.out.println("--------------");
  28. //还原成狗
  29. Dog d = (Dog)a;
  30. d.eat();
  31. d.lookDoor();
  32. System.out.println("--------------");
  33. //变成猫
  34. a = new Cat();
  35. a.eat();
  36. System.out.println("--------------");
  37. //还原成猫
  38. Cat c = (Cat)a;
  39. c.eat();
  40. c.playGame();
  41. System.out.println("--------------");
  42. //演示错误的内容
  43. //Dog dd = new Animal();
  44. //Dog ddd = new Cat();
  45. //ClassCastException
  46. //Dog dd = (Dog)a;
  47. }
  48. }


  • 不同地方饮食文化不同的案例
  1. class Person {
  2. public void eat() {
  3. System.out.println("吃饭");
  4. }
  5. }
  6. class SouthPerson extends Person {
  7. public void eat() {
  8. System.out.println("炒菜,吃米饭");
  9. }
  10. public void jingShang() {
  11. System.out.println("经商");
  12. }
  13. }
  14. class NorthPerson extends Person {
  15. public void eat() {
  16. System.out.println("炖菜,吃馒头");
  17. }
  18. public void yanJiu() {
  19. System.out.println("研究");
  20. }
  21. }
  22. class DuoTaiTest2 {
  23. public static void main(String[] args) {
  24. //测试
  25. //南方人
  26. Person p = new SouthPerson();
  27. p.eat();
  28. System.out.println("-------------");
  29. SouthPerson sp = (SouthPerson)p;
  30. sp.eat();
  31. sp.jingShang();
  32. System.out.println("-------------");
  33. //北方人
  34. p = new NorthPerson();
  35. p.eat();
  36. System.out.println("-------------");
  37. NorthPerson np = (NorthPerson)p;
  38. np.eat();
  39. np.yanJiu();
  40. }
  41. }


  • 多态中继承练习
  • 继承的时候:
    • 子类中有和父类中一样的方法,叫重写。
    • 子类中没有父亲中出现过的方法,方法就被继承过来了。
  1. /*
  2. 多态的成员访问特点:
  3. 方法:编译看左边,运行看右边。
  4. 继承的时候:
  5. 子类中有和父类中一样的方法,叫重写。
  6. 子类中没有父亲中出现过的方法,方法就被继承过来了。
  7. */
  8. class A {
  9. public void show() {
  10. show2();
  11. }
  12. public void show2() {
  13. System.out.println("我");
  14. }
  15. }
  16. class B extends A {
  17. /*
  18. public void show() {
  19. show2();
  20. }
  21. */
  22. public void show2() {
  23. System.out.println("爱");
  24. }
  25. }
  26. class C extends B {
  27. public void show() {
  28. super.show();
  29. }
  30. public void show2() {
  31. System.out.println("你");
  32. }
  33. }
  34. public class DuoTaiTest4 {
  35. public static void main(String[] args) {
  36. A a = new B();
  37. a.show();
  38. B b = new C();
  39. b.show();
  40. }
  41. }


抽象类

抽象类概述

  • 动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。在Java中,一个没有方法体(连大括号也没有)的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

抽象类特点

  • 抽象类抽象方法必须用abstract关键字修饰
    • 格式
      • abstract class 类名 {}
      • public abstract void eat();
  • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类不能实例化(抽象类如何实例化呢?)
    • 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
    • 抽象类有构造方法,其作用是为了用于子类访问父类数据的初始化。
  • 抽象类的子类
    • 要么是抽象类
    • 要么重写抽象类中的所有抽象方法
  1. //abstract class Animal //抽象类的声明格式
  2. abstract class Animal {
  3. //抽象方法
  4. //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
  5. public abstract void eat();
  6. public Animal(){}
  7. }
  8. //子类是抽象类
  9. abstract class Dog extends Animal {}
  10. //子类是具体类,重写抽象方法
  11. class Cat extends Animal {
  12. public





















以上是关于No_16_0229 Java基础学习第九天的主要内容,如果未能解决你的问题,请参考以下文章

No_16_0224 Java基础学习第五天

No_16_0324 Java基础学习第二十三天

No_16_0226 Java基础学习第七天

No_16_0221 Java基础学习第一天

No_16_0221 Java基础学习第二天

No_16_0222 Java基础学习第三天