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

转载自https://blog.csdn.net/weixin_41792162/article/details/83684384?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160116796319724836764112%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160116796319724836764112&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-6-83684384.pc_search_result_cache&utm_term=java%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&spm=1018.2118.3001.4187

 

 

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

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

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

在这里插入图片描述

1. 封装

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

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

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

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

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

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

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

比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。

2.继承

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

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

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

比如从猫类、狗类、虎类中可以抽象出一个动物类,具有和猫、狗、虎类的共同特性(吃、跑、叫等)。

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

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

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

    1.方法的重写
     子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写.通过重写父类的方法,可以用自身的行为代替父类的行为。当调用方法时会优先调用子类的方法。重写要注意:  a、返回值类型  b、方法名  c、参数类型及个数
     都要与父类继承的方法相同,才叫方法的重写。
     重载和重写的区别:
      方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
      方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改
    2. 继承初始化顺序
    父类的构造器调用以及初始化过程一定在子类的前面
      1、初始化父类再初始化子类
      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();
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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

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{
	
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值