当前位置: 首页 > news >正文

做品牌形象网站手机网站样式

做品牌形象网站,手机网站样式,微信做网站的弊端,王者荣耀官方网站目录 Java面向对象与多态 多态介绍 形成多态的前提 多态下成员访问的特点 成员变量 成员方法 访问特点总结 多态对比普通继承 普通继承优点与缺点 多态优点与缺点 向上转型与向下转型 向下转型存在的问题 多态接口练习 Java面向对象与多态 多态介绍 在前面学习到…

目录

Java面向对象与多态

多态介绍

形成多态的前提

多态下成员访问的特点

成员变量

成员方法

访问特点总结

多态对比普通继承

普通继承优点与缺点

多态优点与缺点

向上转型与向下转型

向下转型存在的问题

多态+接口练习


Java面向对象与多态

多态介绍

在前面学习到的接口和继承中,如果父类只能使用父类的方法,子类可以使用父类和自己的方法,但是有时需要使用父类调用子类重写的父类方法,上面的思路就不再合适,此时就可以使用多态。

多态的特点:使用父类引用指向子类的对象,此时父类可以调用子类重写父类的方法,但是调不到子类特有的成员

形成多态的前提

使用多态需要保证四点:

  1. 保证存在继承(包括接口与实现类)关系
  2. 子类重写了父类中非私有的方法
  3. 父类引用指向子类对象
  4. 父类引用调用子类重写的父类方法

例如下面的代码:

// 父类
public abstract class Base {public abstract void method();
}// 子类
public class Derived extends Base{// 重写父类的抽象方法@Overridepublic void method() {System.out.println("子类重写父类的方法");}
}// 测试
public class Test {public static void main(String[] args) {// 父类引用指向子类对象Base base = new Derived();base.method();// 调用重写的方法}
}

多态下成员访问的特点

成员变量

实现多态后,因为是父类引用,所以只能访问到子类与父类共用的成员

// 父类
public abstract class Base {// 父类成员public int numBase;public Base(int numBase) {this.numBase = numBase;}
}// 子类
public class Derived extends Base{public int numDerived;public Derived(int numBase, int numDerived) {super(numBase);this.numDerived = numDerived;}
}// 测试
public class Test {public static void main(String[] args) {// 父类引用指向子类对象Base base = new Derived(10, 20);System.out.println(base.numBase);// 访问父类属性
//        System.out.println(base.numDeried); // 无法访问子类属性}
}

成员方法

多态出现的意义就是父类引用可以访问到子类的方法,但是只能访问到子类重写的父类方法

// 父类
public abstract class Base {public abstract void method();
}// 子类
public class Derived extends Base{// 重写父类的抽象方法@Overridepublic void method() {System.out.println("子类重写父类的方法");}// 子类特有方法public void methodDerived(){System.out.println("子类特有方法");}
}// 测试
public class Test {public static void main(String[] args) {// 父类引用指向子类对象Base base = new Derived(10, 20);base.method();// 调用重写的方法
//        base.methodDerived(); // 无法访问子类特有方法}
}

访问特点总结

  1. 访问成员变量时:看赋值符号左侧是子类还是父类,如果是父类,调用就是父类成员变量,否则调用的是子类成员变量
  2. 访问成员方法时:看new的是哪一个对象,如果是子类,则访问的是子类中的成员方法(多态时访问的子类重写后的成员方法),否则访问的就是父类自己的成员方法

多态对比普通继承

普通继承优点与缺点

  • 普通继承优点:

赋值符号左右两边类型相等,调用时父类只能访问自己的成员,子类可以访问和父类共有的成员以及自己特有的成员

