多态(把代码写活,提高代码的扩展性和可维护性)
生活中的多态:同一种物质,因不同的环境展现不同的形态(水:气态,液态,固态/碳12:金刚石,石墨)
程序中的多态:同一个“接口”因不同的实现,而执行不同的操作(就是在方法中把父类作为形式参数传入,调用的时候,传入子类的实例,最终执行的是子类中重写父类的方法)
多态一般结合方法重写、继承使用,父类引用指向子类;
多态实现步骤:
1.实现继承
2.编译时将父类作为形式参数类型传入(范围大一点,模糊一点)
3.运行时将子类new出的实例传入,最终执行的是子类中重写父类的方法。
类型的转换
1.子类转换为父类,称为自动转换,也叫向上转型
eg: Animal animal = new Dog();
注意:向上转型完之后,animal只能访问父类中的属性和方法,子类中自有的属性和方法无法访问,调用的是子类中重写父类后的方法;
2.父类转换为子类,称为强制转换,也叫向下转型
eg: Animal animal = new Dog();
Dog dog = (Dog)animal; 此时dog只能调用子类中的属性和方法,无法访问父类中的属性和方法。
final关键字,最终的意思
1.修饰变量,该变量就成了常量,不能重新被赋值
2.修饰方法,该方法不能被重写(在子类中)
3.修饰类,该类不能被继承(eg:java.lang包中的Math类和String类)
abstract关键字,抽象的意思
抽象方法:使用abstact修饰的方法,最显著的特点是没有方法体,就是提供给子类重写用的一种规范。(可以abstract void test(),也可以public/protected abstract void test());
抽象类:使用abstract修饰的类,抽象类中可有可无抽象方法,可以有属性和构造方法。但是不能被实例化(不能new),天生为继承而生Animal animal = new Dog();
有抽象方法的类,一定是抽象类,必须是抽象类,要不然会报错。
抽象类的作用:防止编写程序的随意性,提供一种规范;
java中的设计模式(GOF),23种,是前人对经典问题总结出来的解决方案
单例模式:一个类只能创建一个实例对象,实现方法:构造方法私有化,提供一个共有的静态方法获取实例。
实现方式:1.饿汉式 2.懒汉式
简单工厂模式(静态工厂方法):可以生产产品,可以降低因生产产品而导致的耦合性过强(解耦合);
实现方式:1.编写父类和子类或接口和实现类
2.编写静态工厂方法,返回值类型是父类或接口——>多态;
3.根据用户的需求,动态创建子类对象,并返回
package cn.zzsxt.demo7.factory; //创建父类 public abstract class AXE { public abstract void cut(); } package cn.zzsxt.demo7.factory; //创建石斧子类 public class StoneAxe extends AXE { @Override public void cut() { System.out.println("我是石斧,砍日本人钝!"); } } package cn.zzsxt.demo7.factory.copy; //创建铁斧子类 public class SteelAxe extends AXE{ @Override public void cut(){ System.out.println("我是铁斧,砍日本人锋利!"); } } package cn.zzsxt.demo7.factory; //创建静态工厂方法 public class AXEFactory { public static AXE getInstance(String str){ AXE axe = null; if(str.equals("stone")){ axe = new StoneAxe(); }else if(str.equals("steel")){ axe = new SteelAxe(); } return axe; } public static void main(String[] args){ AXE axe = AXEFactory.getInstance("stone"); axe.cut(); System.out.println("========================="); AXE axe2 = AXEFactory.getInstance("steel"); axe2.cut(); } }