Java面向对象编程之三大特性

Java面向对象编程做为一种编程思想,有三大特性,封装,继承,多态。对于一个类而言, 如何封装 呢?继承是父类和子类的关系, 继承关系如何实现的呢?父类和子类继承时的方法体是怎么样的关系呢?多态是多个类之间的关系,类有不一样的行为和属性,其余类也有这样的方法和属性,就实现了多态的关系,不一样类的多态实现是怎么样实现的呢?java

一:面向对象编程三大特性

面向对象编程是利用 类和对象编程的一种思想。万物可归类,类是对于世界事物的高度抽象 ,不一样的事物之间有不一样的关系 ,一个类自身与外界的封装关系,一个父类和子类的继承关系, 一个类和多个类的多态关系。万物皆对象,对象是具体的世界事物,面向对象的三大特征封装,继承,多态,封装,封装说明一个类行为和属性与其余类的关系,低耦合,高内聚;继承是父类和子类的关系,多态说的是类与类的关系。web

在这里插入图片描述

1. 封装

  • 什么是封装
    把客观事物封装成抽象的类,而且把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。也 就 是 说抽象数据类型对数据信息以及对数据的操做进行打包,将其变成一个不可分割 的实体,在这个实体内部,咱们对数据进行隐藏和保密,只留下一些接口供外部调用。编程

    简单的说,一个类就是一个封装了数据以及操做这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据能够是私有的,不能被外界访问。经过这种方式,对象对内部数据提供了不一样级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。svg

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

就比如一个烤面包机,咱们把面包(数据)放进去,按下开关,过了一会,它就会自动弹出烤好的面包(处理后的信息),而这个过程是怎么烤的(对数据的操做),咱们是不须要知道的,
  • 为何须要封装
    隐藏一个类中不须要对外提供的实现细节;设计

    属性的封装:使用者只能经过事先定制好的方法来访问数据,能够方便地加入逻辑控制,限制对属性的 不合理操做;code

    方法的封装:使用者按照既定的方式调用方法,没必要关心方法的内部实现,便于使用; 便于修改,加强 代码的可维护性;
    -如何封装
    利用权限修饰符来描述方法体或属性。private修饰的属性或方法为该类所特有,在任何其余类中都不能直接访问;default修饰的属性或方法具备包访问特性,同一个包中的其余类能够访问;protected修饰的属性或方法在同一个中的其余类能够访问,同时对于不在同一个包中的子类中也能够访问;public修饰的属性或方法外部类中均可以直接访问。
    在这里插入图片描述xml

封装相似于黑箱操做,其设计要求是低耦合,高内聚。一个具体复杂的对象有不少的属性和方法,有些须要公开,有些不须要公开,就比如一个具体的人的信息,有些是public,有些是private,而有些是protecred,别人问到的时候对于怎么样的信息都有不一样的态度。根据与这我的的关系来回答问题,封装的结果是输出结果,不问过程,其中,public是能够被任何变量访问的,private是该类私有的,protected类是受保护的,能够被该类所述的包内的全部的其余类访问,其子类也能够访问。对象

好比咱们将一个房子看作是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,可是若是咱们没有那些墙遮挡,是否是别人就会尽收眼底呢?没有一点儿隐私!就是存在那个遮挡的墙,咱们既可以有本身的隐私并且咱们能够随意的更改里面的摆设而不会影响到其余的。可是若是没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?因此经过门窗别人也可以看到里面的风景。因此说门窗就是房子对象留给外界访问的接口。blog

2.继承

- 什么是继承
继承是从已有的类中派生出新的类,新的类能吸取已有类的数据属性和行为,并能扩展新的能力。

在本职上是特殊——通常的关系,即常说的is-a关系。子类继承父类,代表子类是一种特殊的父类,而且具备父类所不具备的一些属性或方法。从多种实现类中抽象出一个基类,使其具有多种实现类的共同特性 ,当实现类用extends关键字继承了基类(父类)后,实现类就具有了这些相同的属性。

继承的类叫作子类(派生类或者超类),被继承的类叫作父类(或者基类)。

好比从猫类、狗类、虎类中能够抽象出一个动物类,具备和猫、狗、虎类的共同特性(吃、跑、叫等)。

  • 如何实现继承: Java经过extends关键字来实现继承,父类中经过private定义的变量和方法不会被继承,不能在子类中直接操做父类经过private定义的变量以及方法。
    在这里插入图片描述

    继承的优势: 继承避免了对通常类和特殊类之间共同特征进行的重复描述,经过继承能够清晰地表达每一项共同特征所适应的概念范围——在通常类中定义的属性和操做适应于这个类自己以及它如下的每一层特殊类的所有对象。运用继承原则使得系统模型比较简练也比较清晰。
    - 继承有哪些原则
    成员变量的继承原则 具体的原则以下:

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

    1.方法的重写
     子类若是对继承的父类的方法不满意(不适合),能够本身编写继承的方法,这种方式就称为方法的重写.经过重写父类的方法,能够用自身的行为代替父类的行为。当调用方法时会优先调用子类的方法。重写要注意:  a、返回值类型  b、方法名  c、参数类型及个数
     都要与父类继承的方法相同,才叫方法的重写。
     重载和重写的区别:
      方法重载:在同一个类中处理不一样数据的多个相同方法名的多态手段。
      方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改
    2. 继承初始化顺序
    父类的构造器调用以及初始化过程必定在子类的前面
      一、初始化父类再初始化子类
      二、先执行初始化对象中属性,再执行构造方法中的初始化。
     基于上面两点,咱们就知道实例化一个子类,java程序的执行顺序是:
     父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法   
     下面有个形象的图:
    在这里插入图片描述
    继承实例:

/**
 1. 我是父类super
 2. 我是子类sub
 3. 先打印的是父类里面的在打印的子类里面
 4. 从这个能够看出是先调用父类的构造方法建立父类对象再来调用子类里面的构造方法
   */
class Super{
 public Super(){
  System.out.println("我是父类super");
 }
}
class Sub extends Super{
 public Sub(){
  System.out.println("我是子类sub");
 }
}
public class InstanceDemo {
 public static void main(String[] args) {
  new Sub();
 }
}

运行结果:
在这里插入图片描述

3.多态

Java 面向对象编程之多态
相比于封装和继承,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{
	
}

运行结果以下:
在这里插入图片描述