JavaSE复习日记 : 多态

/**
 *  里氏替换原则 :
 *      能使用父类的地方,一定可以使用子类
 *  什么是多态 :
 *          父类的引用,指向子类的对象
 *  多态的前提条件 :
 *          有继承关系的两个类
 *  多态的目的 :
 *        ☆☆☆  代码的重用
 *  多态发什么在什么时候 :
 *          赋值的时候
 *
 * !!!!!!!!! 多态中的 ☆☆☆  覆写 是特指的 成员方法!!!!!!!!!
 *  什么是覆写 :
 *          就是在子类有个和父类相同的方法 : 方法名 , 参数列表 , 返回值类型 (和修饰符列表没关系)
 *              1 方法名相同 : 不相同,就是两个不一样的方法了  不是覆写
 *              2 参数列表相同 : 参数列表不同,就是方法的重载了,也不是覆写
 *                               参数列表的 个数 和 数据类型 都相同 才叫相同吧
 *              3 返回值类型相同 ; 返回值代表函数(方法)的功能,覆写是为了功能更强大,不能降低功能,所以必须相同
 *          覆写之后 不能比原有的方法有更低的访问权限 ( 权限的降低 就意味着 功能的降低 )
 *          覆写之后 不能比原有的方法有更宽泛的异常 ( 只能异常越来越低 )
 *
 *!!!!! ☆☆☆ 父类的属性列表是在编译的时候就生成了 : 就是javac的时候☆☆☆
 *!!!!! ☆☆☆ 子类的属性列表是在运行时才生成 : 就是java运行的时候☆☆☆
 *
 *  父类和子类的调用有两种形式 :
 *          1 多态 父类引用指向子类的对象  父类型 变量名 = new 子类构造方法();
 *              静态变量,静态方法,成员变量 :
 *                                         当这样用引用变量名去调用方法或者变量时 , 先去父类找,如果有这个变量(方法).就会直接执行,不会再去子类中找,如果父类没有这个变量(方法),直接报错( 错误 : 找不到符号 ),不会去子类中找,因为现在子类的属性列表还没有,现在是编译期报错,所以没法去子类找
 *              成员方法 :
 *                       当调用成员方法的时候,先去父类中找,父类如果有,再去子类中找,如果子类覆写了成员方法,就执行子类的成员方法,如果子类没有覆写,就还执行父类的,但是如果父类没有的成员方法,但是子类有,直接报错( 错误 : 找不到符号 ),不会去子类找(不会执行子类特有的成员方法),因为子类现在还没有属性列表,现在只是在编译期报错.
 *          2 直接实例化  子类型 变量名 = new 子类构造方法();
 *              静态变量,静态方法,成员变量 :
 *                                         先去子类找,如果子类有这个变量(方法),就执行,不会再去父类找,如果子类没有这个变量(方法),就会去父类找,执行父类,但是如果子类和父类都没有,就报错( 错误 : 找不到符号 )
 *              成员方法 :
 *                       如果子类有,父类也有,就按子类的执行,那是方法的覆写  ,如果子类没有,就去父类找,执行父类的,如果子类有,父类没有,就执行子类的(用于执行子类特有的方法,是父类没有的),如果都没有,就报错( 错误 : 找不到符号 )
 *
 */
