黑马程序员技术交流社区

标题: 继承 [打印本页]

作者: 任有智双元    时间: 2015-8-3 23:25
标题: 继承
1. 回顾
        面向对象三大特性之封装
       
        隐藏对象的属性和具体的实现细节,对外提供公共的访问方式.
               
        private 私有化
       
        class Student
        {
                private String name;
                private int age;
               
                public Student(){}
               
                public Student(String name, int age)
                {
                        // 就近原则
                        this.name = name;
                        this.age = age;
                }
               
                // getters  setters
               
                public String getName()
                {
                        return name;
                }
               
                public void setName(String name)
                {
                        this.name = name;
                }
        }
       
        this关键字
                代表方法所属类的对象的引用. (理解: 谁调用的方法就代表谁)
               
        super
       
        static 关键字  -- 静态的
       
                1) 随着类的加载而加载,优先于对象存在.
                2) 被类的所有对象共享.
                3) 建议使用类名直接调用.
               
                注意事项:        静态方法只能调用静态的成员.
               
        Api的使用
       
        Math类 -- 数学类(提供了常用的算术运算)
                int abs(int i)
                double ceil(double d)
                double floor(double d)
                long round(double d)
                int round(float f)
                double random() -- [0.0, 1.0)
               
                -- 以后设计函数的时候,如果发现参数较多,建议大家去考虑数组或者集合.
               
        Random类
                nextInt() -- 返回int范围内的一个随机数
                nextInt(int n) -- 返回0到n的一个随机数
               
2. 继承
        概念:
                把多个类中相同的内容抽取出来,单独定义到一个类(父类)中,再定义其他类(子类)的时候,继承父类即可.
                子类就可以使用父类所有的非私有的属性和行为.
               
        格式:
                class 子类名 extends 父类名{}
               
        好处:
                1) 提高代码复用性,降低代码的重复率.
                2) 让类与类之间产生关系,是多态的前提.

        特点:
                java的继承只支持单继承,为了避免调用的不明确性.
                但是java支持多层(重)继承.
                       
                       
        几个名词:
                可维护性.
                内聚.
                耦合.
               
        什么时候定义继承:
                体现的是 is a 的关系.
                尽量不要为了使用部分功能而采用继承关系.
       
3. 子父类间成员变量的使用:
        同名的成员变量:
                局部 -- 成员 -- 父类 -- 报错
        局部位置输出局部:
                直接使用变量名即可
        局部位置输出成员:
                this.变量名
        局部位置输出父类:
                super.变量名
               
        class Fu
        {
                int num = 10;

                public void fun()
                {
                        //int num = 30;
                        System.out.println(num);       
                }
        }
       
        class Zi extends Fu
        {
                int num2 = 20;
               
                public void show()
                {
                        int num3 = 30;       
                }
        }
       
        class ZiTest
        {
                public static void main(String[] args)
                {
                        Zi zi = new Zi();
                        zi.fun();
                }
       
        }       

4. this 和 super
        this 代表当前运行类的对象的引用.
        super 代表父类内存空间的标识.(可以理解成父类对象的引用)
       
        应用:
                1) 成员变量
                        this.变量名 -- 本类成员变量
                        super.变量名 -- 父类成员变量
                2) 构造方法:
                        this(参数) -- 调用本类其他构造
                        super(参数) -- 调用父类构造
                        -- 都是通过参数进行匹配
                        注意: 必须放在构造方法的第一行.
                3) 成员方法
                        this.方法名(); -- 本类的方法
                        super.方法名(); -- 父类的方法
               
5. 成员方法
        重写: 子父类之间,出现方法完全一致(返回值类型, 方法名, 参数列表)的情况,称为方法的重写.
                @Override
        重载与重写的区别:
                重载: 一个类中,方法名相同,参数列表不同(参数的个数或者数据类型或者顺序),与返回值类型无关.
                重写:子父类之间,出现方法完全一致(返回值类型, 方法名, 参数列表)的情况,称为方法的重写.
               
        方法的重写注意问题:
                1) 父类的私有方法不能被重写.
                2) 子类重写父类的方法,不能缩小父类方法的访问权限.
                3) 静态方法只能被静态方法重写.
        应用:
                子类的方法既想继承父类方法的功能,又有自己特有的功能,就可以使用super.方法名()来调用父类的功能,并且添加自己的功能.
               
6. 继承中的构造方法执行顺序
       
        子类中的构造方法默认都去访问了父类中的无参构造,因为构造方法的第一行都有一句默认的super();
        目的是为了初始化父类的成员.
       
        如果父类没有无参构造,怎么办?
                1) 用super(参数) 去调用父类的带参构造.
                2) 用this(参数) 去调用本类的其他构造, 想调用的这个构造必须最终调用了父类的带参构造.
               
        构造方法没有重写.
                因为构造方法不被子类继承. 只不过子类创建对象的时候调用了父类的构造方法,去初始化了父类的成员.
       
        但构造方法可以存在重载关系.
       
7. 子父类间代码块执行顺序
       
        父静态代码块 -- 子的静态代码块 -- 父的构造代码块 -- 父的构造方法 -- 子的构造代码块 -- 子的构造方法
       
        特点:
                静态代码块, 随着类的加载而加载,但是只执行一次.
                构造代码块, 在构造方法的执行前会执行,并且每次创建对象都执行.
       
8. 任何类都直接或者间接继承自Object

9. 子类访问父类私有成员的方法
        1) 通过父类提供的公共的get和set方法.
        2) 子类通过调用父类的带参构造.
        基础思想都是一致的:
                对于私有的成员,除了在能所属类中使用之外,不能在其他任何地方直接使用。
                但是可以在所属类中定义公共的访问方式,然后外界通过这种公共的访问方式供其他类或者对象使用。
               
10. final关键字
        最终的意思.
        修饰
                成员变量 -- 其实是一个常量, 一旦被赋值,将不再发生改变.
                        注意: final修饰引用数据类型,指的是修饰的引用的指向不再发生改变.
                成员方法 -- 不能被子类重写.
                类 -- 不能被继承.
               
        finally 关键字
       
        finalize() 方法
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
               
               




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2