一、抽象类

  当事物不能具体描述时可将事物抽象化,只对其应有的行为进行简单的描述而不进行深度具体的描述,这样就产生了抽象类,使用abstract关键字对类进行修饰内部方法也是用abstract进行描述。

1.特点

  抽象方法只能定义在抽象类中且不能有方法体,抽象类不能被实例化不能使用new关键字创建对象,它的子类覆盖所有的抽象方法后子类才能实例化,如果子类继承了抽象类却没有覆盖抽象方法那么子类也是抽象类,抽象类中可以存在非抽象方法即已经实现的方法可供子类覆盖或使用。

2.误区

  抽象类中存在构造函数,仅为子类的对象来进行实例化;抽象类一定是父类需要子类继承抽象类并覆盖抽象方法;抽象类可以不定义抽象方法,仅仅是让该类不能实例化;abstract与final、private、static不能共存;抽象类可以不包含抽象方法,包含抽象方法的类一定是抽象类,抽象类中的属性定义与一般类相同。

、接口(interface)

  接口主要就是方法定义和常量值的集合,接口是一种特殊的抽象类,这种抽象类里面的方法全部都是抽象方法。对于一个接口来说他没有构造器,所以他的变量只能定义成静态常量,这样就不要使用构造器对变量进行初始化了。

1.特点

  • 接口不可以被实例化,子类需要覆盖所有的抽象方法才能实例化,否则该子类还是个抽象类,接口是用来被实现的。
  • 类不能多继承的原因是当两个父类中出现相同的方法声明与实现时子类调用该方法会产生不确定性,这是由方法主体导致的,而接口可以多继承的原因是因为接口中的方法只有声明没有被实现没有方法主体,当两个父接口被实现时子类覆盖父接口同名方法时会默认认为那是一种行为方法的定义所以只会实现一次同名方法。继承的本质是获取体系的基本功能,想要扩展功能就需要通过实现不同的接口来实现。
  • 接口与接口之间具备继承关系不具备实现关系,并且接口可以多继承(因为只有方法声明没有方法主体所以不会发生冲突),接口是没有构造方法的(原因在于它的成员属性都是常量)。
  • 接口是暴露出来的规则,需要使用者去实现这一规范。

2.接口与类区别

  • 接口中常见成员有两种:全局常量、抽象方法;而且都有固定修饰符共性:成员都是使用public修饰的,编译时默认检查自动提供public;
  • 成员定义方法:public static final int MAX = 5;
  • 方法定义:public abstract void fun();

、内部类

  在类的内部定义一个或多个该类所属的类叫做内部类,内部类相当于外部类的成员,可以随意访问外部类中的成员,但外部类要访问内部类时需要创建内部类的实例来访问,在main方法中内部类是需要前缀的即外部类名+“.”+内部类名即为内部类的引用类型(Text.Inner ti = new Text().new Inner();)内部类的重要作用在于为多重继承提供支持。

  当一个类中有一个内部类时编译完成时会产生两个class文件其中包含内部类的class文件命名规则为:外部类名@内部类名,使用外部类名@1内部类称为局部内部类,因为该类处于局部方法当中,因为内部类会被原则上的与外部类分离所用创建外部类对象时内部类是不会加载的;

  内部类不允许访问所在局部的局部变量因为声明周期不一样,局部内部类只能访问被final修饰的局部变量;内部类需要访问与外部类同名的成员变量时需要使用类名加this确定具体对象(Inner.this;Outer.this)。

1.匿名内部类

  匿名内部类是一个简化的内部类,其中内部类需要继承或实现外部类或者接口,格式:new 父类名或者接口名(){子类内容}.子类成员;匿名内部类常出现的场所是方法体或属性初始化处。

2.非静态内部类

  非静态内部类没有无参构造器,它的默认构造器需要一个外部类实例参数,这也符合非静态内部类的规则:非静态内部类必须寄生在外部类的实例中,没有外部类对象就不存在非静态内部类对象。当在外部类内部显示的使用new Inner();来创建内部类时虚拟机底层也会将当前this作为实参传入构造器!显示的在内部类中声明无参构造器在编译时也将生成对应的有参构造器并隐式的调用它,显示定义一个带String参数的有参构造器编译时还将自动携带一个外部类参数!由此可见非静态内部类对外部类的依赖有多高!

  非静态内部类处于一个非静态的上下文环境,因此非静态内部类不允许拥有静态成员,只允许定义静态成员常量(static final)。

3.静态内部类

  静态内部类,定义在类中,任何方法外,用static定义;静态内部类只能访问外部类的静态成员。生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类,当然它还可以定义成私有静态内部类。

4.静态内部类与非静态内部类的区别

  • 普通内部类可以访问其外部类的各种类型成员,但是静态内部类只能访问静态成员
  • 普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以;

①静态变量和静态方法会出现这个语法错误(static methods can only be declared in a static or top level type)意思就是static方法只能在静态或者顶级类型(顶级类型应该就是外部类中)中声明,当然static变量和static内部类也是一样的道理。原因在静态变量和静态方法都只需要通过类名就能访问,不必通过任何实例化对象;而普通内部类的初始化要利用外部类的实例化对象,这明显违背了static的设计初衷。

