乐趣区

关于java:Java面向对象三大特征

面向对象三大特色

  • 封装

    • 对象的状态信息暗藏在对象外部,不容许内部程序间接拜访对象外部信息,而是通过类所提供的办法来实现对外部信息的操作和拜访。
  • 继承

    • 是实现软件复用的重要伎俩,Java 的继承具备单继承特点,每个子类只有一个间接父类,应用 extends 来实现。
    • 实现继承的类被称为:子类,被继承的类被称为:父类或者基类或者超类。
    • 父类与子类的关系是一种个别和非凡的关系。即,父类(个别),子类(非凡)。比方:水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种非凡的水果。
      public class SubClass extends SuperClass{// 类定义局部}
  • 多态

    • Java 援用变量有两个类型,一个是编译时类型,一个是运行时类型。
    • 编译时类型由申明该变量时应用的类型决定,运行时类型由理论赋给该变量的对象决定。
    • 如果编译时类型与运行时类型不统一,就可能呈现所谓的多态。

      public class SubClass extends BaseClass {
          public String a = "hello world";
      
          public void test() {System.out.println("我是子类,笼罩父类的办法 test");
          }
      
          public void sub() {System.out.println("我是子类 sub 办法");
          }
      }
      
      class BaseClass {
          public int a = 1;
      
          public void base() {System.out.println("我是父类 base 办法");
          }
      
          public void test() {System.out.println("我是父类,将要被子类笼罩的办法 test");
          }
      
          public static void main(String[] args) {
              // 编译时类型与运行时类型统一,不存在多态
              BaseClass baseClass = new BaseClass();
              System.out.println(baseClass.a);//1
              baseClass.base();// 我是父类 base 办法
              baseClass.test();// 我是父类,将要被子类笼罩的办法 test
      
              // 编译时类型与运行时类型统一,不存在多态
              SubClass subClass = new SubClass();
              System.out.println(subClass.a);//hello world
              // 子类中没有此办法,但在父类中有,则调用的是继承到的父类的办法
              subClass.base();// 我是父类 base 办法
              // 子类中有此办法,则调用的是子类中的办法
              subClass.test();// 我是子类,笼罩父类的办法 test
      
              // 编译时类型与运行时类型不统一,产生多态
              BaseClass baseSub = new SubClass();
              // 与办法不同,对象的 filed 属性,不具备多态,调用的是父类的属性
              System.out.println(baseSub.a);//1
              // 运行后,运行时类型是子类。子类中没有此办法,父类有,调用的是继承的父类的办法
              baseSub.base();// 我是父类 base 办法
              // 运行后,运行时类型是子类。子类中有此办法,调用的是子类的办法
              baseSub.test();// 我是子类,笼罩父类的办法 test
      
              //baseSub 定义的时候是 BaseClass 类型,编译的时候,会去找父类 BaseClass 中的办法,发现没有找到,编译会报错
              //baseSub.sub();// 编译时报错}
      }
退出移动版