zoukankan      html  css  js  c++  java
  • java基础之继承

    1.什么是不能被继承的?

    public 可被继承,同名成员变量和静态的方法会被子类隐藏/屏蔽

    private,不可见,不能继承

    static(不可继承,可被子类调用,但会被同名屏蔽)  

      子类可以有同名的非static 或者static 的成员变量,都会屏蔽父类的同名成员变量.

      static 修饰的方法不能被覆盖.子类有同名的静态方法,则调用子类的方法,否则调用父类的.子类不能有同名的非static 方法.

    覆盖只针对非静态方法,而隐藏/屏蔽是针对成员变量和静态方法的。隐藏/屏蔽的意思是你存在,但是我就当你不存在一样.所有的同名操作都之后对子类的产生效果.

    synchronized

    final(可被子类继承,但不可被覆盖)

    2.关于成员变量被private 修饰,就是不能在子类被继承,但是为什么 例如setter/getter 之类和成员变量直接关联的方法依然可以在子类中使用呢?

    父类:

    public class Person {
        private String name;
        private int age;
    
        public  String getName() {
            System.out.println("person.name:"+this.name);
            return name;
        }
    
        public  void setName(String name) {
    
            this.name = name;
        }
    
        public int getAge() {
            System.out.println("person.age:"+this.age);
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
    }

    子类:

    public class Predisw extends Person {
    
    }

    测试:

    public class TestPredisw {
    
        @Test
        public  void TestAdd(){
            Predisw predisw=new Predisw();
            predisw.setAge(11);
            predisw.setName("person");
    
            System.out.println(predisw.getName()+":"+predisw.getAge());
        }
    }

    输出:

    person.name:person
    person.age:11

    变量:

    结论:

    在new Predisw();的时候,子类的构造器调用了父类的构造器,所以从本质上来说,是创建了一个新的Person 对象.

     

    如果在Predisw 类中添加一个私有变量会如何?

    public class Predisw extends Person {
        private String name="predisw";
    
    }

    运行TestPredisw 时的变量情况如下:

    打印结果是

    person.name:person
    person.age:11
    person:11

    多了一个name 的变量.应该是在new Predisw() 的时候调用了super() 和将这个变量添加到新的Predisw 实例中.所以实际上Predisw 有2个name 变量,并没有覆盖掉父类的同名变量.

    注意:打印出来的不是子类的name 值而是父类的name 的值,尽管子类调用了setNmae();这是因为子类没有覆盖父类的方法,所有实际上调用的是父类的方,改变的是父类的构造函数构造出来对象的成员变量的name值.

    这个时候如果在Predisw 类中添加name 的setter/getter 会如何?

    public class Predisw extends Person {
        private String name;
        
        public String getName() {
            System.out.println("predisw.name:"+this.name);
            return name;
        }
    
        public void setName(String name) {
    
            this.name = name;
        }
    }

    运行TestPredisw 中的方法时,变量情况如下:

    输出结果如下:

    predisw.name:person
    person.age:11

     结论:继承的方法会调用子类的方法,父类的同名方法被覆盖了.子类的方法只能操作到子类的成员变量,而父类的成员变量是私有的,只有通过父类的setter/getter 才能调用.但是父类的setter/getter 被覆盖了,所以父类的name就无法再被修改了.

    3.关于static 成员变量

    public class Person {
        public static  String name;
        private int age;
    }
    
    public class Predisw extends Person {
    
        private String name;
    }
    
    
    public class TestPredisw {
    
        @Test
        public  void TestAdd(){
            
            Person person=new Person();
            Predisw predisw=new Predisw();
             }   
    }

    运行TestPredisw 时内存变量如下:

    注意没有Person 对象 static 成员变量的name的值,也就是说在new 的时候没有初始化static name.这个name 在加载Person类时初始化了.

  • 相关阅读:
    Linux进程管理与任务计划
    Linux磁盘存储和文件系统
    Oracle Net
    Oracle常用命令
    Ansible之playbook,yaml文件详解
    ansible配置文件详解
    linux学习笔记12-lap+mysql主从+proxy
    Linux 学习笔记11-lamp+redis主从
    Linux学习笔记10-kickstart批量安装centos7
    Linux学习笔记9-ftp服务器
  • 原文地址:https://www.cnblogs.com/predisw/p/4776012.html
Copyright © 2011-2022 走看看