public class Duo_Tai{
    public static void main(String[] args){
        //第一种 多态 父类引用 指向子类的对象
        Fu_Lei f = new Zi_Lei();

         //--------------------变量------------------------------

            //父类有的 子类没有的 静态变量
            int i = f.i;
            System.out.println( i ); // 输出100  是 父类的 静态变量

            //父类有的 子类也有的 静态变量
            int a = f.a; //这里的两个变量 不会冲突 因为前面那个int a 是局部变量  后面那个f.a 是类中的静态变量
            System.out.println( a ); //输出1  是 父类的 静态变量 为什么输出的不是子类的 111

            //父类有的 子类没有的 成员变量
            int j = f.j;
            System.out.println( j );//输出200 是 父类的 成员变量

            //父类有的 子类也有的 成员变量
            int b = f.b;
            System.out.println( b );//输出2 是 父类的 成员变量 为什么输出的不是子类的 2222
            /*
            //父类没有 子类有的 静态变量  为什么?为什么不去调用子类的?
           int m = f.m;  //Duo_Tai.java:48: 错误: 找不到符号
            System.out.println( m );

            //父类没有 子类有的 成员变量  为什么?为什么不去调用子类的?
            int n = f.n;  //Duo_Tai.java:52: 错误: 找不到符号
            System.out.println( n );
            */
        //--------------------方法------------------------------

            //父类有的 子类没有的 静态方法
                f.m6();  //输出 父类的 静态方法

            //父类有的 子类也有的 静态方法
                f.m3();  //输出 父类的 静态方法

            //父类有的 子类没有的 成员方法
                f.m2();  //输出 父类的 成员方法

            //父类有的 子类也有的 成员方法
                f.m1();  //输出 父类的 成员方法
            /*
            //父类没有 子类有的 静态方法   为什么报错?为什么不去调用子类的?
                f.m5();  //Duo_Tai.java:68: 错误: 找不到符号

            //父类没有 子类有的 成员方法   为什么报错?为什么不去调用子类的?
                f.m4();  //Duo_Tai.java:71: 错误: 找不到符号
            */
//----------------------------------------------------------------------           

        //第二种 直接实例化多态 子类引用 是子类的对象
        Zi_Lei z = new Zi_Lei();

         //--------------------变量------------------------------

            //父类有的 子类没有的 静态变量
                int i1 = z.i;  // 输出 父类 的 静态变量
                System.out.println( i1 ); // 为什么子类没有 不会报错?而是去调用父类的

            //父类有的 子类也有的 静态变量
                int a1 = z.a;  // 输出 子类 的 静态变量
                System.out.println( a1 );

            //父类有的 子类没有的 成员变量
                int j1 = z.j;  // 输出 父类 的 成员变量
                System.out.println( j1 );

            //父类有的 子类也有的 成员变量
                int b1 = z.b;  // 输出 子类 的 成员变量
                System.out.println( b1 );
            //父类没有 子类有的 静态变量
                int m1 = z.m;  // 输出 子类 的 静态变量
                System.out.println( m1 ); //为什么父类没有 不会报错?

            //父类没有 子类有的 成员变量
                int n1 = z.n;  // 输出 子类 的 成员变量
                System.out.println( n1 );

        //--------------------方法------------------------------

            //父类有的 子类没有的 静态方法
                z.m6();  //输出 父类的 静态方法 为什么没有报错?而且去调用父类的了静态方法

            //父类有的 子类也有的 静态方法
                z.m3();  //输出 子类的 静态方法

            //父类有的 子类没有的 成员方法
                z.m2();  // 输出 父类的 成员方法 为什么没有报错?而且去调用父类的成员方法

            //父类有的 子类也有的 成员方法
                z.m1();  //输出 子类的 成员方法 为什么?!!!!☆☆☆ 

            //父类没有 子类有的 静态方法
                z.m5();  //输出 子类的 静态方法

            //父类没有 子类有的 成员方法
                z.m4();  //输出 子类的 成员方法
    }
}
class Fu_Lei{//声明一个父类
    static int i = 100;//静态变量 父类的 子类没有的

    static int a = 1;//静态变量 子类也有的

    int j = 200;//成员变量 父类的 子类没有的

    int b = 2;//父类的 子类也有的

    public void m1(){//被覆写的成员变量(子类有的)
        System.out.println( "我是父类的成员方法," );
    }
    public void m2(){//没有被覆写的成员变量 (子类没有的)
        System.out.println( "我是父类的成员方法,没有被覆写的" );
    }
    public static void m3(){//静态方法 子类也有
        System.out.println( "我是父类的静态变量" );
    }
    public static void m6(){//子类没有的静态方法
        System.out.println( "子类没有的静态方法" );
    }
}

class Zi_Lei extends Fu_Lei{//声明一个子类  继承( extends )父类

    static int m = 3;//父类没有的静态变量

    int n = 8;//父类没有的成员变量

    static int a = 111;//父类也有的

    int b = 2222;//父类也有的

