封装、继承、多态

来源:互联网 发布:js中的slice方法 编辑:程序博客网 时间:2024/06/07 12:23

封装

Bean 对象的权限控制,对数据的设置和获取进行有效控制。

继承

一个对象获取父对象的所有属性和行为。

  • 为什么在Java中不支持多重继承?

    为了降低复杂性并简化语言,Java中不支持多重继承。想象一个:A,B和C是三个类。 C类继承A和B类。 如果A和B类有相同的方法,并且从子类对象调用它,A或B类的调用方法会有歧义。

    因为编译时错误比运行时错误好,如果继承2个类,java会在编译时报告错误。 所以无论子类中是否有相同的方法,都会有报告编译时错误。

多态

运行时多态性

运行时多态性或动态方法分派是一个过程,它对重写方法的调用在运行时体现。
在此过程中,通过超类的引用变量调用重写的方法。 要调用的方法基于引用的对象。

方法重写
有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(覆盖)。

  • example:
    Bike和Splendar。 Splendar类 extends Bike类 并覆盖其 run() 方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。

    因为方法调用是由JVM不是编译器决定的,所以它被称为运行时多态性。

  • 数据成员
    运行时多态性不能由数据成员实现
    父子两个类都有一个数据成员:speedlimit,通过引用子类对象的父类的引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问父类的数据成员。

class Bike {    int speedlimit = 90;}class Honda3 extends Bike {    int speedlimit = 150;    public static void main(String args[]){          Bike obj=new Honda3();          System.out.println(obj.speedlimit);//90     }}
  • 可以覆盖静态方法吗?
    答: 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖,在稍后章节中将学习它。

  • 为什么不能覆盖静态方法?
    答: 因为静态方法是绑定类,而实例方法绑定对象。 静态属于类区域,实例属于堆区域。

  • 可以重写java main方法吗?
    答: 这是不可以的,因为main是一个静态方法。

编译时多态性

方法重载
如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。

// 参数数量不同int add(intint);int add(intintint);// 或者// 参数类型不同int add(intint);int add(doubledouble);

注意:在java中,只通过更改方法的返回类型来实现方法重载是不可以的。

  • 为什么方法重载不能通过更改方法的返回类型?
    编译时错误优于运行时错误。

  • 可以重载java main()方法吗?
    这是完全可以的。 可以通过方法重载在类中有任意数量的main方法。 但是JVM调用main()方法,它只接收字符串数组作为参数。

class TestOverloading4{      public static void main(String[] args){System.out.println("main with String[]");}      public static void main(String args){System.out.println("main with String");}      public static void main(){System.out.println("main without args");}  }// main with String[]

方法重载和方法重写区别

这里写图片描述

Reference

http://www.yiibai.com/java/encapsulation.html
http://www.yiibai.com/java/inheritance-in-java.html
http://www.yiibai.com/java/runtime-polymorphism-in-java.html
http://www.yiibai.com/java/method-overriding-in-java.html
http://www.yiibai.com/java/method-overloading-in-java.html
http://www.yiibai.com/java/method-overloading-vs-method-overriding-in-java.html