Java_7面向对象的三大特征

一、封装(模块化)

1.问题的引入:

   当我们创建一个类的对象后,可以通过对象.属性的方式,对对象进行赋值。
这里,赋值操作受到属性的数据类型和存储范围的制约,除次之外,没有其他制约条件。

   但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,这个条件又不能在属性声明时体现

,我们只能通过一个public 方法对属性进行限制条件的添加(get(),set())
同时,我们需要避免用户再使用“对象.属性”进行赋值,则需要将属性声明为私有化。
--》此时,针对属性就体现了封装。

2.封装的思想

(1)类的内部数据操作细节自己完成,不允许外部干涉。仅对外暴露少量的方法用于使用
(2)隐藏对象内部的复杂性。只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。
(3)封装性的设计思想:把该隐藏的隐藏起来,该暴露的暴露出来
例如:

public class Animal{
      int age;//年龄可能被赋为负数,不符合实际
      int legs;//腿有可能被赋为负数或奇数个,不符合实际
}
所以可以给属性设置一个get()和set()方法,来添加限制条件,并获取和设置相应的属性值,如下:

public class Animal{
      private int age;
      private int legs;
    //对属性的设置
  publci void setAge(int age){
     if(age>=0){
      this.age=age;
  }
   //对属性的获取
  public int getAge() {
    return age;
  }
   //对属性的设置
  public void setLegs(int leg){
    if(leg>=0&&leg%2==0){
        legs=leg;
    }else{
        legs=0;
    }
 }
  //对属性的获取
  public int getLegs(){
    return legs;
  }
}
   但仅这样还不够,因为用户还是可以通过“对象.属性”的方式更改属性值,所以,为了避免者中情况发生,要将相应的属性私有化,只对外留下public方法来供用户对属性进行使用。

2.封装的体现:

(1)将类的属性私有化,同时提供public方法来获取和设置此属性的值
(2)不对外暴露的私有的方法
(3)单例模式(构造器私有化)

3.封装性的体现,需要权限修饰符(private)的配合

(1)Java的四种权限:
private 缺省 protected public
(2)4种权限可以用来修饰类及类的内部结构(属性、方法、构造器、内部类)
(3)具体的:4种都可以修饰类的内部结构
修饰类:缺省,public

二、类的继承性(代码复用)

1.继承的作用

(1)减少了代码的冗余,提高了代码的复用性
(2)便于功能的扩展
(3)为之后多态性的使用,提供了前提

2.关于继承的描述

一旦子类继承了父类。子类就获取了父类的所有属性和方法,包括私有private方法或属性
证明:
私有属性:通过get()\set(int i)来进行设置和获取
私有方法:将私有方法放在public方法中还是可以被调用的

3.方法的重写:

(1)子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
(2)子类重写的权限不小于父类(特殊:子类不能重写private方法)
(3)子类重写方法抛出的异常类型不大于父类
(4)返回值类型:
a.父类被重写的方法类型是void,子类重写也是void
b.父类被重写的方法类型是A,子类重写方法可以是A或A的子类
c.父类被重写的方法类型是基本数据类型,子类重写方法也是相同的基本数据类型
(5)不能重写static方法

4.为什么要重写:

(1)父类的情况不适用于子类
例如:(圆柱体类继承圆类)圆求面积,但圆柱体求表面积
(2)操作的多样化

5.方法的重载和重写

(1)从定义看:
重载(同一个类中,继承类):方法名相同,形参列表不同,返回值可以不同,权限符可以任意不同
重写(继承类):方法名,形参列表相同,返回值,权限符与父类的有关
(2)从编译和运行的角度
重载(不表现为多态性):允许存在多个同名的方法,编译器根据方法的不同的参数列表进行区分,对编译器而言,这些同名方法就成了不同的方法,因此它们的调用地址在编译期间就确定了
重载:早绑定,静态绑定
重写:可以理解为多态,动态绑定,晚绑定,只有在运行时,才知道调用的对象是父类还是子类的
(3)static:重载可以,重写不行
static 随着类的加载加载,不能被覆盖
(4)构造器可以重载不能重写

6.super关键字

(1)调用属性,方法
a.一般省略
b.子类、父类有同名属性时,要用super.属性来指明是调用父类的属性
c.子类重写父类方法后,在子类方法中调用父类被重写的方法时,要用super.方法
(2)调用构造器
super(参数1,参数2,...)

三、类的多态性(运行时行为,只有在运行后才能确定对象)

1.理解:

一个事物的多种形态

2.何为多态性(多态的使用):动态绑定

(1)对象的多态性:(向上转型)编译看左(父类),运行看右(子类),调用虚拟方法
①父类引用指向子类对象,当调用子父类同名参数的方法时,实际执行的是子类重写父类的方法---虚拟方法调用
虚拟方法:在多态的情况下,父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,
动态调用属于子类的该方法,这样的方法在编译时是不确定的
②如果子类没有重写该方法,则执行父类的方法.
③该子类对象不能调用自身的特有方法(编译会看左边的父类)

class Animal{
    public void walk(){
       System.out.println("动物跑");
    }
}
class Cat extends Animal {
    @Override
    public void walk() {
        System.out.println("喵喵走路");
    }
public class AnimalTest {
    public static void main(String[] args) {
         Animal cat=new Cat();//父类引用指向子类对象
          cat.walk();//调用walk()方法,执行的是子类重写的walk方法
     }
}

(2)对象的多态性只适用于方法不适用于属性,属性都看左边的父类

3.多态的使用前提:

(1)类的继承关系
(2)要有方法的重写

4.为什么有多态性:

可以通过传入不同的对象来控制不同的特征结果

5.为什么有了对象的多态性后,子类特有的方法和属性不能调用

内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,
导致编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用

如何调用子类特有的属性和方法:

强制类型转换,(向下转型)将父类引用指向的对象转为为子类类型,可能会出现ClassCastException异常,
解决方法:instanceof
(1)a instanceof A:判断对象a是否是A的实例,如果true就向下转型

Animal cat=new Cat();
if(cat instanceof Cat){
    Cat cat1=(Cat)cat;
    cat1.eat();
}

(2)如果 a instanceof A:为true,a instanceof B也为true,则B是A的父类

原文地址:https://blog.51cto.com/14234228/2467014

时间: 2024-11-13 09:22:23

Java_7面向对象的三大特征的相关文章

php面向对象的三大特征

1.面向对象的三大特征:封装.继承.多态.(抽象(扩展的))2.00A:分析,OOD:设计,OOP:编程.3.封装:信息隐蔽,封装,所有的函数和方法,类中的属性和行为也是封装. 三个访问修饰符public.protected.private也是封装.4.public 公共的 谁都可以用,也可以修改:protected 受保护的 只有自己和后代可以使用和修改: private 私有的 只有自己可以使用和修改:5.继承: 扩展父类的内容,注意只能继承public和protected修饰的内容,而pr

黑马程序员--Objective-C之--OC面向对象的三大特征

OC面向对象的三大特征是封装.继承和多态. OC语言也支持面向对象的三大特征,OC提供了@private.@package.@protected.@public等访问控制符来实现封装 OC也允许子类来继承父类,并且支持多态. 一.封装 封装指的是將对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法对内部信息的操作和访问. OC的封装特性需要通过使用访问控制符来实现. (一).访问控制符 1.@private:当前类访问权限.如果类的成员变量使用@priva

面向对象的三大特征——封装、继承、多态

接触过面向对象的人都知道面向对象有三大特征,分别是封装.继承和多态.这三者分别指的是什么,为什么是这哥仨,使用他们有什么好处,我们来梳理一下. 封装 原则:隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: ①将变化隔离. ②便于使用. ③提高重用性. ④提高安全性. Demo1: 比如一个学生类:他具有姓名和年龄两个属性,但是为了提高安全性和重用性,便于使用,我们将其封装起来. public class Student { private String name; private in

解析PHP面向对象的三大特征

class BenHang extends Card{ /*构造函数与及构造的继承*/ function __construct($cardno,$pwd, $name,$money){ parent::__construct($cardno,$pwd, $name,$money); } function take($money){ echo "本行取款{$money}没有手续费·····<br>"; } function zhuan($money){ echo "

聊一聊面向对象的三大特征

学习Java语言程序设计也有一段时间了.现在我想对封装.继承和多态,在Java中面向对象的三大特征,总结一下我的理解,不妥当的地方望大家包涵.  封装.给我的感觉封装就是一个包装,一个代码是否健壮,与用不用封装有很大的关系,封装就像是包裹一个礼物,不仅让礼物看起来更加精美,而且还完善了内容.请看代码: class Person {     private String name;     private int age;     public void say() {         Syste

7 面向对象的三大特征

面向对象的三大特征为:封装.继承.多态. 1 封装(encapsulation) 1.1  广义上的封装就是包装,可以将方法看作是对为完成特定功能的代码的封装,可以把类看作对属性和方法的封装.... 狭义上的封装:将属性私有化,然后提供公有的getter和setter方法以供访问. 封装的优点: 1)隐藏了实现细节,简化开发  2)安全  3)提高了代码的可维护性和可扩展性. 步骤: 1)将属性私有化,将修饰符修改private的 2)提供公有的访问方法:getter方法:取值,setter方法

Java面向对象的三大特征

Java面向对象的三大特征: 封装.继承.多态 封装和继承几乎都是为多态而准备的 一.      封装 首先,属性能够描述事物的特征,方法能够描述事物的动作.封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用. 封装:封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系.也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行.

OC面向对象的三大特征

OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可以达到过滤无效数据的作用. 3)对成员变量只读(readonly):只允许外界访问我的no,不允许外界修改我,只需要提供get方法. 4)对成员变量只写:不允许外界访问我的no,只允许外界修改我,只需要提供set方法. set 方法的注意点: 作用: 提供一个方法给外界设置成员变量值,可以在方法里面

面向对象的三大特征——全网最详解析

面向对象的三大特征--封装性.继承性.多态性 类的封装性 封装是将数据以及对数据的操作组合起来构成类,类是一个不可分割的独立单位.类中提供与外部联系的方法,又尽可能隐藏类的实现细 节. 封装性提供一种软件模块化的设计思想,像组装硬件一样.类的设计者提供标准化的软件模块,使用者根据实际需求选择所需要的类模块, 集成为软件系统,各模块之间通过传递参数等方式进行工作.设计者需要考虑类的定义.类中数据和方法的访问权限以及方法如何实现等问题: 使用者需知道有哪些类,每个类的特点,每个类提供了哪些常量.成员