zoukankan      html  css  js  c++  java
  • Java基础之理解封装,继承,多态三大特性

    封装

    封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

    代码理解

    public class Student {
    
        public Student(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    

    核心要点

    • 数据是私有的
    • 获取只能通过getter方法
    • 更改只能通过setter方法

    注意要点

    • getter方法禁止返回可变对象的引用,可变对象引用会破坏封装(下面演示错误的使用封装方法)

      public class Student {
      
          public Student(Date birthday) {
              this.birthday = birthday;
          }
      
          private Date birthday;
      
          public Date getBirthday() {
              return birthday;
          }
      
          public void setBirthday(Date birthday) {
              this.birthday = birthday;
          }
      }
      
      class Main{
          public static void main(String[] args) {
              Student student = new Student(new Date());
              System.out.println("student对象的Date:"+student.getBirthday());//student对象的Date:Tue Dec 11 10:50:50 CST 2018
              Date birthday = student.getBirthday();
              birthday.setTime(888888888);
              System.out.println("student对象的Date:"+student.getBirthday());//student对象的Date:Sun Jan 11 14:54:48 CST 1970
          }
      }
      
      

    继承

    通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

    代码理解

    public class Student extends People {
    
    }
    
    class People{
        void sayHello(){
            System.out.println("Hello Word");
        }
    
    }
    
    class Main{
        public static void main(String[] args) {
            Student student = new Student();
            student.sayHello();
        }
    }
    
    

    核心要点

    • 子类会继承父类的非private的属性和方法
    • 可以在子类构造器中使用super关键字对父类private私有与域进行初始化
    • 在类的继承层次中可以使用abstract定义抽象类作为派生其他类的基类
      • 包含一个或者多个的抽象方法必须声明为抽象类
      • 抽象类不可以被实例化
      • 子类实现所有的抽象方法后不再是抽象类
      • 抽象类的层次中可以使用多态既抽象类对象变量引用非抽象类子类实例

    多态

    一个对象变量可以指向多种实际类型的现象被成为多态;在运行时能够自动选择调用那个方法被称为动态绑定.

    代码理解

    public class Student extends People {
        @Override
        void sayHello(){
            System.out.println("I am a Student");
        }
        void studentHello(){
            System.out.println("It is student Say");
        }
    }
    class Teacher extends People{
    }
    class People{
        void sayHello(){
            System.out.println("Hello Word");
        }
    }
    class Main{
        public static void main(String[] args) {
            People people1 = new Teacher();
            People people2 = new Student();
            people1.sayHello();
            people2.sayHello();
            ((Student) people2).studentHello();
        }
    }
    
    

    核心要点

    • 要实现多态必须存在继承关系(student和teacher都继承people)

    • 子类需要将父类的方法重写(继承已经默认重写),如果重写了父类方法则会使用重写方法

    • 需要将子类的引用赋值给父类,这样父类变量就可以调用非子类特有方法

    • 父类引用不可以赋值给子类变量,如果必须需要;可以使用强制类型转换,强制类型转换会暂时忽略对象的实际类型,使用对象的全部功能

      Student student = (Student) new People();
      
  • 相关阅读:
    [汇编] 基础知识
    最长回文子串(1)
    整数分解为2的幂
    位数阶乘
    change log
    SEO简介
    http请求过程
    ES6新增特性——Promise
    rem在移动端的应用
    js截取字符串操作slice、substring 、substr
  • 原文地址:https://www.cnblogs.com/jimisun/p/10101413.html
Copyright © 2011-2022 走看看