面向对象偶尔会迷惑的知识点

Posted Iaouei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象偶尔会迷惑的知识点相关的知识,希望对你有一定的参考价值。

关于默认访问权限

默认访问权限,也称友好访问权限 没显示指定为哪种访问权限( public、protected、private )。如果要访问默认权限修饰的类成员,只能与此类在同一个package中, 即使其子类也必须满足此条件。

类成员是默认访问权限

当子类和父类在同一个包中时,子类继承父类中不是private的成员。

但是,当子类和父类不在同一个包中,父类中的private和友好访问权限的成员不会被子类继承,也就是说,此时子类只继承父类中的public和protected访问权限的成员变量作为子类自己的成员变量;同样的,子类也只继承父类中的public和protected访问权限的方法作为子类自己的方法。

在类B中用类A创建了一个对象,若类A和类B在同一包中,那么该对象是可以访问类A的友好变量和友好方法,也可以访问类变量和类方法(用类名访问)。不同包使用类A时,不能访问类A的友好变量和友好方法。

类是默认访问权限

如果类A是抽象类B的子类,处于不同包中,且类A是友好访问权限,如果在类A所在包中,可以是使用B b=new A();和类A中的方法;否则不可以用,因为这时不能在包外使用类A;但是如果还有抽象类B的子类类C和类A处于同一包中,则可以通过类C间接使用类A。

关于抽象

抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

我们要先知道子类才能抽象出父类,而接口不需要知道子类的存在就可以定义一个规则,抽象类往往都是通过重构而来的!所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

抽象类

抽象类不能被实例化,实例化的工作是交由它的子类来完成,它只需要有一个引用即可。
子类中的抽象方法不能与父类的抽象方法同名。

接口

接口所有方法访问权限自动被声明为public。确切的说只能为public,如果声明为protected、private,编译会出错!

接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

接口中不存在实现的方法。

实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须指向一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable)。

在实现多接口的时候一定要避免方法名的重复。

关于重写和重载

这两个词曾经经常混混搅,如果不记中文词只记住外语词会清楚更多。

override

重写(覆盖),指子类在继承父类时,重写(重新实现)父类中的方法:

重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.

重写方法的访问修饰符不能小于被重写方法的访问修饰符(public>protected>default>private)

重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;

需要被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。

静态方法不能被重写为非静态的方法(会编译出错)。

overload

重载,指在一个类内实现若干重名的方法,名称相同而参数形式不同:

在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数形式可以是不同的参数类型,不同的参数个数,不同的参数类型顺序;

不能通过访问权限、返回类型、抛出的异常进行重载;

方法的异常类型和数目不会对重载造成影响;

关于构造器:

不能被static、final、synchronized、abstract和native修饰。
接口可以引用,但不允许被实例化,所以接口中没有构造方法。

父类的构造方法不能被子类继承,也不能被复写,因为子类在实例化对象时,需要先调用父类的构造方法:因为他继承父类的成员使用,使用前这些成员必须初始化,而他们是父类的成员,所以,必须通过父类进行初始化。如果子类的构造器没有显式的调用超类的构造器方法,会自动调用父类无参构方法,如果父类没有不带参数的构造方法,且子类的构造方法中又没显示的调用超类其他构造方法,则Java编译器将报告错误,那么就要你自己在子类的构造方法中,通过super(括号内为参数)的方式调用父类的构造方法,并需将其放在子类构造方法的第一行。

自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。如果写了一个有参的构造方法,如果想使用无参的构造方法,就必须手动给出无参构造方法。所以我们自定义的类时通常都会手动给出无参构造方法。

关于多态

一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

多态的作用:消除类型之间的耦合关系。

现实中多态的例子:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

多态三个必要条件:有继承;有重写;父类引用指向子类对象,即向上转型。

Java中多态的实现方式:接口的实现,继承父类进行方法重写,同一个类中进行方法重载

以上是关于面向对象偶尔会迷惑的知识点的主要内容,如果未能解决你的问题,请参考以下文章

Go语言与面向对象编程

java面向对象程序设计有啥缺点?

Java基础知识面向对象三大特性

php 抽象类和接口的区别

PHP——抽象类与接口的区别

PHP高级——抽象类与接口的区别