Java抽象类

1.    抽象类:

使用abstract修饰,含有抽象方法的类是抽象类;

抽象类中可以有成员变量和成员方法,成员方法可有抽象方法,也可由非抽象方法;

抽象类可以是内部类,抽象内部类用private修饰;抽象类中抽象方法不可有方法体;

一个抽象方法必须对其子类可见,即不能用private修饰;

一个抽象类可继承自其他类,这个类可以是抽象类,也可是非抽象类,若继承自抽象类,可实现部分抽象方法,使其子类实现父类的抽象方法;

一个抽象类可实现接口,可以实现部分接口,若不实现,将实现任务交给子类;

抽象类只有被继承才有用,其子类可为抽象类,也可为非抽象类,若其子类为非抽象类,则必须实现全部抽象方法,若子类为抽象类,会自动继承所有抽象方法,抽象子类中也可定义新的抽象方法,该子类的某个非抽象子类必须实现全部抽象方法;

抽象类可用来定义变量,但不能构造对象,可用抽象类定义的变量指向非抽象类子类的对象;

抽象类中可有构造方法,但构造方法只能由其子类构造方法调用,且抽象类中的构造方法不是抽象方法;

抽象类和抽象方法不能用final修饰。

2.    抽象方法:使用abstract修饰, abstract不能修饰成员变量

                        abstract不能与private、 static、final 同时修饰一个成员方法

3.   接口:

      interface关键字只能用来定义接口,不能用来修饰类、成员变量或成员方法

      一个接口类中可有成员变量和成员方法,也可用来定义内部类或内部接口

      接口类中成员变量一定是public static final的,但允许在声明变量时仅指定部分修饰符,即使没添加publicstaticfinal中任何一个修饰符,改变量依然是public static final的,由于final成员变量必须在定义时初始化,因此接口类中定义的成员变量必须在定义时赋值。赋值可以用常量表达式,也可用任意在该接口中能够访问的对象组成的表达式。

     接口类中的成员变量在实现该接口的类中可直接使用,在没有实现该接口,但可见该接口的类中可通过‘接口名.变量名’来访问

    接口中出了static类型的成员方法外,都是public abstract类型的抽象方法,不能有方法体,允许声明成员方法时指定部分或不指定修饰符,但即使未添加public abstract中任何一个修饰符,该成员方法依然是public abstract的。static成员方法必须有方法体,接口中只有static方法有方法体,因此接口中不可出现this,super关键字

    一个接口可继承自其他接口,使用extends关键字,一个接口可实现多个其它接口,不同接口之间用分号分隔

    一个接口不能继承自任何类,包括抽象类

    一个非抽象类若实现了某个接口,必须实现接口中所有抽象方法(接口中除static外的都是抽象方法

    接口可用来定义变量,但不能构造对象,可用接口定义的变量指向实现该接口的类的对象

    接口没有构造函数,不能用final修饰

     接口中所有成员都是public访问权限

4.    抽象类和接口的区别

       抽象类可提供某些方法的部分实现,而接口不可以(若向抽象类中加入一个新的具体方法时,那么其所有子类都得到了该方法,而接口做不到这一点,若向接口中加入一个新方法,所有实现该接口的类都无法编译了,必须让每一个类都实现该方法才行,这是接口的缺点)
       一个抽象类的实现只能由这个抽象类的子类给出,(由于java语言的单继承性,使用抽象类的作为类型定义工具的效能大打折扣,在这一点上,接口优势显现出来了,任何一个实现了一个java接口所规定的类均可具有此接口的类型,而一个类可实现多个接口,从而这个类便具有多种类型)

       java接口是定义混合类型的理想工具,混合类表明一个类不仅具有某个主类型的行为,而且具有其他次类型的行为

      结合上述抽象类与接口的优缺点,最经典的设计模式出来了:声明类型的工作由接口承担,但同时给出一个java类,且实现该接口,而其他同属于此抽象类类型的具体类可选择实现这个java接口,也可选择继承这个抽象类。即在层次接口中,接口在最上面,然后紧跟着抽象类,此时二者的优点皆能发挥,这个模式为‘缺省适配模式’

    应用:

            行为模型应通过接口而不是抽象类来定义

    抽象类表示的是is-a的关系,接口表示的是like-a的关系

5.     方法重载和方法覆盖

    方法重载:

              在同一个类中出现方法名相同,参数列表不同的情况

              返回值及权限不作为重载的依据

    方法覆盖:在子类中出线和父类相同方法声明的时候,会运行子类的函数

                      子类覆盖父类方法时,子类权限必须大于等于父类权限

                      静态只能覆盖静态或被静态覆盖

6.      final类和方法

          final修饰的类不可被继承;final修饰的方法不可被覆盖;final修饰的变量为常量

7.       java面向对象

    一、java内存结构

          栈

               特点:有序的内存空间,先进后出

               创建方式:由程序平台自身创建

               存储内容:基本数据类型的值,存放对象在堆空间的地址

               个数问题:java程序执行有很多个栈,往往为一个代码段(一个大括号)创建一个栈空间

               周期问题:若相应代码段被执行完毕,则栈空间马上回收

        堆

              特点:一种无序的内存空间

              创建方式:可有程序员自己创建或申请(mailoc)

              用途:用于存放一些复杂数据信息(自定义类型)

              个数问题:java程序执行过程中仅有一个堆,对所有方法和执行过程共享

              周期问题:从java虚拟机运行开始,一直到java虚拟机运行结束

      JVM内存结构全景图

            堆:全局共享的无序存储空间(从JVM启动开始到JVM结束销毁)

            栈:有序的存储空间(方法加载执行被创建分配,直到方法执行完毕栈被释放)

            方法区:将所有方法中内容都存储起来, 为执行提供代码信息(从JVM启动开始到JVM结束销毁

            执行上下文:用于存储即将执行的方法的调用关系和执行顺序的空间。

        注:把对象放在堆中,引用则存放在栈中,因为栈存放数据具有先进后出的特点,为避免数据的重复挪用,则把数据的引用放到栈中

二、java对象的组成

     引用:存储在栈上

     实例:存储在堆上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值