传智播客黑马Java学习笔记_day10_02
对象的多态性
父类或者接口的引用指向子类对象
多态的好处
提高了代码的扩展性,前期的代码可以使用后期的内容
多态的弊端
前期的代码不能调用后期的特有内容
多态的前提
必须有关系:继承、实现
必须覆盖父类的方法
注意
对于转型自始至终都是子类对象在做类型变化
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();}}
}
多态时成员的特点
成员变量
参考引用变量所属的类的成员变量
成员函数
编译时看父类是否有对应的函数,运行时看子类对象是否有对应的函数
静态函数
参考引用变量所属的类的成员变量,其实对于静态方法是不需要对象的。
内部类
分析事物时,发现事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这事就把还有的事物定义为内部类描述
内部类的访问特点
- 内部类可以直接访问外部类的成员
- 外部类要访问内部类的成员,必须建立内部类对象
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相关推荐
- 传智播客黑马Java学习笔记_day08_2
设计模式:对问题行之有效的解决方式,一种思想,java24种 单例设计模式 解决问题:可以保证一个类的对象在内存中的唯一性 应用场景:多个程序使用同一个配置文件对象,就要保证配置文件的唯一性,配置文件 ...
- 传智播客黑马Java学习笔记_09
在子类创建对象时,发现父类的构造方法也运行了,为什么呢? 在子类的构造函数中第一行有一个隐式语句super(); class Fu{Fu(){System.out.println("Fu i ...
- 传智播客黑马Java学习笔记_day05
遍历数组 class Demo{public static void main(String args[]){int[] arry=new int[]{87,99,56};for(int x=0;x& ...
- 【传智播客】Libevent学习笔记(三):事件循环
目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...
- 【传智播客】Libevent学习笔记(四):事件event
目录 00. 目录 01. 事件概述 02. 创建事件 03. 事件的标志 04. 事件持久性 05. 超时事件 06. 信号事件 07. 设置不使用堆分配的事件 08. 事件的未决和非未决 09. ...
- 【传智播客】Libevent学习笔记(一):简介和安装
目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...
- 传智播客.黑马程序员,学C++不再难!
众所周知,C++难.就好像博大精深的汉语比英语难,这是客观事实,我们并不否认. 但,转念想想,英语也不简单吧?从小学开始学,到了大学,挂在四六级上的同学数不胜数.可貌似没 ...
- 传智播客 传智播客.NET视频学习课件
传智播客 传智播客.NET视频学习课件 访问.NET网站了解更多课程详情 http://net.itcast.cn (小提示:为什么本书中超链接打不开?) 此套课件是伴随传智播客.net实况教学视频 ...
- 细节决定成败 – 选择传智播客成都java培训
传智播客成都Java培训中心,成立于2010年,秉承了北京传智播客"为企业优选一流好人才"的培训理念,"为学员提供高薪保证"的就业承诺!结合成都本地的优势,迅速 ...
最新文章
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 社交产品后端架构设计--转载
- 在现代引擎游戏中使用正确的渲染打光流程
- ZDOzMRVAOq
- 设计php框架_自制PHP框架之设计模式
- 前端学习(2562):v-loading
- ehcache 的 diskStore path
- Redis3集群搭建
- 解决复杂问题的思路 —— 从简单到复杂
- 房价增幅或于年底见顶
- 鸡兔同笼(一道明显的体现cin和cout运行较慢的特点)
- android7.0 投屏,流水断崖安卓投屏
- 世界上最健康的作息时间表
- 每日一课 | 数据分析的本质是什么?
- 未成年人勿进 谨以献给1980~1990出生的人(四)
- Unity3d制作2D游戏飞翔的小鸟(FlappyBird)
- 英语4级词汇量有多少?【原创】
- 黑客黑掉15万台打印机,可打印任意文档
- bapi (物料主数据导入)的部分基础用法
- 35岁后,不是你被淘汰,而是你没有发现你的价值 | 如何发现35岁后的价值?