Java基础02 面向对象编程的三大特性详解

        Java面向对象编程作为java语言的核心编程思想,其有三大特性:封装继承多态。对于一个类来说,要怎样把拥有共同特性的事物抽象封装成一个类?继承是父类和子类之间的关系,要怎样才能让两个类产生父与子的关系?多态是多个类之间的关系,不同的类又是怎样构成多态关系?

面向对象的三大特性

        Java语言的设计思想就是面对对象编程。万物皆对象,而类又是对象的高度抽象,不同对象之间又有不同的关系。面向对象的三大特性可以分别简单的理解为:

  • 封装:烤面包机的工作原理是封闭的,不被外界所认知。
  • 继承:动物与猫的关系,交通工具与汽车的关系等。
  • 多态:动物中的猫与狗的关系,交通工具的汽车与轮船的关系;继承同一个类的各个子类之间的关系。

封装

        封装是把客观的事物封装成抽象的类,并且把类的数据和方法只让可信的类或对象所操作(通过权限控制关键字 private、default、protected、public 来限制),对毫无关联的类之间,只能通过对外的接口在操作封装的属性和方法。就比如上面举的烤面包机例子一样,我们普通人不知道其内部的工作原理,只能通过烤面包机对外提供的接口(口子,功能、开关)来操作烤面包机,让其制作出美味的面包。

为什么需要封装

        封装的特性就是隐藏类的内部实现机制以及类中的属性,只暴露一些特定的接口给外部使用,对外界来说,其内部的实现机制是不可见的,这样就可以保护类的数据以及逻辑方法。

  • 属性的封装:使用者只能通过对外暴露的特定的接口来操作属性,在接口中就可以方便的加入逻辑控制,限制一些对属性的不合理操作。
  • 方法的封装:外部调用者只能按照指定的方式调用方法,不需要关心方法的内部实现,便于外界的使用;便于修改,可以提高代码的可维护性,使得代码更加健壮。

如何封装

        利用权限修饰符来描述方法体或属性。权限修饰符有如下四个:

  • private:修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问
  • default:修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问。
  • protected:修饰的属性或方法在同一个包中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问。
  • public:修饰的属性或方法外部类中都可以直接访问。
    四大权限控制修饰符
            我们可以简单的理解封装就是把一些五颜六色的小球(小球代表类的属性与方法)放入到一个黑色的箱子里面,对于外界来说,不知道黑箱中有多少个小球,小球有多少种颜色,外界只知道我可以从这个黑箱里面拿到小球。封装的好处就是降低耦合,提高内聚。
            举一个例子,更好地理解封装。我们就把房子看成一个对象,房子里面的家具、装饰看成对象的私有属性,房子的门、窗看做对外提供的接口,房子的墙壁看做封装的壁垒;有了壁垒,就可以起到遮挡的效果,让外界不能看到房子内部的信息,让我们有了自己的隐私,有了门、窗就可以让外界看到房子内部的风景,要是没有对外的接口,完全封闭,那就让你对房间的布置变得毫无意义了。

继承

        继承是从已有的类中派生出的新类,新类即拥有父类中的属性和方法,又可以扩展的新的属性或方法。继承关系是一种 is-a 的关系,就像生活中的猫 is 动物,船 is 交通工具一样。

实现继承的方式

        Java是通过extends关键字来实现继承,父类中通过 private 修饰的属性和方法是不会被继承的,不能在子类中直接操作父类中被 private 修饰的属性或方法。

class 子类 extends 父类{
	......
}

继承的优点

        继承避免了对一般类和特殊类之间共同特征进行的重复描述,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。

继承的一些原则

成员变量的继承原则 具体的原则如下:

  • 能够继承父类的public和protected成员变量;不能够继承父类的private成员变量。
  • 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承。
  • 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

方法的重写

        子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写.通过重写父类的方法,可以用自身的行为代替父类的行为。当调用方法时会优先调用子类的方法。重写要注意:  a、返回值类型  b、方法名  c、参数类型及个数都要与父类继承的方法相同,才叫方法的重写。

多态

        多态是同一个父类的子类之间的关系;实现多态的三个必要条件是继承重写向上转型

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
            只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
            对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
public class main {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//分别将animal实例化成三种动物,
		
		Animal an = new Dog();
		an.cry();//根据每种动物自身的方法,自动选择内容
		an = new Cat();
		an.cry();
		an = new UnknowAnimal();
		an.cry();
	}
}
//基本类,包含一个基本方法
class Animal{
	public void cry(){
		System.out.println("我不知道自己是什么动物。");
	}
}
//声明子类,继承基本类,但有自己的方法
//实例化后优先使用自身的方法。
class Dog extends Animal{
	public void cry(){
		System.out.println("这是一条狗。");
	}
}
 
class Cat extends Animal{
	public void cry(){
		System.out.println("这是一只猫。");
	}
}
//这个子类自身没定义方法,实例化后会使用从父类继承来的方法
class UnknowAnimal extends Animal{
	
}

运行的结果为:

这是一条狗。
这是一只猫。
我不知道自己是什么动物。
原文地址:https://www.cnblogs.com/sophia-show/p/13628474.html