Java的三大特性之继承

此处我会分为这几个部分来理解继承是怎么样的:html

一、区分封装、继承和多态java

二、区分限定词的范围面试

三、区分隐藏、覆盖、重载函数

四、继承的理解ui

五、一道面试题的原型spa

---------------------------------------这里是友好的分隔线----------------------------------------code

通常咱们都会说Java的三大特性有:封装、继承、多态。如今先来捋顺一下它们的概念加以区分。htm

封装对象

封装就是将类的信息隐藏在类内部,不容许外部程序直接访问,而是经过该类的方法实现对隐藏信息的操做和访问。blog

能够这么理解:

一、封装能够把一个对象的属性私有化,同时能够选择性地提供能够被外界访问的方法(getter、setter)。

二、封装可使咱们更容易地对一个对象的内部进行操做。

三、封装可让咱们对成员变量进行更为精准的控制,像是对成员变量使用限定符,还有判断属性值的合法性。

 

继承

继承是类与类的一种关系,是使用已存在的类的顶底做为基础创建新类的技术。新类的定义能够增长新的数据或新的功能,也可使用父类的功能,不能选择性地继承父类,可是父类能够选择性地让子类继承一些属性。

能够这么理解:

一、父类拥有的“财产”可让子类来继承,可是父类有权利选择给子类继承多少“财产”,而子类没有权利选择性地继承父类给的“财产”。

二、子类也能够经过本身的双手去创造本身的“财富”,能够对父类的“财产”进行扩展。

三、子类能够经过“覆盖”、“隐藏”来实现自身的特殊的价值(后文会重点提到)。

另外,对于继承来讲有三个关键字不得不提:构造器、protected、向上转型,后文会说起。

 

多态

多态指的是对象的多种形态。多态有两种:引用多态和方法多态。继承是多态的实现基础。

一、引用多态

父类的引用能够指向本类的对象;父类的引用能够指向子类的对象。

public class Test{
  public static void main(String[] args){
    //父类的引用能够指向本类的对象 Animal ani1
= new Animal();
    //父类的引用能够指向子类的对象 Animal ani2
= new Dog(); } }

二、方法多态

建立父类对象时,调用的方法为父类方法;

建立子类对象时,调用的方法是子类重写的方法或继承自父类的方法;

 

参考:

https://www.cnblogs.com/BoscoGuo/p/5877185.html

 

---------------------------------这里是友好的分隔线-----------------------------------

咱们所说的限定词有四种,public、protected、默认、private。

这里就简单说一下他们的区别。

范围

public

protected

默认

private

同类

 

 

 

 

同包子类

 

 

 

 

非同包子类

 

 

 

 

非同包非子类

 

 

 

 

(注意:这里重点区分一下protected和默认的区别)

 

参考:http://blog.51cto.com/ironkui/1755385

-------------------------------------------这里是友好的分隔线-----------------------------------------

接下来咱们来了解一下隐藏、覆盖和重载的区别

重载

重载是方法名相同,可是参数不一样的多个同名函数

  注意:参数不一样的意思是指参数类型、参数个数和参数顺序之中至少有一个不一样,可是返回值和异常已经访问修饰符不能算做是重载的条件,另外main方法也仍是能够重载的。

 

覆盖

覆盖是子类重写父类的方法,要求方法名和参数类型彻底同样(参数不能是子类),返回值和异常比父类小或者是相同(即为父类的子类),限定符范围比父类的大或者相同。

  注意:子类实例方法不能覆盖父类的静态方法;子类的静态方法也不能覆盖父类的实例方法。

 

隐藏

隐藏是指当父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际上仍是存在的。

  注意:父类的实例变量和静态变量能被子类的同名变量隐藏;父类的静态方法被子类的同名静态方法隐藏;父类的实例方法被子类的同名实例变量覆盖

  也就是说,不能用子类的静态方法覆盖父类中一样签名(参数签名彻底同样)的实例方法;不能用子类的实例方法覆盖父类中一样表示的静态方法;变量只能被隐藏而不会被覆盖。

 

隐藏和覆盖的区别

  被隐藏的属性,在子类被强制转换成父类以后,访问的是父类中的属性。

  被覆盖的方法,在子类被强制转换成父类后,调用的仍是子类自身的方法。

 

参考:

https://www.cnblogs.com/it12345/p/5221673.html

https://www.cnblogs.com/xiaoQLu/archive/2013/01/07/2849869.html

---------------------------------这里是友好的分隔线-----------------------------------

继承

在java中使用extends关键字来表示继承关系。当建立一个类时,老是在继承,若是没有明确指出要继承的类,就老是隐式地继承根类Object。

若是两个类存在继承关系,那么子类会自动继承父类的方法和变量,在子类中能够调用父类的方法和变量。在java中只容许单继承,可是一个类却能够被多个类继承,也就说是,一个男人能够有多个儿子可是他的儿子只能认他为亲爹。

 

一、子类继承父类的成员变量也不是所有的变量均可以继承到的。

  ① 父类用private修饰的成员变量不能继承。

  ② 对于父类的包访问权限成员变量,要跟父类在同一个包下子类才能继承它。

  ③ 若是子类和父类中都出现了同名称的成员变量,则会发生隐藏现象,子类的成员变量会屏蔽掉父类的同名成员变量。若是要在子类中访问父类的同名成员变量,须要使用super关键字进行引用。

二、子类继承父类的方法一样也是有条件的。

  ① 父类用private修饰的成员方法不能继承。

  ② 对于父类的包访问权限成员方法,要跟父类在同一个包下子类才能继承它。

  ③ 若是子类和父类中都出现了同名称的成员方法,则会发生覆盖现象,子类的成员方法会覆盖掉父类的同名成员方法。若是要在子类中访问父类的同名成员方法,须要使用super关键字进行引用。

(注意:隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的)

三、构造器:子类是不可以继承父类的构造器

  ① 若是父类的构造器都是带有参数的,则必须在子类的构造器中显示地使用super来调用父类的构造器。

  ② 若是父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,由于系统会自动调用父类的无参构造器。

 

参考:

https://www.cnblogs.com/dolphin0520/p/3803432.html

-------------------------------这里是友好的分隔线-----------------------------------

接下来是一道面试题的原型,看看你能不能作对?

public class Test03 {
    public static void main(String[] args) {
        Son son = new Son();
    }
}
class Parent{
    static{
        System.out.println("Static Parent.");
    }
    public Parent(){
        System.out.println("Parent Block");
    }
}
class Son extends Parent{
    static{
        System.out.println("Static Son.");
    }
    public Son(){
        System.out.println("Son Block.");
    }
}

答案:

相关文章
相关标签/搜索