Java--封装,继承和多态(以Java为例)(笔记)

一。封装

  *封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。就像一个黑盒子

  *封装之后才会形成真正的“对象”,真正的“安全性”

  *可以提高程序的安全性,不会把所有的属性和代码直接暴露出来

  

  如何进行封装:

    1.所有属性私有化。使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问。

    2.对外提供简单的操作入口,也就是说以后外部程序要想访问私有化属性,必须通过这些简单的入口进行访问;

      - 对外提供两个公开的方法,分别是get 和 set 方法    # 函数名为set或get  +  变量名(首字母要大写,如下所示)

      - 想读取私有化属性,调用get方法

      - 想修改私有化属性,调用set方法、

    3.get方法命名规范

      这里假设类里面有一个私有化属性age

      public  int  getAge  (){

        return  age;

        }

    4.set方法命名规范

      public  void  setAge  (int a) {

        age  =   a ;

      }

    ###注意:set和get方法没有 static 关键字

继承

  1.继承“基本”的作用是:代码复用。但是继承最“重要”的作用是:有了继承才有了之后的“方法覆盖”和“多态机制”

  2.继承的语法格式:

    [ 修饰符列表 ]    class    类名  extends  父类名{

      类体  =  属性  +  方法

    }

  3.Java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类。在C++中支持多继承。(不过也可以通过间接的方式继承很多类,比如说C继承B,B继承A,那么C也间接继承了A)

  4.关于继承中的一些术语:

    B类继承A类,其中:

      A类称为:父类,基类,超类,superclass

      B类称为:子类,派生类,subclass

  5.在Java中子类继承父类都继承哪些数据呢?

    - 私有的不支持继承(java语言中子类继承父类,会将父类中所有的数据全部继承,包括私有的也能继承过来。但是在子类中无法直接访问父类中的私有的数据,但是可以间接访问)

    - 构造方法不支持继承(父类中的构造方法虽然不能被继承,但是可以被调用)

      https://blog.csdn.net/u012931864/article/details/39996591

    - 其它数据都可以被继承

  6.与python中一样,当Java语言当中假设一个类没有显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类。Java语言中任何一个类中都有Object类的特征

  7.方法重写(方法覆盖):

    ¥1.方法覆盖又被称为方法重写,英语单词:override/overwrite

    ¥2.什么时候使用方法重写?

      *当父类中的方法已经无法满足当前子类的业务需求,子类中有必要将父类中继承过来的方法进行重新编写,这个重新编写的过程被称为方法重写/方法覆盖

    ¥3.代码满足什么条件之后,就构成方法的覆盖呢?

      *方法重写发生在具有继承关系的父子类之间

      *方法重写的时候:返回值类型相同,方法名相同,形参列表相同

      *方法重写的时候:访问权限不能更低,可以更高

      *方法重写的时候:抛出异常不能更多,可以更少

    ¥4.建议方法重写的时候尽量复制粘贴,不要编写,容易出错,导致没有产生覆盖

    ¥5.注意

      *私有方法不能被继承,所以不能被覆盖

      *构造方法不能被继承,所以不能被覆盖。

      *静态方法不存在覆盖

      *覆盖只针对方法,不谈属性

多态:

public class Animal{

  public void move(){

  System.out.println("动物在移动!");

}

}

public class Cat extends Animal{

  public void move(){

  System.out.println("猫在走猫步!");

}

}

public class Bird extends Animal{

  public void move(){

  System.out.println("鸟儿在飞!");

}

}

public class test{

  public static void main(String[] args){

    Animal  a2  =  new  Cat( );

    a2.move(); 

    

    Bird  c3  =  ( Bird )a2 //程序运行阶段会报错。虽然编译可以通过,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的是Cat对象,Cat对象无法转化为Bird类型,因为Bird和Cat之间没有             //继承关系。

}

}

1.Animal 和 Cat之间存在继承关系,Animal是父类,Cat是子类。 Animal  a2  =  new  Cat( ) 是合法的。父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态(多态)

  *Java程序运行是分为编译阶段和运行阶段的。编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class 字节码文件当中有move方法,所以编译通过了。这个过程称之为 静态绑定,编译阶段绑定。只有静态绑定成功之后才有后续的运行。

  *在程序运行阶段,JVM堆内存当中真实创建的对象是Cat对象,那么上面程序在运行阶段调用的也就是Cat对象中的move()方法,此时发生了程序的动态绑定,运行阶段绑定。

  *无论Cat类中有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为底层真实对象就是Cat对象。

2.new Cat()创建对象的类型是Cat,a2这个引用的数据类型是Animal,可见他们进行了类型转换。子类型转换成父类型,称为向上转型/upcasting,或者称为自动类型转换

3.Java中允许这种语法:父类型引用指向子类型对象。(一定要存在上下继承关系)

4.关于多态中涉及到的几个概念:

  *1.向上转型(upcasting),又被称为 自动类型转换

    子类型 -->  父类型: Animal  a2  =  new  Cat( ) 

  *2.向下转型(downcasting),又被称为 强制类型转换【需要加强制类型转换符】

    父类型-->   子类型: Animal  a3  =  new  Bird();Bird  c3  =  ( Bird )a3

    说明:

      ¥1.向上转型只要编译通过,运行时一定不会出问题

      ¥2.向下转型编译通过,运行可能错误。经常会出现:java.lang.ClassCastingException(类型转换异常:向下强制类型转换的时候没有继承关系)

      ¥3,无论是向上转型还是向下转型,两种类型之间必须要有继承关系。没有继承关系,程序是无法编译通过的。

5.instanceof关键字(为了防止解决 类型转换异常的问题)

  *5.1,语法格式:

    (引用  instanceof  数据类型名)

  *5.2 以上运算符的执行结果是Boolean类型,true / false

  *5.3 假设(a  instanceof  Animal)

    true表示:a这个引用指向的对象是一个Animal类型

    false表示:a这个引用指向的对象不是一个Animal对象。

  (编程建议:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生)

6.多态的作用

  降低程序的耦合度,提高程序的扩展力。 

    

    

原文地址:https://www.cnblogs.com/RosemaryJie/p/12845025.html