黑马程序员技术交流社区

标题: 继承 [打印本页]

作者: 云沾衣。    时间: 2015-9-9 23:58
标题: 继承
1.继承
        什么是继承?
                一个对象可以使用另一个对象里的成员变量和成员方法,就被称为继承

        继承的好处是什么?
                提高代码的复用性
                让类与类之间产生关系,是多态的前提
                既沿袭父类的特有的功能,又可以定义一些自己的功能

        继承的特点是什么?
                Java语言中只支持单继承,不可以多继承,但可以多层继承,不可以循环继承

        我们在使用继承的时候需要注意哪些问题?
                子类只能使用父类中非私有的成员变量和成员方法,不能使用私有成员变量和成员方法。

                                                                                                   
        我们怎么才能使用父类的私有私有成员变量和成员方法呢?
                我们可以在父类中写一个公共的方法,在这个方法里可以调用本类中私有成员变量和成员方法(set get);
               

        子父类之间成员变量的关系?
                父类中有一个成员变量,子类中有一个成员变量,子类的成员方法中有一个局部变量
               
                比如三个变量的名字都不一样的情况下
                例:
                   class Fu {
                           int i = 1;
                   }

                   class Zi extends Fu {
                           int j = 2;

                           public void eat() {
                                   int k = 3;

                                   System.out.println(k);//3
                                   System.out.println(j);//2
                                   System.out.println(i);//1
                           }
                   }

                   class Demo {
                           public static void main(String[] args) {
                                   Zi zi = new Zi();
                                   zi.eat();
                           }
                   }
                 

                 比如三个变量的名字都一样的情况下
                 例:
                    class Fu {
                        int i = 1;
                    }

                    class Zi extends Fu {
                        int i = 2;

                        public void eat() {
                            int i = 3;

                            System.out.println(i);//3
                            System.out.println(i);//3
                            System.out.println(i);//3
                        }
                   }

                   class Demo {
                        public static void main(String[] args) {
                           Zi zi = new Zi();
                           zi.eat();
                        }
                   }
                   那我们怎么才能分别输出父类的成员变量,子类的成员变量,子类的局部变量呢?
                   例:
                   class Fu {
                           int i = 1;
                   }

                   class Zi extends Fu {
                           int i = 2;

                           public void eat() {
                                   int i = 3;

                                   System.out.println(i);//3
                                   System.out.println(this.i);//2
                                   System.out.println(super.i);//1
                           }
                   }

                   class Demo {
                           public static void main(String[] args) {
                                   Zi zi = new Zi();
                                   zi.eat();
                           }
                   }

        子父类之间成员方法的关系?
                父类中有一个成员方法,子类中有一个成员方法

                比如两个方法的名字都不相同的情况下
                例:
                   class Fu {
                           public void printFu( ) {
                                   System.out.println("Fu");
                           }
                   }

                   class Zi extends Fu {
                           public void printZi() {
                                   System.out.println("Zi");
                           }
                   }

                   class Demo {
                           public static void main(String[] args) {
                                   Zi zi = new Zi();
                                   zi.printFu();//Fu
                                   zi.printZi();//Zi
                           }
                   }

                 比如两个方法的名字都相同的情况下
                 例:
                        class Fu {
                           public void print() {
                                   System.out.println("Fu");
                           }
                   }

                   class Zi extends Fu {
                           public void print() {
                                   System.out.println("Zi");
                           }
                   }

                   class Demo {
                           public static void main(String[] args) {
                                   Zi zi = new Zi();
                                   zi.print();//Zi
                                   zi.print();//Zi
                           }
                   }
                结果是打印的两个内容都相同,都是子类中方法的内容,那这里面就引出来一个知识点,方法的重写
                什么是方法的重写?
                        子类中出现与父类的方法的声明完全一下的方法,就称为方法的重写
               
                方法的重写和方法的重载的区别?
                        方法的重写:在子父类继承关系中,子类中出现与父类的方法的声明(返回值类型,方法名,参数列表)完全一样的方法,就称为方法的重写
                        方法的重载:在同一个类中,方法名相同,参数列表不同(参数的个数不同,参数的类型不同或参数的对应的位置顺序不同),与返回值类型无关

                我们在使用方法重写的时候需要注意哪些问题?
                        子类不可以重写父类的私有的成员方法
                        子类方法的访问权限要大于或者等于父类要被重写的方法的访问权限
                        静态方法只能重写静态方法
                        子类不可以重写父类中被final修饰成员方法(下午学习)

        子父类之间构造方法的关系?
                子类中构造方法第一行都有默认的隐藏的语句:super(),前提是第一行没有this()的时候,构造方法的第一行要么是super(),要么是this(参数)

                子类中所有的构造方法中至少有一个构造方法里的第一行是super();

                例:
                   class Fu {
                        public Fu() {}
                   }

                   class Zi extends Fu {
                        public Zi() {
                           //隐藏的super();
                        }
                   }


                   class Fu {
                        public Fu() {}
                   }

                   class Zi extends Fu {
                        int age;
                        public Zi() {
                           this(18);
                        }

                        public Zi(int age) {
                            //隐藏了super();
                            this.age = age;
                        }
                   }

2.super关键字
        什么是super关键字?
                代表父类内存空间的标识,在用法上可以理解为父类对象的引用,但我们不能说它就是父类对象的引用,用法和this一样

        super关键字和this关键字怎么调用成员变量,成员方法和构造方法?
        调用成员变量:
        this.成员变量名;
        super.成员变量名;

        调用成员方法:
        this.成员方法名();
        super.成员方法名();

        调用构造方法:
        this(参数);
        super(参数);

3.静态代码块
        什么是静态代码块?
                就是在构造代码块前面加上一个static就变成了静态代码块

        静态代码块的特点是什么?
                随着类的加载而加载,只执行一次,在第一次创建该类对象的时候执行一次,
                之后不管创建该类对象多少次,该静态代码块都不会再执行了

        子父类之间静态代码块,构造代码块和构造方法的先后执行的顺序是什么样子的?
                父类的静态代码块 --> 子类的静态代码块 --> 父类的构造代码块 --> 父类的构造方法 --> 子类的构造代码块 --> 子类的构造方法

4.final关键字
        什么是final关键字?
                它是一个修饰符,代表最终的意思,它可以修饰类,变量,成员方法

        final关键字的特点是什么?
                它修饰的类不可以被继承
                它修饰的方法不可以被重写
                它修饰的变量为常量




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