java三大特性:封装、继承、多态

时间:2021-10-24 23:55:37

Java三大特性之封装

 

一、定义

封装性指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

二、使用封装的好处:

1.良好的封装能减少耦合;

2.类内部的结构可以*修改;

3.可以对成员进行精确的控制;

4.隐藏信息,实现细节。

例如:

 java三大特性:封装、继承、多态

Java三大特性之继承

一、定义

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或功能,也可以用父类的功能,但不能选择性的继承父类,以便实现代码的复用,提高开发效率。

二、使用继承的原则:

1.子类拥有父类非private的属性和方法;

2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;

3.子类可以用自己的方式实现父类的方法

三、继承的三大重点:构造器,protected关键字,向上转型。

(1)构造器

对于构造器而言,只能被调用,而不能被继承。调用父类的构造方法我们使用super()即可。

 java三大特性:封装、继承、多态

  程序结果如下:

 java三大特性:封装、继承、多态

 

Java的聪明之处:编译器会默认给子类调用父类的构造器。但是,这个默认调用父类的构造器是有前提的:父类有默认构造器。如果父类没有默认构造器,我们就必须使用显示的super()来调用父类构造器(必须在第一行代码),否则编译器会报错:无法找到符合父类形式的构造器。

 java三大特性:封装、继承、多态

 程序结果如下:

 java三大特性:封装、继承、多态

 

(2)protected关键词

对于protected而言,可以让其子类以及同一包中的类访问。

 java三大特性:封装、继承、多态

程序结果如下:

 java三大特性:封装、继承、多态

以上可以看出子类Husband可以调用父类Person的setName()。

(3)向上转型

比如猫是动物,猫是动物的子类,这样的话讲猫看做动物就是向上转型。

 

 

 

 

 

Java三大特性之封装

一、定义

Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。换句话说,一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。

比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:

       酒 a = 剑南春

       酒 b = 五粮液

       酒 c = 酒鬼酒

       …

       这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

       诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:

       JNC a = new JNC();

       对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?

       Wine a = new JNC();

       在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

       但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了。

   所以对于多态我们可以总结如下:

      指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

      对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

 

参考资料: http://blog.csdn.net/chenssy/article/details/12786385