  • 普通继承的缺点:

可扩展性差


例如下面的代码:

// 父类
public abstract class Base {public abstract void methodBase();
}// 子类1
public class Derived1 extends Base{@Overridepublic void methodBase() {System.out.println("Derived1重写父类方法");}
}// 子类2
public class Derived2 extends Base{@Overridepublic void methodBase() {System.out.println("Derived2重写父类的方法");}
}

在普通的继承中,当子类想调用自己重写后的方法需要按照下面的方式进行:

public class Test {public static void main(String[] args) {Derived1 derived1 = new Derived1();Derived2 derived2 = new Derived2();// 调用重写的方法derived1.methodBase();derived2.methodBase();}
}

如果此时需要将两个对象作为函数的参数,就需要写两个函数,例如:

// 测试
public static void test(Derived1 derived1)
{derived1.methodBase();
}public static void test(Derived2 derived2)
{derived2.methodBase();
}

如果子类非常多,则需要覆盖的测试函数就会变多,从而导致可扩展性差

多态优点与缺点

  • 多态优点:

因为父类可以访问到子类重写的方法,所以只需要在测试参数处写为父类引用即可,可扩展性强

  • 多态缺点:

因为创建的是子类对象,所以只能访问子类和父类共有的成员以及子类重写父类的方法

实际上,多态出现的目的就是为了解决前面普通继承的缺点,所以多态自身的缺点可以忽略

例如,上面的测试代码就可以修改为:

public class Test {public static void main(String[] args) {Derived1 derived1 = new Derived1();Derived2 derived2 = new Derived2();test(derived1);test(derived2);}// 测试public static void test(Base base){base.methodBase();}
}

此时因为参数的base是父类引用,而接收到的实参指向子类引用,所以实参传递给形参即父类引用指向子类引用

向上转型与向下转型

向上转型:父类引用指向子类对象,即多态

向下转型:指向子类对象的父类引用转换为子类引用,向下转型可以解决部分情况下需要调用子类特有的成员,使用强制转换的方式可以实现向下转型,例如下面的代码:

public class Test {public static void main(String[] args) {// 向上转型Base base = new Derived1();base.methodBase();// 向下转型Derived1 derived1 = (Derived1) base;derived1.methodDerived1(); // 调用子类特有的方法derived1.methodBase(); // 调用父类的方法}
}

向下转型存在的问题

向下转型之前的引用是父类引用,此时给对应的子类引用没有任何问题。但是如果给另一个子类就会出现ClassCastException

例如下面的代码,先展示正常情况下的向上转型:

// 父类
public abstract class Base {public abstract void methodBase();
}// 子类1
public class Derived1 extends Base{@Overridepublic void methodBase() {System.out.println("Derived1重写父类方法");}// 子类特有方法public void methodDerived1() {System.out.println("Derived1特有方法");}
}// 子类2
public class Derived2 extends Base{@Overridepublic void methodBase() {System.out.println("Derived2重写父类的方法");}// 子类特有方法public void methodDerived2() {System.out.println("Derived2特有方法");}
}// 测试
public class Test {public static void main(String[] args) {Base base1 = new Derived1();Base base2 = new Derived2();// 向上转型test(base1);test(base2);}public static void test(Base base){base.methodBase();}
}

接着展示向下转型:

public static void test(Base base)
{// 向下转型Derived1 derived1 = (Derived1) base;derived1.methodDerived1(); // 调用子类特有的方法
}

上面的代码当base接收的是Derive1的对象,则没有任何问题,因为引用也是Derive1类的引用,但是如果baseDerive2的对象,此时就会出现异常,下面是报错信息:

Exception in thread "main" java.lang.ClassCastException: com.epsda.advanced.cmp_extends_polymorphic.Derived2 cannot be cast to com.epsda.advanced.cmp_extends_polymorphic.Derived1at com.epsda.advanced.cmp_extends_polymorphic.Test.test(Test.java:33)at com.epsda.advanced.cmp_extends_polymorphic.Test.main(Test.java:17)

所以,为了避免出现这种问题,再进行向下转型前需要先判断当前类型是否与引用类型匹配,可以使用instanceof关键字,使用方式如下:

对象 instanceof 目标类

所以上面的测试代码可以修改为:

public static void test(Base base)
{// 向下转型+判断if(base instanceof Derived1) {Derived1 derived1 = (Derived1) base;derived1.methodDerived1(); // 调用子类特有的方法}else {Derived2 derived2 = (Derived2) base;derived2.methodDerived2(); // 调用子类特有的方法}
}

多态+接口练习

案例:

定义笔记本类,具备开机,关机和使用USB设备的功能。具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用

进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘

