Java面向对象-继承、多态、封装

Java继承

  • 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  • 类的继承格式

    class 父类 {
    }
     
    class 子类 extends 父类 {
    }
    
  • 继承类型

    • 单继承

      public class A{......}
      public class B extends A{......}
      
    • 多重继承

      public class A{......}
      public class B extends A{......}
      public class C extends B{......}
      
    • 不同类继承同一个类

      public class A{......}
      public class B extends A{......}
      public class C extends A{......}
      
    • 多继承(不支持);Java不支持多继承,但支持多重继承

      public class A{......}
      public class B{......}
      public class C extends A,B{......}//Java不支持多继承
      
  • 继承的特性

    • 子类拥有父类非 private 的属性、方法。
    • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
    • 子类可以用自己的方式实现父类的方法。
    • Java 的继承是单继承,也可以多重继承。
    • 类之间的耦合性高,代码独立性差。
  • 继承关键字

    继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

    • extends关键字

      在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

      public class Animal { 
      	......
      }
      public class Penguin extends Animal{ 
      	......
      }
      
    • implements关键字

      使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

      public interface A {
      	......
      }
      public interface A {
      	......
      }
      public class C implements A,B {
      }
      
    • super与this关键字

      class Animal {
        void eat() {
          System.out.println("animal : eat");
        }
      }
       
      class Dog extends Animal {
        void eat() {
          System.out.println("dog : eat");
        }
        void eatTest() {
          this.eat();   // this 调用自己的方法
          super.eat();  // super 调用父类方法
        }
      }
      
    • final关键字

      final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

      • 声明类

        final class 类名 {//类体}
        
      • 声明方法

        修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
        
  • 构造器

    子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

    如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

Java重写(Override)与重载(Overload)

  • 重写(Override)

    • 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

    • 当需要在子类中调用父类的被重写方法时,要使用super关键字。

  • 重载(Overload)

    • 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
    • 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
    • 最常用的地方就是构造器的重载。
  • 重写与重载之间的区别

    区别点重载方法重写方法
    参数列表必须修改一定不能修改
    返回类型可以修改一定不能修改
    异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
    访问可以修改一定不能做更严格的限制(可以降低限制)
  • 总结

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

    • 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
    • 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
    • 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

Java多态

  • 多态是同一个行为具有多个不同表现形式或形态的能力。

  • 多态存在的三个必要条件

    • 继承
    • 重写
    • 父类引用指向子类对象
    Parent p = new Child();
    

    当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

  • 虚函数

    虚函数的存在是为了多态。

    Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。

  • 多态的实现方式

    • 重写
    • 接口
    • 抽象类和抽象方法

Java封装

  • 封装的优点

    • 良好的封装能够减少耦合。
    • 类内部的结构可以自由修改。
    • 可以对成员变量进行更精确的控制。
    • 隐藏信息,实现细节。
  • 实现Java封装的步骤

    • 修改属性的可见性来限制对属性的访问(一般限制为private,只能本类才能访问,其他类都访问不了)

      public class Person {
          private int age;
      }
      
    • 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问

      public class Person{
          private int age;
      
          public int getAge(){
            return age;
          }
      
          public void setAge(int age){
            this.age = age;
          }
          
      }
      

      采用 this 关键字是为了解决实例变量(private int age)和局部变量(setAge(int age)中的age变量)之间发生的同名的冲突。

    • 任何要访问类中私有成员变量的类都要通过这些getter和setter方法。

Java接口

  • Java接口

    • 类描述对象的属性和方法。接口则包含类要实现的方法。

    • 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

    • 接口无法被实例化,但是可以被实现。

  • 接口与类的相似点

    • 一个接口可以有多个方法。
    • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
    • 接口的字节码文件保存在 .class 结尾的文件中。
    • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
  • 接口与类的区别

    • 接口不能用于实例化对象。
    • 接口没有构造方法。
    • 接口中所有的方法必须是抽象方法。
    • 接口不能包含成员变量,除了 static 和 final 变量。
    • 接口不是被类继承了,而是要被类实现。
    • 接口支持多继承。
  • 接口特性

    • 接口中的方法会被隐式的指定为 public abstract
    • 接口中的变量会被隐式的指定为 public static final 变量
    • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
  • 抽象类和接口的区别

    • 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
    • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 接口的声明interface

    [可见度] interface 接口名称 [extends 其他的接口名] {
            // 声明变量
            // 抽象方法
    }
    
    interface Animal {
       public void eat();
    }
    
  • 接口的实现implements

    ...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
    
    public class MammalInt implements Animal{
     
       public void eat(){
          System.out.println("Mammal eats");
       }
    }
    
  • 接口的继承

    接口的继承使用extends关键字,子接口继承父接口的方法

  • 接口的多继承

    在Java中,类的多继承是不合法,但接口允许多继承。

    在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。

    public interface Hockey extends Sports, Event
    
  • 标记接口

    • 标记接口是没有任何方法和属性的接口。
    • 标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。
    • 标记接口目的:
      • 建立一个公共的父接口
      • 向一个类添加数据类型

观察者模式

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

  • 观察者模式使用三个类 Subject、Observer 和 Client。

  • **意图:**定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  • **主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

  • **何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

  • **如何解决:**使用面向对象技术,可以将这种依赖关系弱化。

  • **关键代码:**在抽象类里有一个 ArrayList 存放观察者们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值