面向对象的继承、封装、多态、抽象、接口相关

本文深入探讨了Java中的继承、多态、抽象类、接口等核心概念,讲解了它们的使用方法及其重要性,包括如何实现代码复用、封装、隐藏等特性。

    继承(extends“扩展”):继承是对某一批类的抽象,对实际问题更好的建模,提高代码的复用性子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法);Java中类只有单继承。定义一个类时,没有调用extends,系统默认父类:java.lang.Object(根类)。

           super关键字:是直接父类对象的引用。所有类的构造器(除Object类之外)中第一句都是系统默认的super();自己加不加它都存在。子类、父类、父类的父类...即根类的代码信息等均存放在方法区。由于系统默认的super()的作用,通过子类构造器new出来的放置在堆中的对象由于构造器中第一句super()的作用,一级一级等待直接父类的响应,所以实际情况如下图所示:

 

         方法的重写(override)在子类中可以根据需要从基类中继承来的方法进行重写。重写方法必须与被重写方法具有相同方法名称、参数列表和返回类型。也就是说对相同的参数有子类自己独有的处理方法,返回类型相同结果不同的值。

          由于重写的原因,上图中子类对象和父类对象中可能存在相同名称的方法,由对象名称直接调用该方法时,由于该对象名指向子类对象,所以运行出来的是子类中被重写的方法对应的结果,子类中未重写的方法即继承父类的普通属性方法要是被调用,编译器找完子类后就忘父类对象中寻找,然后找到该方法,运行出结果。

          组合:不再通过extends 父类名来继承父类的属性与方法,组合是将父类作为一个属性定义在子类中,具体定义方式为:父类名 属性名称=new 父类名();此时不存在父类与子类的继承关系,而是将想要利用的原类作为属性放在新类中。 也就是说假设父类中存在方法xx(),要调用该方法属性名.xx()和子类名.属性名.xx()均可调用,组合模式中没有父类子类之分,已经当做子类中的一种属性在使用。

           继承与组合:XX是XX,的关系适合用继承;XX有XX的关系则适合用组合。

           封装/隐藏(encapsulation)隐藏对象内部的复杂性,只对外公开简单的借口。便于外界调用,从而提高系统的可扩张性、可维护性。封装的类的属性一般使用private(private:私有;只有自己类中可见),一些只用于本类的辅助性方法也用private属性;不过static声明的属性或常量使用public(public:公开,所有类均可见)。对private类,Java提供相应的get/set方法来访问相应的属性(Boolean变量的get方法有is开头)。

           多态polymorphism:必要条件:要有继承,要有重写,父类引用指向子类对象(父类名 对象名=new 子类名())。

声明类型为父类的对象a,并不能直接引用子类中独有的而非重写于父类的方法,因为先编译后运行,编译器编译时a为父类类型,会被判定为不能直接调用子类中的其他方法,报错。要想调用子类中独有的方法,需将父类引用强制转型。

         编译时类型是父类但实际指向子类对象,所以实际调用时,指向的子类是什么就实际用的是子类的什么方法。即方法的多态。

         隐式参数this指向当前对象,也就是说父类与子类的方法中的隐式参数this均指向子类。

例:public class Father(){

                 ---;//n条语句

              public void firstWay(){

               ---;//n条语句

               secondWay();//调用了secondWay

}

              }

               public void secondWay(){

               ---;//n条语句

              }

        }

      class Son(){

                public void secondWay(){

               ---------;//m条语句,重写方法secondWay()

              }

 

     }

这种情况下。main方法中若有Father a=newSon();

                                                        a.firstWay();

        内存运行分析结果:a中的地址指向子类,但子类没有重写firstWay(),所以再往父类中找,父类中有,运行父类中的firstWay()方法,然后firstWay()中有一句调用secondWay(),上文已经说明,子类父类方法中的隐式参数this均指向子类,所以此时firstWay()中调用的secondWay(this,super)相当于this.secondWay(),而this则指向的最外部的子类,所以接着运行的是子类中被改写的secondWay()方法,而非父类中原来的secondWay()。

       抽象类abstract

      public abstract class 类名(){

               -----;//普通属性方法、构造方法

               public abstract void 方法名();//抽象方法

 

}

——包含了抽象方法(抽象方法:只有方法声明,没有方法体。其意义在于:将方法的设计与方法的实现分离)的类。抽象类不能被实例化,及不能用new来实例化对象。抽象类中仍可以定义属性和普通方法、构造方法。抽象类只能用来被继承。其子类必须重写父类的抽象方法。

     接口:比抽象更“抽象”。接口定义出的是一种规则xx能干xx,而具体的怎么干,则在实现它的类中来完成。

接口的定义,格式

[修饰符] interface 接口名 [extends 父接口1,父接口2...]

-常量定义 //总是public static final

-方法定义 //总是public abstract

       public interface InterfaceA(){

                    void first();

 }

           interface InterfaceB(){

                    void second();

 }

            interface InterfaceC extends  InterfaceA,InterfaceB (){

                    void third();

 }

      class TextInterface implements  InterfaceC(){

                  public void first(){

                        -----;//n条语句

}

                 public void second(){

                        -----;//n条语句

}

                 public  void first(){

                        -----;//n条语句

}

              -----------;//n条语句

   }

由上例可以看出接口的基本使用要求:子类通过implements来实现接口的规范。接口支持多继承,即他的父接口可以有多个同时列出。一个类实现了接口,必须实现接口中的所有方法。接口不能创建实例,但是可以用于声明引用变量的类型;类比多态。例:main方法中可写作InterfaceCa=new  TextInterface();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值