目录

一、封装

1、封装特性及优点

2、封装的实现

二、继承

1、定义和作用

2、特性

3、关键字

4、补充概念

三、多态

1、定义和优点

2、多态存在的三个必要条件:

3、多态的实现方式

一、封装

1、封装特性及优点

在面向对象程式设计方法中,封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问;要访问该类的代码和数据,必须通过严格的接口控制;封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段;适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

封装的优点

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

2、封装的实现

  • 修改属性的可见性来限制对属性的访问(一般限制为private),例如
public class People {
//将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
    private String name;
    private int age;
}
  • 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class People{
    //采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
    private String name;
    private int age;

    public String getName(){
        return name;
    }

  
    public void setName(String name){
        this.name = name;
    }
}

二、继承

1、定义和作用

继承:就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。需要注意的是 Java 不支持多继承,但支持多重继承。

继承的作用:提高了代码的复用性;使类与类之间产生了关系,有了这个关系,才有多态的特性。

举例说明

public class Dog  {
    String name;
    int age;
    int legs;
    public void eat() {
        System.out.println("小狗吃肉");
    }
}
public class Cat  {
    String name;
    int age;
    int legs;
    public void eat() {
        System.out.println("小猫吃鱼");
    }
}

以上代码中,有两个类,各自己含有两个成员变量和一个成员方法。

其中,“String name; int age; int legs;”这三个变量,是两个类中所具备的共性的描述。

那么如何将共性的描述抽取单独封装,又可以让两个类所共用呢?这就用到JAVA类的一个特性——继承(extends)。

public class Animal {
    String name;
    int age;
    int legs;
    public void eat(){
        System.out.println("动物要吃饭");
    };
}
public class Dog extends Animal {
    
    public void eat() {
        System.out.println("小狗吃肉");
    }
}
public class Cat extends Animal {
    public void eat() {
       System.out.println("小猫吃鱼");
    }

}

这个Animal类就可以作为一个父类,然后Dog类和Cat类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码)

2、特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

3、关键字

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

extends关键字

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

用法见定义和应用里的实例

implements关键字

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

public interface A {
    public void eat();
    public void sleep();
}

public interface B {
    public void show();
}

public class C implements A,B {
}

super关键字

public class Animal {
    String name;
    int age;
    int legs;
    public void eat(){
        System.out.println("动物要吃饭");
    };
}

public class Dog extends Animal {

    public void eat() {
        System.out.println("小狗吃肉");
    }
    public void test(){
        this.eat();//引用自己的eat()方法
        super.eat();//引用父类的eat()方法
    }
}


final关键字

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

  • 声明类: final class 类名 {//类体}
  • 声明方法: 修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final

4、补充概念

  • 隐藏

父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的

public class Animal {
    String name;
    int age;
    int legs;
    public void eat(){
        System.out.println("动物要吃饭");
    };
    //类方法,静态方法
    //通过类就可以直接调用
    public static void run(){
        System.out.println("动物在奔跑");
    }
}

public class Cat extends Animal {
    //重写父类方法
    public void eat() {
       System.out.println("小猫吃鱼");
    }
    //隐藏父类的run方法
    public static void run(){
        System.out.println("小猫在奔跑");
    }

}


  • 对象转型

引用类型和对象类型不一致的情况下的转换问题

子类转父类(向上转型)

Animal a = new Animal();
Cat c = new Cat();
a = c;

一个很简单的判别办法,把右边的当做左边来用,看说得通不。右边c引用所指向的对象的类型是 猫
左边a引用的类型是 普通动物,把猫 当做 普通动物,说不说得通? 说得通,就可以转

父类转子类(向下转型)

父类转子类,有的时候行,有的时候不行,所以必须进行强制转换。强制转换的意思就是 转换有风险,风险自担。

可以的情况

Animal a = new Animal();
Cat c = new Cat();
a = c;
c = (Cat) a;

不可以的情况

Animal a = new Animal();
Cat c = new Cat();
Dog d = new Dog();
a = d;
c = (Cat) a;

没有继承关系的两个类,互相转换

没有继承关系的两个类,互相转换,一定会失败。
虽然Cat和Dog都继承了Animal,但是彼此没有互相继承关系

实现类转换成接口(向上转型)

接口转换成实现类(向下转型)

  • 构造器

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

 

三、多态

1、定义和优点

定义:多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

优点:1. 消除类型之间的耦合关系;2. 可替换性;3. 可扩充性;4. 接口性;5. 灵活性;6. 简化性;

 

2、多态存在的三个必要条件:

继承、重写、父类引用指向子类对象

例如:

Parent p = new Child();

3、多态的实现方式

  • 方式一:重写:
  • 方式二:接口
  • 方式三:抽象类和抽象方法