构造器与多态
来源:互联网 发布:jquery 1.11.3.min.js 编辑:程序博客网 时间:2024/05/17 06:19
1.构造器的调用顺序
例:
class Real{ public Real(String index) { // TODO Auto-generated constructor stub System.out.println("Real()"+index); }}class Meal{ Real r= new Real("Meal"); Meal() { // TODO Auto-generated constructor stub System.out.println("Meal()"); }}class Bread{ Bread() { // TODO Auto-generated constructor stub System.out.println("Bread()"); }}class Cheese{ Cheese() { System.out.println("Cheese()"); }}class Lettuce{ Lettuce() { // TODO Auto-generated constructor stub System.err.println("Lettuce()"); }}class PortableLunch{ Real r= new Real("PortableLunch"); PortableLunch(){ System.out.println("PortableLunch()"); }}public class Sandwich extends PortableLunch{ Bread b= new Bread(); Cheese c= new Cheese(); Lettuce l= new Lettuce(); Sandwich(){ System.out.println("Sandwich()"); } public static void main(String[] args) { // TODO Auto-generated method stub new Sandwich(); }}
2、继承与清理
例:
class Characteristic { private String s; Characteristic(String s) { this.s = s; System.out.println("Creating Characteristic " + s); } protected void dispose() { System.out.println("disposing Characteristic " + s); }}class Description { private String s; Description(String s) { this.s = s; System.out.println("Creating Description " + s); } protected void dispose() { System.out.println("disposing Description " + s); }}class LivingCreature { private Characteristic p = new Characteristic("is alive"); private Description t = new Description("Basic Living Creature"); LivingCreature() { System.out.println("LivingCreature()"); } protected void dispose() { System.out.println("LivingCreature dispose"); t.dispose(); p.dispose(); }}class Animal extends LivingCreature { private Characteristic p = new Characteristic("has heart"); private Description t = new Description("Animal not Vegetable"); Animal() { System.out.println("Animal()"); } protected void dispose() { System.out.println("Animal dispose"); t.dispose(); p.dispose(); super.dispose(); }}class Amphibian extends Animal { private Characteristic p = new Characteristic("can live in water"); private Description t = new Description("Both water and land"); Amphibian() { System.out.println("Amphibian()"); } protected void dispose() { System.out.println("Amphibian dispose"); t.dispose(); p.dispose(); super.dispose(); }}public class Frog extends Amphibian { private Characteristic p = new Characteristic("Croaks"); private Description t = new Description("Eats Bugs"); public Frog() { System.out.println("Frog()"); } protected void dispose() { System.out.println("Frog dispose"); t.dispose(); p.dispose(); super.dispose(); } public static void main(String[] args) { Frog frog = new Frog(); System.out.println("Bye!"); frog.dispose(); }} /* * Output
3.构造器内部的多态方法的行为
例:
class Glyph { void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); }}class RoundGlyph extends Glyph { private int radius = 1; RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { System.out.println("RoundGlyph.draw(), radius = " + radius); }}public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); }}/**输出结果Glyph() before draw()RoundGlyph.draw(), radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(), radius = 5*/
1.当创建RoundGlyph 对象时,会先为创建该对象分配足够的内存,存储空间清理,
基本类型被初始化为0,变量radius 被初始化为0,
2.再调用基类的构造器,基类构造器
中的draw()方法被子类覆盖,所以draw()调用的是子类RoundGlyph 中的方法,但是子类还没有完成初始化,所以容易出问题
4.协变返回类型
子类覆盖版本返回的类型可以是父类返回类型的子类
例:
class Grain{ public String toString(){ return "Grain"; }}class Wheat extends Grain{ public String toString(){ return "Wheat"; }}class Mill{ Grain process(){ return new Grain(); }}class WheatMill extends Mill{ Wheat process() { return new Wheat(); }}public class CovariantReturn{ public static void main(String[] args) { Mill m = new Mill(); Grain g = m.process(); System.out.println(g); m = new WheatMill(); g = m.process(); System.out.println(g); }}/*OutputGrainWheat*/
5.用继承进行设计
纯继承:(is-a),是一种纯替代,父类和子类有着完全形同的接口
扩展:子类中有额外的方法,子类中的扩展方法基类不能访问,当向上转型时会丢失新方法
向下转型不安全,当转到错误类型容易报错
例:
class Useful { public void f() { System.out.println("Useful f()"); } public void g() { System.out.println("Useful g()"); }}class MoreUseful extends Useful { public void f() { System.out.println("MoreUseful f()"); } public void g() { System.out.println("MoreUseful g()"); } public void u() { System.out.println("MoreUseful u()"); } public void v() { } public void w() { }}public class RTTI { public static void main(String[] args) { Useful[] x = { new Useful(), new MoreUseful() }; x[0].f(); x[1].g(); // x[1].u(); ((MoreUseful) x[1]).u(); ((MoreUseful) x[0]).u();// Exception thrown. }}
阅读全文
0 0
- 构造器与多态
- 构造器与多态
- Java构造器与多态
- Java 构造器与多态
- 构造函数与多态
- 多参构造器与Builder模式
- 构造器与析构器
- 初始化与构造器
- 构造器与析构器
- 实例构造器与类型构造器
- 构造器与构造方法的区别
- 重写与重载,构造器,构造方法
- JAVA构造器+继承+重载与重写+自动转型与多态
- 构造器和多态
- 构造器与初始化块
- 构造器与静态工厂
- 父与子类构造器
- 构造器与方法区别
- 数据库迁移1292错误
- 超级表格的高级使用者都在用视图做些什么?
- c# DataTable用法
- Python环境搭建之OpenCV
- 利用crontab 自动更新svn代码
- 构造器与多态
- 深入理解 Promise 五部曲:5. LEGO
- erlang数据类型(1)
- deeping安装Android studio
- 调度员图形挂牌
- SpringBoot与JUnit+Mockito 单元测试
- centos7 二进制安装包安装 mysql5.6.17
- Spring 注解@Value
- 随即产生两个10-50内的自然数求和