    public void m1(){//父类有的成员方法
         System.out.println( "我是子类,我覆写了父类的m1()成员方法" );
    }
    public void m4(){//父类没有的成员方法
         System.out.println( "我是子类,我这个方法,父类没有,是我自己的" );
    }
    public static void m3(){//父类有的静态方法
         System.out.println( "我是子类的静态方法,父类也有哦" );
    }
    public static void m5(){//父类没有的静态方法
         System.out.println( "我是子类的静态方法 , 父类没有," );
    }
}
时间: 2024-11-08 06:41:12

JavaSE复习日记 : 多态的相关文章

JavaSE复习日记 : 抽象类

/* * 抽象类 * 抽象: * 面向对象的三大核心思想; * 封装: 封装,ppp是封装的一部分 * 继承; * 多态: 父类的引用指向子类的对象 * 引用: 是指一个引用型变量 * 有哪些变量? * 成员变量; * 构造方法的局部变量; * 普通方法的局部变量; * 立马声明立马使用的变量; * 静态变量; * 什么是抽象类? * 就是用abstract关键字修饰的类就叫抽象类; * 什么是抽象方法? * 没有方法体的方法叫抽象方法,连{}都没有;抽象方法必须在修饰符列表中加上abstrac

JavaSE复习日记 : 继承关系和super关键字

/* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复用; * 类的实例化复用,类直接的复用; * 类的继承复用; * 前两个我都有发过,这里就说一下类的继承,以及继承中用的较多的关键字:super; * * * 首先要先了解什么是继承? * 继承,用人认知的角度说的话就好比一个父亲的东西由他的几个儿子来继承,也就是有了父亲的东西,同时也有自己的东西-

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

JavaSE复习日记 : java包机制

这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; package com.jaovo.webTeah.db; /* * Java包机制 * * 也就是软件包机制,软件世界中的两大难题:命名和缓存; * * 在程序命名中取一个言简意赅的名字很难,有时候名字取出来发现这个名字已经存在,包括IP,域名,MAC地址冲突等,在计算机中都出现了命名冲突的问题,

JavaSE复习日记 : 条件判断语句

/* 条件控制语句:if(){}else{} 语法: 第一种结构:有不执行的情况 if(boolean表达式){ //第一位真,就执行里面的语句,为假就不执行 java语句; } 第二种结构: if(boolean表达式){ java语句; }else{ java语句; } 第三种结构:多个条件判别式,有不执行情况 if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else i

JavaSE复习日记 : 接口

/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但是这个类却可以实现多个接口; * * 接口还可以看作是只有抽象方法的类,即接口的所有方法都必须被实现; * 接口声明的关键字是interface,代替了class;而普通类的继承关键字extends也变成了implements(实现); * 但是其作用和普通类中是一样的,只不过是为了区分而已; *

JavaSE复习日记 : 八种基本数据类型

/* * 基本数据类型 * * Java里的8种基本数据类型: * byte --- 1 byte = 8 bit; * short --- 2 byte = 16 bit; * int --- 4 byte = 32 bit; * long --- 8 byte = 64 bit; * * float --- 浮点型,32位的空间,数据表示形式是小数(如:3.0) * double --- 浮点型,64位的空间,数据表示形式是小数 * char --- 字符型,char型数据占用两个字节 2

JAVASE复习

top 暑假每天中午更新 六花酱赛高 目录: 内部类 枚举类 垃圾回收 修饰符 与运行环境交互 内部类: 1. 外部类可以通过非静态内部类对象访问内部类的private属性,内部类可以直接访问外部类的private属性,说明外部类和内部类都是在“一个类中”,这样才能相互访问到对方的private属性 2. 非静态内部类的实例化:new Outer().new Inner();//这个很好理解,Inner需要用outer对象来实例化,Inner的命名空间是Outer 3. 静态内部类的实例化: n

javaSE复习之——线程

线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CPU) 在电脑上运行多个程序时,其实cpu一次只能做一个事,做一段时间后然后换另一个另一个做一段时间,只是cpu的速度太快了,看起来就是同时做很多事,也就是说多线程其实只是表面上的多线程,底层cpu还是一次只能做一个事,但是这有个前提,那就是那个cpu是单核cpu,如果事多核cpu,那么就可以真正的达