  • USB接口,包含开启功能、关闭功能
  • 笔记本类,包含运行功能、关机功能、使用USB设备功能
  • 鼠标类,要符合USB接口
  • 键盘类,要符合USB接口

参考代码:

// 笔记本类
public class Laptop{// 开机方法public void startCom() {System.out.println("笔记本开机");}// 关机方法public void shutdownCom() {System.out.println("笔记本关机");}public void setUsbStart(USB usb) {usb.startUSB();}public void setUsbShutdown(USB usb) {usb.shutdownUSB();}
}// USB接口
public interface USB {// USB开机public abstract void startUSB();// USB关机public abstract void shutdownUSB();
}// 鼠标类
public class Mouse implements USB{@Overridepublic void startUSB() {System.out.println("鼠标插上");}@Overridepublic void shutdownUSB() {System.out.println("鼠标拔下");}
}// 键盘类
public class Keyboard implements USB{@Overridepublic void startUSB() {System.out.println("键盘插上");}@Overridepublic void shutdownUSB() {System.out.println("键盘拔下");}
}// 测试类
public class Test {public static void main(String[] args) {USB mouse = new Mouse();USB keyboard = new Keyboard();Laptop laptop = new Laptop();laptop.startCom();laptop.setUsbStart(mouse);laptop.setUsbStart(keyboard);laptop.setUsbShutdown(mouse);laptop.setUsbShutdown(keyboard);laptop.shutdownCom();}
}输出结果:
笔记本开机
鼠标插上
键盘插上
鼠标拔下
键盘拔下
笔记本关机
http://www.yayakq.cn/news/998711/

相关文章:

  • 备案期间网站能打开吗深圳住房和城乡建设厅官网
  • 烟台快速建站有哪些公司重庆竣工验收备案网上查询
  • 怎么开网站平台挣钱深圳市宝安区建设局网站
  • 加强统计局网站的建设和管理排版设计工作内容
  • 注册网站需要备案吗招聘类网站怎么做
  • 潍坊网站定制建设品牌网站
  • 高端网站建设推荐万维科技网站制作开发的步骤和方法
  • 高端建站是什么意思东莞网站制作多少钱
  • 商丘网站建设方案网站建设的实施制作阶段包括
  • 重庆工程交易信息网好的seo公司营销网
  • 百度公司官方网站产品营销网站建设
  • 分享型网站制作网页模板素材
  • 铜川微网站建设珠海做网站
  • 新思维网站科技创新的评价机制的作用
  • 做网站v1认证是什么意思网站不收录的技术原因
  • 网站建设一次网站推广的方式?
  • 做网站组服务器西安企业名录
  • 网站备案登录抚顺地区网站建设
  • 在线做投资网站手机网站建设选 朗创营销
  • 优秀金融网站设计入门做外贸是先建网站还是先参展
  • 网站开发和优化关系网站开发与iso9001关系
  • 没有网站怎么推广推广普通话活动方案和总结
  • asp转换手机网站网站说服力营销型网站策划
  • wordpress建站有广告吗深圳十大科技公司排名
  • 深圳网站优化价格甘肃第九建设集团公司网站
  • 英语网站案例北京新增病例轨迹涉一网咖
  • 网站制作优化推广河北省住房建设厅网站
  • php mysql网站开发实例电商网站楼层 设计
  • 广州手机网站建设报价建设英文网站赚钱的36个方法
  • 2022近期重大新闻事件10条免费seo关键词优化服务