大数据--Java面向对象
项目:客户关系管理系统(略)
-
项目中不包含新知识点
-
项目的业务逻辑相较于普通的练习来说,更复杂一些。

1. 从结果上来说:体现为类的继承性
* 子类继承父类以后,当创建子类对象时,堆空间中除了会加载子类自己特有的属性之外,还会加载其所有的父类
* 中的属性。当权限允许的情况下,子类对象可以调用父类的属性。
*
* 2. 从过程上来看:
* 当我们子类构造器创建子类对象时,一定会直接或间接的调用其父类的构造器,乃至于父类的父类的构造器,。。。
* 直到调用了java.lang.Object类的构造器。由于我们加载过子类的所有的父类的构造器,所有,我们在堆空间
* 中就存在子类及其所有父类中声明的属性了。
*
* 3. 明确:此时在内存空间中,只存在唯一的一个对象。即为new后面子类的对象。
面向对象的特征之三:多态性的使用
*
* 1.多态性:一个事物的多种形态。
*
* 2.广义上的多态性:① 方法的重写 ② 子类对象的多态性
*
* 3. 子类对象的多态性:父类的引用指向子类的对象。(或子类的对象赋给父类的引用)
how?
4. 子类对象的多态性的应用:虚方法调用(virtual method)
* 编译时,引用变量p2只能调用父类声明的方法。当运行时,实际执行的是子类重写父类的方法。
* 简称:编译看左边,运行看右边。
*
* 5. 子类对象的多态性使用的前提:① 类的继承性 ② 方法的重写
*
* 6. 子类对象的多态性不适用于属性、构造器。
对应的代码
1 public class PersonTest { 2 public static void main(String[] args) { 3 Person p1 = new Person(); 4 Man m1 = new Man(); 5 6 p1.eat(); 7 p1.walk(); 8 9 m1.eat(); 10 m1.earnMoney(); 11 12 int i = 10; 13 float f = 10.0F; 14 15 //自动类型提升 16 double d = 10; 17 System.out.println("#######################"); 18 19 //子类对象的多态性 20 Person p2 = new Man(); 21 22 //多态性的应用:虚方法调用(virtual method) 23 //编译时,引用变量p2只能调用父类声明的方法。当运行时,实际执行的是子类重写父类的方法。 24 p2.eat(); 25 p2.walk(); 26 //编译不通过。 27 // p2.earnMoney(); 28 29 System.out.println(p2.id);//1001 30 } 31 }
其中,相关的类定义如下:
1 package com.atguigu.java; 2 3 /** 4 * @author shkstart 5 * @create 2020-07-06 15:35 6 */ 7 public class Person { 8 String name; 9 int age; 10 int id = 1001; 11 12 public void eat(){ 13 System.out.println("人:吃饭"); 14 } 15 16 public void walk(){ 17 System.out.println("人:走路"); 18 } 19 } 20 21 package com.atguigu.java; 22 23 /** 24 * @author shkstart 25 * @create 2020-07-06 15:39 26 */ 27 public class Woman extends Person { 28 29 boolean isBeauty; 30 31 public void eat(){ 32 System.out.println("女人:少吃饭,减肥"); 33 } 34 35 public void walk(){ 36 System.out.println("女人:窈窕的走路"); 37 } 38 39 public void goShopping(){ 40 System.out.println("女人心情不好使,一逛街就心情愉悦"); 41 } 42 } 43 package com.atguigu.java; 44 45 /** 46 * @author shkstart 47 * @create 2020-07-06 15:36 48 */ 49 public class Man extends Person { 50 51 boolean isSmoking; 52 int id = 1002; 53 54 public void eat(){ 55 System.out.println("男人:多吃肉,长肌肉"); 56 } 57 58 public void walk(){ 59 System.out.println("男人:笔挺的走路"); 60 } 61 62 public void earnMoney(){ 63 System.out.println("男人挣钱养家..."); 64 } 65 66 }
why?
1 package com.atguigu.java; 2 3 /** 4 * 多态性的使用举例 5 * 6 * @author shkstart 7 * @create 2020-07-06 16:18 8 */ 9 //举例一: 10 public class AnimalTest { 11 12 public static void main(String[] args) { 13 AnimalTest test = new AnimalTest(); 14 // test.func(new Animal()); 15 test.func(new Dog()); 16 test.func(new Cat()); 17 } 18 19 public void func(Animal animal) {//Animal animal = new Dog() 20 animal.eat(); 21 animal.shout(); 22 23 if (animal instanceof Dog) { 24 Dog dog = (Dog) animal; 25 dog.protectHouse(); 26 27 }else if(animal instanceof Cat){ 28 Cat cat = (Cat)animal; 29 cat.catchMouse(); 30 } 31 32 33 // animal.protectHouse(); 34 } 35 //省略了重载的方法的定义。 36 // public void func(Dog dog){ 37 // dog.eat(); 38 // dog.shout(); 39 // } 40 // 41 // public void func(Cat cat){ 42 // cat.eat(); 43 // cat.shout(); 44 // } 45 } 46 47 class Animal { 48 49 public void eat() { 50 System.out.println("动物进食"); 51 } 52 53 public void shout() { 54 System.out.println("动物叫~~"); 55 } 56 57 } 58 59 class Dog extends Animal { 60 public void eat() { 61 System.out.println("狗吃骨头"); 62 } 63 64 public void shout() { 65 System.out.println("汪~汪~汪~"); 66 } 67 68 public void protectHouse() { 69 System.out.println("狗能看门"); 70 } 71 } 72 73 class Cat extends Animal { 74 public void eat() { 75 System.out.println("猫吃鱼~"); 76 } 77 78 public void shout() { 79 System.out.println("喵~喵~喵~"); 80 } 81 82 public void catchMouse() { 83 System.out.println("猫抓老鼠"); 84 } 85 } 86 87 //举例二: 88 /* 89 class Customer{ 90 private Account acct; 91 92 public void setAccount(Account acct){ //Account acct = new CheckAccount() 93 this.account = account; 94 } 95 96 97 98 } 99 100 class Account{ 101 double balance; 102 103 //存钱、取钱 104 } 105 106 class SavingAccount extends Account{} 107 108 class CheckAccount extends Account{} 109 110 111 112 113 */ 114 115 //举例三: 116 /* 117 java.lang.Object类中定义的方法: 118 public boolean equals(Object obj){} 119 120 121 */ 122 123 //举例四:使用jdbc技术操作数据库:mysql\oracle\db2\sqlserver\.... 124 //比如:jdbc中涉及一个父类:Connection。及其内部的一些关于操作数据库的通用方法。 125 /* 126 public void operateData(Connection conn){ 127 //通过conn获取连接、传送sql语句、执行、.... 128 } 129 130 131 */
1 //可以考虑将声明为父类引用的子类对象,通过强转符的方式,将父类的引用再转为子类的引用 2 Man m2 = (Man)p2; 3 m2.isSmoking = true; 4 m2.earnMoney(); 5 //强转时,可能出现类型转换异常:ClassCastException 6 // Woman w1 = (Woman)p2; 7 // w1.goShopping(); 8 // w1.isBeauty = true; 9 10 //向下转型 11 //为了避免在强转时出现ClassCastException,我们在强转前,使用instanceof 进行判断即可。 12 /* 13 格式:a instanceof A:判断对象a是否是类型A的一个实例。 14 如果是,返回true。如果不是,返回false。 15 16 补充:如果a instanceof A返回true,则a instanceof B也一定返回true。其中,类型B是类型A的父类。 17 */ 18 Person p3 = new Woman(); 19 if(p3 instanceof Woman){ 20 Woman w2 = (Woman) p3; 21 System.out.println("可以转换为Woman"); 22 } 23 24 if(p3 instanceof Man){ 25 Man m3 = (Man) p3; 26 System.out.println("可以转换为Man"); 27 } 28 29 if(p3 instanceof Person){ 30 System.out.println("person ....."); 31 } 32 if(p3 instanceof Object){ 33 System.out.println("Object..."); 34 }



浙公网安备 33010602011771号