一、抽象类

  当事物不能具体描述时可将事物抽象化,只对其应有的行为进行简单的描述而不进行深度具体的描述,这样就产生了抽象类,使用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. python学习之路(19)

    匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x) ...

  2. 揭开HTTPS的神秘面纱

    摘自:https://www.cnblogs.com/hujingnb/p/11789728.html 揭开HTTPS的神秘面纱   在说HTTP前,一定要先介绍一下HTTP,这家伙应该不用过多说明了 ...

  3. 如何使用IDEA运行 一个分布式的项目

    前一段时间,曾不止一次的尝试过,如何把一个分布式的maven项目,用IDE运行起来.连续的几次失败,让我明白之前启动的方式是有问题的.因此把正确的启动方式整理了一下 .引以为戒 一.起初启动失败的原因 ...

  4. 第11组 Beta冲刺(2/5)

    第11组 Beta冲刺(2/5) 队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/11997386.html 作业博客 https://edu.cn ...

  5. Android 获取视频照片与刷新媒体库

    1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...

  6. 线性回归和正则化(Regularization)

    python风控建模实战lendingClub(博主录制,包含大量回归建模脚本和和正则化解释,2K超清分辨率) https://study.163.com/course/courseMain.htm? ...

  7. 深度学习基础——Epoch、Iteration、Batchsize

    原文地址:https://www.cnblogs.com/Johnny-z6951/p/11201081.html 梯度下降是一个在机器学习中用于寻找较佳结果(曲线的最小值)的迭代优化算法.梯度的含义 ...

  8. 自定义view防支付成功页面

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  9. Libvirt Live Migration 与 Pre-Copy 实现原理

    目录 文章目录 目录 Libvirt 的 Live Migration 网络数据传输层 控制层 通过 libvirt 库实现虚拟机迁移的示例 KVM 的预拷贝(Pre-Copy)Live Migrat ...

  10. 阶段3 2.Spring_04.Spring的常用注解_1 今日课程内容介绍