java继承与多态

继承

基类和派生类

目的:代码的复用
关键词:extends
子类/派生类 extends 父类/基类/超类

public class A extends B{
//类 A继承了类 B
}

子类继承了除构造方法外的所有东西(包括属性和方法)
C++注释:java继承与C++类似,java用关键字extends代替了C++中的冒号(:),并且在java中都是公有继承,没有C++中的私有继承和保护继承。

super关键字

super代表父类的引用
super有三种用法:
1、super.data ;   父类的成员
2、super.func();  父类的方法
3、super();      父类的构造方法
用super调用父类的构造方法时,必须放在第一行(第一行有效)

子类构造方法

在子类构造方法中,要先帮父类进行构造

public class cat extends Animal{
	private  String voice;
	public cat(String name,String sex,String voice) {
		super(name,sex);//调用父类构造且必须放在第一行
		voice ="喵"; //初始化子类数据成员
	}
}

注意:
1、一个类如果被final修饰,这个类不能被继承-》密封类
2、继承最多不超过三层
3、基类只能访问自己的成员和方法

多态

向上转型  (子类-》父类)

向上转型发生的时机:
1、直接赋值

Animal animal=new Cat;  //   Cat 就是Animal的实例

2、方法传参

public class Test { 
  public static void main(String[] args) { 
  	Bird bird = new Bird("花花"); 
  	feed(bird); 
 } 
  public static void feed(Animal animal) { 
  	animal.eat("谷子"); 
 } 
}
//执行结果   花花正在吃谷子
//此时形参 animal 的类型是 Animal (父类),对应到的是Bird(子类)的实例

3、方法返回

public class Test { 
 public static void main(String[] args) { 
 	Animal animal = myAnimal(); 
 } 
 public static Animal myAnimal() { 
 	Bird bird = new Bird("花花"); 
 	return bird; 
 } 
}
//myAnimal返回的是Animal类型的引用,但实际对应的是Bird类型的实例

动态绑定

    调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 这个过程是程序运行时决定的(而不是编译期), 称为动态绑定
1、父类引用子类对象的时候
2、父类子类有同名覆盖方法 通过父类的引用调用同名的方法(super关键字)

public class Test { 
 public static void main(String[] args) { 
	Animal animal1 = new Animal("圆圆"); 
 	animal1.eat("谷子"); 
 	Animal animal2 = new Bird("扁扁"); 
 	animal2.eat("谷子"); 
 } 
}//animal和animal2虽然都是Animal的引用,但animal指向Animal实例,animal2指向Bird实例,所以调用eat方法时执行的程序不同

方法重写

重写:方法名相同 参数列表相同 返回值相同
重写注意事项:
1、方法不能是private
2、子类方法权限一定要大于父类方法权限 public权限最大
3、不能是一个静态方法(static)
访问权限示例:

public class Animal { 
	public void eat(String food) { 
 	... 
 } 
} 
public class Bird extends Animal { 
 // 将子类的 eat 改成 private 
	private void eat(String food) { 
 	... 
 } 
}
//此时会编译出错,因为子类方法是private,父类是public

重写与重载的区别:
重写:方法名相同 、参数列表相同 、返回值相同的情况下, 对方法体进行修改或重写
重载:方法名相同、参数列表不同(参数类型不同、参数个数不同甚至是参数顺序不同),重载对返回类型没有要求

理解多态

一个引用能表现多种不同的形态
只写一些关于父类的代码,就能兼容子类的各种情况

class Shape { //父类,被继承
 public void draw() { 
 // 啥都不用干
 } 
} 
class Cycle extends Shape { 
 @Override 
 public void draw() { 
 System.out.println("○"); 
 } 
} 
class Rect extends Shape { 
 @Override 
 public void draw() { 
 System.out.println("□"); 
 } 
} 
} 
/// 
// Test.java 
public class Test { 
 public static void main(String[] args) { 
 Shape shape1 = new Cycle(); //向上转型
 Shape shape2 = new Rect(); //向上转型
 drawMap(shape1); 
 drawMap(shape2); 
 } 
 // 打印单个图形
 public static void drawShape(Shape shape) { 
 shape.draw(); 
 } 
}

使用多态的好处:
1、类调用者对类的使用成本进一步降低
2、避免使用大量的 if - else
3、可扩展能力更强