②静态代码块会出现这个语法错误(Cannot define static initializer in inner type Outer.Inner)意思是不能在内部类中定义静态的初始化程序。原因跟以上的差不多,static声明的成员只能为类所共有,而不能仅属于一个实例化对象,通俗点来说就是不管有多少层的引用,都只能是类来引用而不能是对象。

JavaSE--抽象类、内部类、接口的更多相关文章

  1. Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总

    Unit06 - 抽象类.接口和内部类(下) . 面向对象汇总 1.多态:  1)意义:    1.1)同一类型的引用指向不同的对象时,有不同的实现        行为的多态:cut().run(). ...

  2. Unit05 - 抽象类、接口和内部类(上)

    Unit05 - 抽象类.接口和内部类(上) 1.static final常量:  1)必须声明同时初始化  2)通过类名来访问,不能被改变  3)建议:常量名所有字母都大写(多个单词间用_)  4) ...

  3. (1)抽象类 (2)接口 (3)内部类 (4)Object类

    1.抽象类(重点)1.1 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰如: public abstract void cry(); 1.2 ...

  4. JavaSE学习笔记(4)---抽象类和接口

    JavaSE学习笔记(4)---抽象类和接口 抽象方法和抽象类 ·抽象方法 使用abstract修饰的方法,没有方法体,只有声明.定义的是一种"规范",就是告诉子类必须要给抽象方法 ...

  5. JavaSE基础知识(5)—面向对象(抽象类和接口)

    一.抽象类 1.理解 用abstract关键字定义的类,称为抽象类用abstract关键字定义的方法,称为抽象方法意义:当设计父类时,发现该父类根本不需要创建对象,并且里面有不好描述的方法.这个时候往 ...

  6. 01 javaSe 01 抽象类和接口

      抽象类 接口   目录(?)[-] 1 抽象类与接口是面向对象思想层面概念不是程序设计语言层面概念 2 抽象类是本体的抽象接口是行为的抽象 3 C中抽象类与接口的探讨     目录(?)[+]   ...

  7. 抽象类与接口——JavaSE基础

    抽象类与接口 抽象类 抽象类既包含规范又包含具体实现 抽象类可以包含实现的方法 和 未实现的用abstract修饰的抽象方法 抽象类不可以有实例化(不能使用new实例化),只能通过子类继承,然后对子类 ...

  8. 【JavaSE】抽象类、接口

    接口的诞生 接口其实就是一种标准一种规范. 先从生活中的例子讲起,理解含义和概念后,再去理解程序会更容易理解一些. 生活中接口无处不在,比如著名的USB接口,大家可以试想一下,如果没有像USB这种统一 ...

  9. Java笔记:抽象类、接口

    这篇笔记主要是抽象类和接口,还有简单介绍下三种设计模式:模板模式.工厂模式.命令模式 1.抽象方法和抽象类(1)抽象方法和抽象类都必须使用abstract修饰符来定义,包含抽象方法的类只能被定义成抽象 ...

  10. Java 抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...

随机推荐

  1. 多态:JVM是如何进行方法调用的

    在我们平时的工作学习中写java代码时,如果我们在同一个类中定义了两个方法名和参数类型都相同的方法时,编译器会直接报错给我们.还有在代码运行的时候,如果子类定义了一个与父类完全相同的方法的时候,父类的 ...

  2. java 手机号/身份证(*)加密隐藏中间某几位几位

    //手机号 保留前3 后4 String phone = "18771632488"; System.out.println(phone.replaceAll("(\\d ...

  3. C++入门经典-例5.16-输出引用

    1:如不加特殊说明,一般认为引用指的都是左值引用.引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现,引用的形式如下: 数据类型 & 表达式: 例如: int a=10 ...

  4. 数据加密之AES

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. 选题 Scrum立会报告+燃尽图 04

    本次作业要求参见:edu.cnblogs.com/campus/nenu/2019fall/homework/9913 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名:胜利点 二.S ...

  6. Centos 6.5 Multipath 初始配置

    # This is a basic configuration file with some examples, for device mapper # multipath. # For a comp ...

  7. 2019.7.9 校内交流测试(T 3 待更完)

    T1_挖地雷(提交文件bomp.cpp) 递推大法好啊 题解 递推高级题目 这个题就是按照扫雷的思路解决 相邻的三个格子上的雷数和加起来正好等于中间格子上的数 所以当我们确定了第一个格子周围的雷,其余 ...

  8. 软件结构B/S和C/S

    C/S(Client  Server)结构的软件: 比如: QQ. 极品飞车. 飞信 . 迅雷 缺点:更新的时候需要用户下载更新包然后再安装,程序员则需要开发客户端与服务端. 优点: 减轻服务端的压力 ...

  9. 描述一下 Intent 和 IntentFilter?

    Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内 ...

  10. php URL处理函数

    parse_url()    basename()    pathinfo()    dirname() 用法 parse_url() 是一计算机函数,功能是解析一个 URL 并返回一个关联数组,包含 ...