Java封装,继承和多态总结

来源:互联网 发布:淘宝物流服务质量分 编辑:程序博客网 时间:2024/05/14 16:04

三大支柱

面向对象程序设计的三大支柱是封装,继承和多态。

  • 封装:把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
public class A {    String a;    public A(String a) {        this.a = a;    }    public String getA() {        return a;    }    public void setA(String a) {        this.a = a;    }}public class B {    public static void printB() {        A a = new A("hello java!");        System.out.println(a.getA());    }}public class C {    public static void main(String[] args) {        B.printB();    }}

如上面类A与B都能称之为封装,A封装的是数据a,B封装的是System.out.println()方法。

  • 继承:继承使得你可以定义一个通用的类(父类),之后扩展该类为一个更加特定的类(即子类)。
    可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。
    关键字extends表明新类派生于一个已经存在的类。已存在的类称为父类或基类,新类称为子类或派生类。
  • 多态:多态意味着父类的变量可以指向子类对象。
    在面向对象语言中,接口的多种不同的实现方式即为多态。
    多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
public class Animal {    public Animal() {    }    public String toString(){        return "I'm an animal!";    }}public class Dog extends Animal {    public Dog() {    }    @Override    public String toString() {        return "I'm a dog!";    }}public class Test {    public static void main(String[] args) {        Animal animal = new Dog();        Animal animal1 = new Animal();        System.out.println(animal1.toString());        System.out.println(animal.toString());    } }

动态绑定

Animal animal = new Dog();  System.out.println(animal.toString());

上面代码声明了一个Animal对象,而这个对象的实例引用是new Dog()。
这里有个概念:实例可以使用声明类型或者它的子类型的构造方法创建。变量的实例类型是被变量引用的对象的实际类。
所以animal的实例类型是Dog,指向new Dog()创建的对象。即一个对象所调用的方法(如:toString())是由它的实际类型决定的,这称之为动态绑定

重载,重写的区别

  • 重写一个方法,需要在子类中使用和父类一样的签名和返回值类型来对该方法进行定义。
    子类从父类中继承方法,需要修改父类的方法,称作方法重写。
  • 重载也是用统一的对外接口来完成不同的功能。重载方法的签名必须不同于原先方法的,是指允许存在多个同名方法,而这些方法的参数不同。
    重载方法可以是程序更清楚,更具有可读性,执行相同的功能但是具有不同的参数。
    重载方法必须具有不同的参数列表,不能基于修饰符绘制返回值类型来重载方法。
    调用一个方法时,可能会有多个匹配结果,编译器会自动寻找最精确的匹配。
public static int Sum(int a,int b){   return a+b;}public static double Sum(double a,double b){   return a+b;}

歧义调用

public static double Sum(int a,double b){   return a+b;}public static double Sum(double a,int b){   return a+b;}

如上重载方法当掉调用Sum(1,2),可能与上面两个方法任何一个调用,编译器无法精确,会产生编译错误。

0 0