对象的转型
~~~
package obj.b8;
/**
对象的转型:
1.对象的向上转型 子类转成父类 默认进行 父类引用指向子类对象
2.对象的向下转型 父类转成子类 强制进行
关键字:instanceof 测试左边的对象是否是右边类的实例 ,如果是返回true,不是返回false
*/
class Animal{
void sleep(){
System.out.println("睡觉中");
}
}
class Cat extends Animal{
void catchMouse(){
System.out.println("捕鼠");
}
}
class Dog extends Animal{
}
public class Test {
public static void main(String[] args) {
Animal a = new Cat();//向上
System.out.println(a instanceof Animal);//true
System.out.println(a instanceof Cat);//true
Cat c =(Cat)a;//向下 所以强制
a.sleep();//存在
//a.catchMouse();//不存在//将猫当动物看待
c.sleep();//存在
c.catchMouse();//存在
//Dog d =(Dog)a;//编译没错,但运行会出现类型不匹配错误
}
}
~~~
多态的概述
~~~
package obj.b9;
/*
OOP三大特写:封装,继承,多态
多态:可以理解为事物存在的多种体现形态
动物:猫,狗,猪
人:男人 女人
*/
class Animal{
void sing(){
System.out.println("唱歌");
}
}
class Dog extends Animal{
void sing(){
System.out.println("汪汪汪唱歌");
}
}
class Cat extends Animal{
void sing(){
System.out.println("喵喵喵唱歌");
}
void catchMouse(){
System.out.println("捕鼠");
}
}
public class Test {
public static void main(String[] args) {
Cat a=new Cat();
Dog b=new Dog();
/*a.sing();
b.sing();*/
function(a);
function(b);
}
/*public static void function(Cat c){
c.sing();
}
public static void function(Dog c){
c.sing();
}*/
public static void function(Animal c){
c.sing();
}
}
~~~
~~~
1.多态的体现
父类引用指向子类对象
2.多态的前提
(1)必须得类与类之间存在关系,可以是继承关系,也可以是实现关系
(2)必须得重写
3.多态的好处
大大提高了程序的可扩展性
4.多态的弊端
只能用父类的引用,访问到父类中的成员
多态成员变量的特点:
1.编译期间:参阅的是引用型变量所属的类中是否有调用的方法
2.运行期间:参阅对象所属的类中是否有调用的方法
~~~
对比:
没有多态
~~~
package obj.c1;
import java.util.*;
class FK{
void bx(){
System.out.println("变形");
}
}
class FK_szx extends FK{//山字型
void bx(){
System.out.println("山字型在变形");
}
}
class FK_lzx extends FK{//L字型
void bx(){
System.out.println("L字型在变形");
}
}
class FK_zzx extends FK{//Z字型
void bx(){
System.out.println("Z字型在变形");
}
}
class FK_cfx extends FK{//长方形
void bx(){
System.out.println("长方形在变形");
}
}
public class Test {
public static void main(String[] args) {
Random r =new Random();
int a=r.nextInt(4);//0,1,2,3
switch(a){
case 0:
FK_szx szx=new FK_szx();
szx.bx();
break;
case 1:
FK_lzx lzx=new FK_lzx();
lzx.bx();
break;
case 2:
FK_zzx zzx=new FK_zzx();
zzx.bx();
break;
case 3:
FK_cfx cfx=new FK_cfx();
cfx.bx();
break;
}
}
}
~~~
使用了多态
~~~
package obj.c1;
import java.util.*;
class FK{
void bx(){
System.out.println("变形");
}
}
class FK_szx extends FK{//山字型
void bx(){
System.out.println("山字型在变形");
}
}
class FK_lzx extends FK{//L字型
void bx(){
System.out.println("L字型在变形");
}
}
class FK_zzx extends FK{//Z字型
void bx(){
System.out.println("Z字型在变形");
}
}
class FK_cfx extends FK{//长方形
void bx(){
System.out.println("长方形在变形");
}
}
public class Test {
public static void main(String[] args) {
Random r =new Random();
int a=r.nextInt(4);//0,1,2,3
FK fk=null;
switch(a){
case 0:
fk=new FK_szx();
break;
case 1:
fk=new FK_lzx();
break;
case 2:
fk=new FK_zzx();
break;
case 3:
fk=new FK_cfx();
break;
}
fk.bx();
}
}
~~~
- 书写心得
- 1.初识Java
- 2.变量、数据类型和运算符
- 实例:数据的输入
- 实例:变量互换
- 3.条件选择结构
- 案例:判断年份是否为闰年
- 案例:生成随机数
- 实例:剪刀石头布
- 4.循环结构
- 实例:猜数字游戏
- Myeclipse
- 实例:九九乘法表
- 实例:日历
- 5.数组
- JVM内存分析
- 键盘录入赋值数组
- 数组的length属性
- 数组的最大值(打擂台)
- 数组的排序
- 数组复制算法
- 数组的查找算法(搜索)
- 数组的插入算法
- 数组的冒泡算法
- 数组的选择排序
- 多维数组
- 实例:学生成绩管理系统
- 类和对象
- 概念
- 内存分析
- 创建类和对象
- 面向对象与内存分析
- 有参数无(有)返回值的调用
- 成员变量
- return和多参方法
- toString方法
- this关键字
- 封装
- 方法的重载
- 构造方法
- 阶段性总结
- 实例:学生管理系统
- Test.java
- Student.java
- Admin.java
- 构造代码块及构造函数之间的调用
- main方法和静态应用工具类及classpath
- static关键字
- 文档注释和静态代码块及单例模式
- 继承
- 多态
- 匿名对象和toString()和equals及final
- 抽象类和模板方法设计模式
- 接口
- 包机制和包与包之间的访问权限和jar包