向下转型 (父类-》子类)

向下转型就是父类对象转变为子类对象
相比于向上转型,向下转型不常见

Animal animal = new Bird("圆圆"); //向上转型
animal.eat("谷子"); 
animal.fly(); //Animal类中找不到 fly 方法
// 编译出错

向上转型,Animal animal=new Cat; Cat 就是Animal的实例
所以向下转型前要有向上转型

虽然 animal 实际引用的是一个 Bird 对象,但编译器查看的是Animal类中的方法,所以会编译出错

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以作为课程设计的程序,实现简单的绘图,移动图形的功能。 使用vc框架实现。 GHpaint程序的几个重点 程序的基本功能: 程序提供绘图、删除已绘图形、移动已绘图形。 可以选择绘图颜色、形状、线粗。 重点问题: 1、 程序设计基于面向对象。 程序中所有图形都从基类CShapebase派生,大部分工作(例如:删除、移动等)都在这个基类中完成。此类中的两个纯需函数: //纯需函数DrawShape,每个基类都必须实现的函数。 //指定不同图形的绘制方法。 virtual void DrawShape(CDC* pdc) = 0; //橡皮筋效果的算法函数 virtual void ZoomShape(CDC *pdc) = 0; 这两个函数需要在派生类中重载。这两个函数中主要实现不同图形的绘制方法。 也就是说,不同图形的不同点只有绘制方法不同,其他所有属性和行为都可以统一处理。 这里的继承体现了面向对象的设计,论文中可以体现这一点。 2、 动模板库对象CPtList的使用,动模板库基础知识。 CPtList是动模板库的一个实例化类。功能是以链表形式保存指针,至于指针类型不做要求,需要程序员自己设计。 本程序CPtList对象中保存所有图形对象指针,由于所有图形都从CShapebase派生,所以所有图形指针都可以转化为基类CShapebase指针后保存在CPtList中。以后再遍历列表,调用图形对象函数时出现了多调用。这里体现面向对象程序的多,论文中可以说明。 至于CPtList的使用,可以在网上查查,可以看看程序代码,比较简单。 多:是一种函数调用形式。出现在类继承情况下。详细的多定义到网上查查。 程序中的多体现在CShapebase类的虚函数,在使用CShapebase指针调用这两个虚函数,实际调用的使子类的重载函数体。这里实际上是不知道函数怎样工作,但是知道函数功能。 例如:使用CShapebase指针调用DrawShape函数,因为不知道子类是什么图形,所以不知道DrawShape怎样画这个图,但是直到DrawShape函数会把这个图画好,这就达到了要求。 3、 Windows窗口绘图基本知识。 3.1 Windows GUI绘图基本知识。使用MFC类库之后,每个窗口都有一个CDC指针量。这个变量提供图形绘制。CDC类说明查查网络,内容比较多。CDC及提供图形绘制算法,也提供各种绘制模式(单色、异或色等),提供画笔和画刷的功能。 3.2 窗口绘图基本思想: 图形绘制在窗口中,windows不会帮助程序员让图形“长在”窗口上,当窗口被遮挡,最小化后,图形绘消失。程序需要在合适的时机把图形重新画在窗口上。所以窗口上画的内容需要程序员自己思考怎样保存。在本程序中所有图形保存在CPtList对象中。 3.2 Windows为窗口提供了一个重绘消息:OnPaint,在winxp系统中,这个消息会在窗口被遮挡部分从新出现、窗口从最小化恢复时调用。在win7种只有窗口从屏幕外移动进屏幕时调用。具体情况可以查查网络,这里是我的发现,并不是主要内容。 在OnPaint消息中重新绘制所有图形是一个保证图形不消失的好办法。 4、 Windows颜色控制基本知识。 4.1 windows使用RGB三原色(红绿蓝)提供颜色控制,本程序使用24位颜色,在内存中占用4字节,所以用int型表示,但是int型的最高位字节不使用,这样每一种颜色就有一个字节表示,每种颜色级别从0-255。系统提供RGB宏帮助定义颜色,例如:RGB(255,0,0)是红色,RGB(0,0,0)黑色,RGB(255,255,255)白色。 4.2 windows绘图提供多种颜色混合模式,本程序中使用异或模式实现图形的“橡皮筋”效果和移动效果,使用纯色模式定位图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值