对象的多态性

父类或者接口的引用指向子类对象

多态的好处

提高了代码的扩展性,前期的代码可以使用后期的内容

多态的弊端

前期的代码不能调用后期的特有内容

多态的前提

必须有关系:继承、实现

必须覆盖父类的方法

注意

对于转型自始至终都是子类对象在做类型变化

abstract class Animal{public abstract void eat();
}class Cat{public static void eat(){System.out.println("吃鱼");}public static catchMouse(){System.out.println("抓老鼠");}
}class Dog{public static void eat(){System.out.println("啃骨头");}public static lookAfterHome(){System.out.println("看家");}
}class Test{public static void main(String args[]){Animal animal= new Cat();//向上转型,自动类型提升,限制特有功能的访问animal.eat();Animal animal2= new Dog();animal.eat();Cat cat=(Cat)animal;//向下转型,为了使用特有功能}
}

类型判断instanceof

abstract class Animal{public abstract void eat();
}class Cat{public static void eat(){System.out.println("吃鱼");}public static catchMouse(){System.out.println("抓老鼠");}
}class Dog{public static void eat(){System.out.println("啃骨头");}public static lookAfterHome(){System.out.println("看家");}
}class Test{public static void main(String args[]){Animal animal= new Cat();//向上转型,自动类型提升,限制特有功能的访问animal.eat();Animal animal2= new Dog();animal.eat();Cat cat=(Cat)animal;//向下转型,为了使用特有功能method(animal);}public void method(Animal animal){if(animal instanceof Cat){Cat c=(Cat) aniaml;c.catachMouse();}}
}

多态时成员的特点

成员变量

参考引用变量所属的类的成员变量

成员函数

编译时看父类是否有对应的函数,运行时看子类对象是否有对应的函数

静态函数

参考引用变量所属的类的成员变量,其实对于静态方法是不需要对象的。

内部类

分析事物时,发现事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这事就把还有的事物定义为内部类描述

内部类的访问特点

  1. 内部类可以直接访问外部类的成员
  2. 外部类要访问内部类的成员,必须建立内部类对象
class Outer{private int num=4;class Inner{void show{System.out.println(num);}}public void method(){Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer outer=new Outer();outer.method();}
}

直接访问外部类中内部类成员

class Outer{private int num=4;class Inner{void show{System.out.println(num);}}public void method(){Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer.Inner inner=new Outer().new Inner();//创建出外部类对象再创建内部类对象Inner.show();}
}

如果内部类是静态的

class Outer{private static int num=4;static class Inner{void show{System.out.println(num);}}public void method(){Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer.Inner inner=new Outer.Inner();//直接创建Innerinner.show();}
}

如果内部类是静态的,成员是静态的(如果内部类定义了静态成员,该内部类也必须是静态的)

class Outer{private int num=4;class Inner{static void show{System.out.println(num);}}public void method(){Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer.Inner.show();}
}

为什么内部类能直接访问外部类的成员,因为持有了外部类的引用Outer.this

class Outer{private int num=4;class Inner{int num=3;static void show{int num=5System.out.println(num);//输出5System.out.println(this.num);//输出4System.out.println(Inner.this.num);//输出3}}public void method(){Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer.Inner.show();}
}

内部类可以放在局部位置上,只能访问final修饰的局部变量,为了防止对象还存在,局部变量不在的情况

class Outer{private int num=4;public void method(){final int xclass Inner{int num=3;static void show(){System.out.println(num);}}Inner inner=new Inner();inner.show();}
}class Test{public static void main(String args[]){Outer.Inner.show();}
}

匿名内部类

前提:必须继承一个父类或者实现一个接口

匿名内部类其实就是一个匿名子类对象,new 父类/接口 (){子类内容}

abstract class Demo{public abstract void show();
}class Outer{public void method(){new Demo(){public void show(){System.out.println("hahaha");}}.show();
}
}

匿名内部类使用场景之一

当函数参数为接口,且接口中的方法不超过三个,这时可以使用匿名内部类作为实际参数传递

abstract Interface Demo{public abstract void show1();public abstract void show2();
}class Outer{public void method(Demo demo){demo.show1();demo.show2();
}public static void main(String args[]){Outer outer=new Outer();outer.method(new Demo(){public abstract void show1(){System.out.println("show1");}public abstract void show2(){System.out.println("show2");}      })
}
}

对象初始化过程

super

显式初始化

构造代码块初始化

自定义构造函数

传智播客黑马Java学习笔记_day10_02相关推荐

  1. 传智播客黑马Java学习笔记_day08_2

    设计模式:对问题行之有效的解决方式,一种思想,java24种 单例设计模式 解决问题:可以保证一个类的对象在内存中的唯一性 应用场景:多个程序使用同一个配置文件对象,就要保证配置文件的唯一性,配置文件 ...

  2. 传智播客黑马Java学习笔记_09

    在子类创建对象时,发现父类的构造方法也运行了,为什么呢? 在子类的构造函数中第一行有一个隐式语句super(); class Fu{Fu(){System.out.println("Fu i ...

  3. 传智播客黑马Java学习笔记_day05

    遍历数组 class Demo{public static void main(String args[]){int[] arry=new int[]{87,99,56};for(int x=0;x& ...

  4. 【传智播客】Libevent学习笔记(三):事件循环

    目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...

  5. 【传智播客】Libevent学习笔记(四):事件event

    目录 00. 目录 01. 事件概述 02. 创建事件 03. 事件的标志 04. 事件持久性 05. 超时事件 06. 信号事件 07. 设置不使用堆分配的事件 08. 事件的未决和非未决 09. ...

  6. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  7. 传智播客.黑马程序员,学C++不再难!

            众所周知,C++难.就好像博大精深的汉语比英语难,这是客观事实,我们并不否认.        但,转念想想,英语也不简单吧?从小学开始学,到了大学,挂在四六级上的同学数不胜数.可貌似没 ...

  8. 传智播客 传智播客.NET视频学习课件

    传智播客 传智播客.NET视频学习课件 访问.NET网站了解更多课程详情 http://net.itcast.cn (小提示:为什么本书中超链接打不开?) 此套课件是伴随传智播客.net实况教学视频 ...

  9. 细节决定成败 – 选择传智播客成都java培训

    传智播客成都Java培训中心,成立于2010年,秉承了北京传智播客"为企业优选一流好人才"的培训理念,"为学员提供高薪保证"的就业承诺!结合成都本地的优势,迅速 ...

最新文章

  1. 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
  2. 社交产品后端架构设计--转载
  3. 在现代引擎游戏中使用正确的渲染打光流程
  4. ZDOzMRVAOq
  5. 设计php框架_自制PHP框架之设计模式
  6. 前端学习(2562):v-loading
  7. ehcache 的 diskStore path
  8. Redis3集群搭建
  9. 解决复杂问题的思路 —— 从简单到复杂
  10. 房价增幅或于年底见顶
  11. 鸡兔同笼(一道明显的体现cin和cout运行较慢的特点)
  12. android7.0 投屏,流水断崖安卓投屏
  13. 世界上最健康的作息时间表
  14. 每日一课 | 数据分析的本质是什么?
  15. 未成年人勿进 谨以献给1980~1990出生的人(四)
  16. Unity3d制作2D游戏飞翔的小鸟(FlappyBird)
  17. 英语4级词汇量有多少?【原创】
  18. 黑客黑掉15万台打印机,可打印任意文档
  19. bapi (物料主数据导入)的部分基础用法
  20. 35岁后,不是你被淘汰,而是你没有发现你的价值 | 如何发现35岁后的价值?

热门文章

  1. Unity FairyGUI(一)
  2. 基于stm32的恒功率无线充电
  3. 机电一体化c语言程序设计,求助机电一体化程序设计的题
  4. 微信转账2020假图片_2020新版微信头像下载-2020新版微信头像图片大全 v7.0.20
  5. 利用layer-list来制作阴影效果背景
  6. 豆瓣FM电台Chrome扩展——下载
  7. 如何实现一个安卓群控系统
  8. XP盗版”大虾PK百度谷歌 谋划3年上市
  9. 团队管理中提高团队凝聚力方法
  10. 北师大 外国教育史-7(进步主义教育运动)