面向对象之封装、继承与多态

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/f2764052703/article/details/88952025

什么是面向对象

  世间万物皆对象,以对象的思维去看待这个世界,那么万物皆有自身属性以及自身的活动,对应到编程的对象思维中,那就是每一个对象都有属性和行为。

  对象的属性使用变量来描述,因为属性会随着外界状态的改变而改变,比如,你的年龄会随着时间的推进而增长,你的身高会随着你的发育而发生改变。所以属性使用变量来进行描述。

  对象的行为使用函数(这是面向过程的叫法,以面向的思维来说,叫做方法)来描述,因为行为代表的是一个过程,而不是某一时刻的状态,在这一过程中会随着每一个因素的改变而改变行为的结果。所以需要使用能够描述过程的函数来描述对象的行为。所以就有了面向对象的方法。

什么是类

  类是具有相似属性和方法的一群对象的抽象概念,就好像我们所说的男人和女人都属于人这一个广泛的概念,猫和狗都属于动物这一广泛的概念。类也是对象的模板,比如我们现在在一个捏泥人的工厂中工作,工厂刚开始的时候使用人工来捏泥人,这就是一个一个地创建对象,那时候的工厂叫做小作坊,一个做完以后才做第二个,但是后来技术改革了,老板卖了一个泥人模子,我们只需要使用模子就可以很快速的获得许多泥人,这个模子就是类,这个泥人就是对象,使用模子来做泥人就是使用类来创建对象。所以说类是对对象的一个抽象描述,将对象抽象成一个更大的概念。

  泥人做出来以后都是黄黄的颜色,但是我们后期却可以使用颜料将泥人绘成五颜六色的,对象也是这样的,使用类创建出来的对象属性和方法都是一样的,但是我们却可以通过改变创建对象的时候参数的不同来改变对象的属性和方法。使得每一个对象都不一样。也像我们的人一样,刚出生的时候都只是一张白纸,但是因为所处的环境不同,最后塑造的人也就不一样。

面向对象的特点

面向对象具有三个特点:封装、继承和多态

  1. 封装
    封装即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。

    在C语言转变到C++的时候这个特点特别的明显,从struct到class的转变:
      在面向过程编程的C语言中,一个结构体struct中的变量是可以被随意访问的,这样就极大的降低了数据的安全性,于是,便有了public 和 private这两个权限访问控制符,使用权限访问控制符来限制数据的访问权限,便是进行了封装。

    	package objectStudy;
    
    	public class father {
    		//对属性进行了封装,只能通过公开的接口进行访问
    		private int age;
    		private String name;
    
    		public int getAge() {
        		return age;
    		}
    
    		public void setAge(int age) {
        		this.age = age;
    		}
    
    		public String getName() {
        		return name;
    		}
    
    		public void setName(String name) {
        		this.name = name;
    		}
    	}
    
    
  2. 继承
      码农们在编程的时候发现,有的类其实是有很多方法是类似的,完全可以将一个类的代码拿过来,稍稍进行修改便可以继续使用,比如,人这个类和男人这个类,人拥有的特点和属性男人都有,男人只是比人多了某些属性和方法,所以完全可以在人这个类上做一些扩展便能够成为男人这个类,所以,就有了继承的概念。

      类A继承类B以后,类A是子类,类B是父类,子类拥有父类的所有非private属性和方法,子类也可以在父类的属性和方法上面进行扩展,这个就像现实社会中的父子一样,父类通过自己的拼搏获得了他的人脉和财富(属性和方法),父类的人脉和财富完全由父类决定要将哪些交给子类使用,不想让子类使用的人脉和财富父类就用private将他们隐藏,子类在得到父类的人脉和财富以后它可以决定怎么去使用,他可以改变父类的做事方法,使用自己风格的做事方法,所以子类可以重写父类方法。

    所以总结一下上面的子类继承父类的内容就是:

    1.子类继承父类的成员变量
      当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
      1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
      
      2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
      
      3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

    2.子类继承父类的方法
      同样地,子类也并不是完全继承父类的所有方法。
      1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
      
      2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
      
      3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。

    class A {
    	private String name;
        int age;
    
    	public String getName() {
        	return name;
    	}
    
    	public void setName(String name) {
        	this.name = name;
    	}
    
    	public int getAge() {
        	return age;
    	}
    
    	public void setAge(int age) {
        	this.age = age;
    	}
    }
    
    class B extends A{
    	public B(){
        	super();
    	}
    
    	@Override
    	public String getName() {
        	System.out.println("this is B");
        	return super.getName();
    	}
    }
    
  3. 多态
    多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

    参考文章:
    java提高篇(四)-----理解java的三大特性之多态

猜你喜欢

转载自blog.csdn.net/f2764052703/article/details/88952025