美文网首页
java-面向对象之继承

java-面向对象之继承

作者: pretty_rain | 来源:发表于2019-06-03 18:00 被阅读0次

    1.继承的概念

    把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,多个类就具备了这些内容。这个关系叫继承。
    用extends关键字表示,格式: class 类名 extends 父类

    2.继承的好处

    a: 提高了代码的复用性;
    b:提高了代码的可维护性;
    c:一个类继承一个类是多态的前提;

    3.继承的弊端

    a:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类;
    b:打破了分装性;

    4.java中继承的特点

    a:一个类只能继承一个类,单继承;
    b:可以多层继承,继承体系;

    5.继承的注意事项

    a:子类不能继承父类的私有成员;
    b:子类不能继承父类的构造方法,但可以通过super()去调用;
    c:不要为了部分功能而去继承;

    6.继承中的成员关系

    a:成员变量:
    通过子类的方法访问成员变量的顺序:先找子类方法的局部范围内找,有就使用;再去子类的成员范围找,有就使用;再去父类的成员范围内找,有就使用;找不到就报错;
    b:构造方法:
    子类的构造方法会默认调用父类的无参构造,是为了子类访问父类数据的初始化,如果父类没有无参构造,在子类构造方法中用super指定调用父类的带参数的构造方法,或者是之类构造方法通过this调用自己的构造方法,这个被调用的构造方法一定会有一个访问了父类的带参构造方法;
    c:成员方法:
    通过子类对象访问成员方法的顺序:先在子类中找,有就使用;再去父类中找,有就使用;找不到报错;

    7.Override和Overload的区别

    Override方法重写:在子类中出现了和父类中一模一样的方法声明的方法;
    注意事项:
    a:子类不能重写父类的私有方法(因为私有方法不能被继承);
    b:子类重写父类方法时访问权限不能更低,最好一致;
    c:父类静态方法,子类也必须通过静态方法进行重写,其实这个算不上方法重写,但是现象确实如此
    Overload方法重载:在一个类中出现了方法名称一样的方法;

    8.this和super

    this:代表当前类的对象引用;
    super:代表父类存储空间的标识(可以理解为父类的引用,可以访问父类的)

    9.分析执行结果

    • 1.案例
    class Fu {
        static {
            System.out.println("静态代码块Fu");
        }
    
        {
            System.out.println("构造代码块Fu");
        }
    
        public Fu() {
            System.out.println("构造方法Fu");
        }
    }
    
    class Zi extends Fu {
        static {
            System.out.println("静态代码块Zi");
        }
    
        {
            System.out.println("构造代码块Zi");
        }
    
        public Zi() {
            System.out.println("构造方法Zi");
        }
    }
    
    class ExtendsTest2 {
        public static void main(String[] args) {
            Zi z = new Zi();
        }
    }
    

    分析:
    a: 类加载的时候执行静态代码块,静态代码块被优先加载;
    b:初始化子类的时候先初始化父类(分层加载);
    c:静态代码块构造代码块构造方法执行顺序:静态代码块 > 构造代码块 > 构造方法;
    输出结果:
    静态代码块Fu
    静态代码块Zi
    构造代码块Fu
    构造方法Fu
    构造代码块Zi
    构造方法Zi

    • 2.案例
    class F{
     A a = new A();
     F(){
       System.out.println("F1");
     }
     F(int age){
      System.out.println("F2");
     }
    }
    class Z extends F{
         A a = new A();
       Z(){
       //super(1); 这时执行的是 F2
         System.out.println("Z");
       }
    }
    class A{
        A(){
            System.out.println("A");
        }
    }
    class ExtendsDemo1{
       public static void main(String[] args){
          new Z();
       }
    }
    

    分析:
    a:类初始化过程:成员变量初始化-构造方法初始化;
    b:子类的初始化:先进行父类初始化,然后进行子类初始化(分层初始化);
    输出结果:
    AF1AZ

    相关文章

      网友评论

          本文标题:java-面向对象之继承

          本文链接:https://www.haomeiwen.com/subject/kezqxctx.html