1 多态 2 polymorphism 3 就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。 4 java中如何实现多态?使用多态的好处? 5 引用变量的两种类型: 6 编译时类型(模糊一点,一般是一个父类) 7 public void (Pet pet); 8 由声明时的类型决定。 9 运行时类型(运行时,具体是哪个子类就是哪个子类) 10 由实际对应的对象类型决定。 11 多态的存在要有3个必要条件: 12 要有继承,要有方法重写,父类引用指向子类对象 13 方法的调用看引用 14 方法的执行看对象 15 作用: 16 多态 17 提高了程序的可扩展性和可维护性提高代码复用性 18 封装 19 安全 20 提高代码复用性 21 继承 22 提高代码复用性 23 实现多态的步骤 24 编写父类 25 编写子类 子类重写父类方法 26 运行时,使用父类的类型,子类的对象 27 引用数据类型的类型转换 28 子类转换为父类:自动转换 29 上转型对象不能操作子类新增的成员变量和方法。 30 上转型对象可以操作子类继承或重写的成员变量和方法 31 如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。 32 父类转换为子类:强制转换 33 (绝不是做手术,而是父类的真面目就是一个子类,否则会出现类型转换错误) 34 为了防止转换出错可以先用instanceof判断类型,再去转换 35 package 引用数据类型转换; 36 37 public class Test { 38 public static void main(String[] args) { 39 Pet pet = new Dog(); 40 pet.bark(); 41 42 //判断pet的引用指向的对象是否为Cat类型 43 if (pet instanceof Cat) { 44 Cat cat = (Cat)pet; 45 cat.sleep(); 46 }else { 47 Dog wangcai = (Dog)pet; 48 wangcai.catchMouse(); 49 } 50 } 51 } 52 53 54 ackage 引用数据类型转换; 55 56 public class Cat extends Pet{ 57 public void sleep() { 58 System.out.println("猫在睡觉。。。"); 59 } 60 } 61 62 63 package 引用数据类型转换; 64 65 public abstract class Pet { 66 public void bark(){ 67 System.out.println("宠物发出叫声"); 68 } 69 70 71 package 引用数据类型转换; 72 73 public class Dog extends Pet{ 74 75 @Override 76 public void bark() { 77 System.out.println("won won won ...."); 78 } 79 public void catchMouse() { 80 System.out.println("狗在抓老鼠"); 81 } 82 83 } 84 85 接口 interface 86 为什么需要接口?接口和抽象类的区别? 87 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。 88 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。 89 接口的本质是契约,就像我们人类的法律一样。制定好后大家都遵守 90 项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程! 91 接口不是类,接口是一种引用数据类型 92 接口中的属性都必须是public static final ,声明的时候可以省略 但是接口中的成员变量必须在声明的时候就进行初始化 93 接口中的方法全都是 public abstract 的方法, public abstract可以省略不写 94 接口不能被实例化 95 实现类必须实现接口的所有方法 96 类可以实现多个接口 97 接口中不可以有构造方法 98 接口相关规则: 99 接口中所有方法都是抽象的。 100 即使没有显式的将接口中的成员用public标示,也是public访问类型的 101 接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量。 102 103 可以定义一个新接口,用extends去继承一个已有的接口 104 接口不能继承普通类 105 可以定义一个类,用implements去实现一个接口中所有方法。 106 可以定义一个抽象类,用implements去实现一个接口中部分方法。 107 如何定义接口? 108 格式: 109 [访问修饰符] interface 接口名 [extends 父接口1,父接口2…] { 110 常量定义 //总是public static final 111 方法定义 //总是:public abstract 112 } 113 114 如何实现接口 115 子类通过implements来实现接口中的规范 116 接口不能创建实例,但是可用于声明引用变量类型。 117 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。 118 Java的类只支持单继承,接口支持多继承 119 120 package interfacedemo; 121 /** 122 * 1,接口可以继承其他的接口,接口支持多继承 123 * 2,一个类用implements 关键字去实现一个接口,一个类可以实现多个接口 124 * 3,一个普通的类实现接口,则必须将接口中的所有抽象方法都实现 125 * 4,一个抽象类实现接口,可以不实现接口中的抽象方法 126 * @author tang 127 */ 128 public interface MyInterface{ 129 //接口中可以定义成员变量,接口中的所有成员变量默认都是用public static final 修饰 130 String name = "wangcai"; 131 //接口中所有的方法都是默认用public abstract 来修饰的 132 public abstract void test01(); 133 public abstract void test02(); 134 } 135 ckage interfacedemo; 136 public class Person implements MyInterface{ 137 @Override 138 public void test01() { 139 System.out.println("test01"); 140 } 141 @Override 142 public void test02() { 143 System.out.println("test02"); 144 } 145 } 146 147 C++支持多重继承,Java支持单重继承 148 C++多重继承的危险性在于一个类可能继承了同一个方法的不同实现,会导致系统崩溃。 149 Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继承的危险性。 150 151 class Student extents Person implements Runner,Flyer 152 {…} 153 注意:extends 必须位于implements之前 154 155 开发打印机,墨盒:彩色,黑白,纸张类型:A4 B5,墨盒和纸张都不是打印机厂商生产的,打印机厂商需要兼容市场上的墨盒纸张 156 package print; 157 /** 158 * 开发打印机,墨盒:彩色,黑白,纸张类型:A4 B5 159 * 墨盒和纸张都不是打印机厂商生产的,打印机厂商需要兼容市场上的墨盒纸张 160 161 * @author tang 162 * 163 */ 164 public class Test { 165 public static void main(String[] args) { 166 Print print = new Print(); 167 A4Paper a4 = new A4Paper(); 168 ColorBox box = new ColorBox(); 169 print.setPager(a4); 170 print.setBox(box); 171 print.print(); 172 173 B5Paper b5 = new B5Paper(); 174 BlackBox black = new BlackBox(); 175 print.setBox(black); 176 print.setPager(b5); 177 print.print(); 178 } 179 } 180 181 182 183 package print; 184 185 public class Print { 186 private PaperInterface pager; 187 private BoxInterface box; 188 189 public void print() { 190 System.out.println("正在使用" + box.showColor() + "的墨盒,在" 191 + pager.shosSzie() + "的纸张上打印"); 192 } 193 194 public PaperInterface getPager() { 195 return pager; 196 } 197 198 public void setPager(PaperInterface pager) { 199 this.pager = pager; 200 } 201 202 public BoxInterface getBox() { 203 return box; 204 } 205 206 public void setBox(BoxInterface box) { 207 this.box = box; 208 } 209 } 210 211 212 package print; 213 214 public interface PaperInterface { 215 String shosSzie(); 216 } 217 218 219 220 package print; 221 222 public interface BoxInterface { 223 String showColor(); 224 } 225 226 227 228 package print; 229 230 public class ColorBox implements BoxInterface{ 231 232 @Override 233 public String showColor() { 234 // TODO Auto-generated method stub 235 return "彩色"; 236 } 237 238 } 239 240 241 package print; 242 243 public class BlackBox implements BoxInterface{ 244 245 @Override 246 public String showColor() { 247 // TODO Auto-generated method stub 248 return "黑色"; 249 } 250 251 } 252 253 254 package print; 255 256 public class B5Paper implements PaperInterface{ 257 258 @Override 259 public String shosSzie() { 260 // TODO Auto-generated method stub 261 return "B5"; 262 } 263 264 } 265 266 267 package print; 268 269 public class A4Paper implements PaperInterface{ 270 271 @Override 272 public String shosSzie() { 273 // TODO Auto-generated method stub 274 return "A4"; 275 } 276 277 }