JavaSE--抽象类、内部类、接口
一、抽象类
当事物不能具体描述时可将事物抽象化,只对其应有的行为进行简单的描述而不进行深度具体的描述,这样就产生了抽象类,使用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--抽象类、内部类、接口的更多相关文章
- Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总
Unit06 - 抽象类.接口和内部类(下) . 面向对象汇总 1.多态: 1)意义: 1.1)同一类型的引用指向不同的对象时,有不同的实现 行为的多态:cut().run(). ...
- Unit05 - 抽象类、接口和内部类(上)
Unit05 - 抽象类.接口和内部类(上) 1.static final常量: 1)必须声明同时初始化 2)通过类名来访问,不能被改变 3)建议:常量名所有字母都大写(多个单词间用_) 4) ...
- (1)抽象类 (2)接口 (3)内部类 (4)Object类
1.抽象类(重点)1.1 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰如: public abstract void cry(); 1.2 ...
- JavaSE学习笔记(4)---抽象类和接口
JavaSE学习笔记(4)---抽象类和接口 抽象方法和抽象类 ·抽象方法 使用abstract修饰的方法,没有方法体,只有声明.定义的是一种"规范",就是告诉子类必须要给抽象方法 ...
- JavaSE基础知识(5)—面向对象(抽象类和接口)
一.抽象类 1.理解 用abstract关键字定义的类,称为抽象类用abstract关键字定义的方法,称为抽象方法意义:当设计父类时,发现该父类根本不需要创建对象,并且里面有不好描述的方法.这个时候往 ...
- 01 javaSe 01 抽象类和接口
抽象类 接口 目录(?)[-] 1 抽象类与接口是面向对象思想层面概念不是程序设计语言层面概念 2 抽象类是本体的抽象接口是行为的抽象 3 C中抽象类与接口的探讨 目录(?)[+] ...
- 抽象类与接口——JavaSE基础
抽象类与接口 抽象类 抽象类既包含规范又包含具体实现 抽象类可以包含实现的方法 和 未实现的用abstract修饰的抽象方法 抽象类不可以有实例化(不能使用new实例化),只能通过子类继承,然后对子类 ...
- 【JavaSE】抽象类、接口
接口的诞生 接口其实就是一种标准一种规范. 先从生活中的例子讲起,理解含义和概念后,再去理解程序会更容易理解一些. 生活中接口无处不在,比如著名的USB接口,大家可以试想一下,如果没有像USB这种统一 ...
- Java笔记:抽象类、接口
这篇笔记主要是抽象类和接口,还有简单介绍下三种设计模式:模板模式.工厂模式.命令模式 1.抽象方法和抽象类(1)抽象方法和抽象类都必须使用abstract修饰符来定义,包含抽象方法的类只能被定义成抽象 ...
- Java 抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...
随机推荐
- Spring Boot教程(三十二)多数据源配置与使用
之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...
- Codeforces Round #201.C-Alice and Bob
C. Alice and Bob time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 二分mid的取法
二分的两种形式: 1.范围缩小时,r = mid,l = mid + 1,取中间值时,mid = (l + r) >> 1. 2.范围缩小时,l = mid,r = mid - 1,取中间 ...
- Android_(传感器)获取手机中的传感器
传感器是一种检测装置,能够感受被测量的信息,并能将检测和感受到的信息按一定规律变换成电信号或其它所需形式的信息输出 Android操作系统中内置了很多的传感器(物理装置),能够探测.感受外界的信号.物 ...
- python 安装-ERROR---Unable to find vcvarsall.bat
系统配置:Windows10 x64, Visual Studio 2017, Python2.7.1 报错信息:error: Unable to find vcvarsall.bat 报错原因:在生 ...
- R实现pm2.5地图数据展示
使用rvest包抓取pm2.5静态页面数据,使用leafletCN包实现pm2.5数据的地图展示,代码如下所示: library(rvest) library(leafletCN) Sys.setlo ...
- docker启动redis并使用java连接
一.先查找镜像 docker search redis 二.拉取镜像 docker pull redis三.等待拉取完毕 四.查看拉去的镜像 docker iamges 五.运行redis 连接1:h ...
- Java-线程等待、唤醒与中断
一.sleep() 与 wait() 两者都会让当前线程进入等待状态.唤醒后都需要等待 CPU 资源,不一定会立即执行.若在等待期间被调用此线程的的 interrupt() 方法,将会产生 Inter ...
- C++重写实践&与java的差异
C++重写父类方法后,父类中同名的方法在子类中就无法被调用,回报这个问题: java中是没有这个问题的,显然java设计者在设计的时候有意解决了这个问题. C++实践代码: #include < ...
- 使用matlab画半透明椭圆
先上最终效果图: 本来是想直接用scatter和alpha来画的,结果在尝试以下代码后,发现无法显示透明效果 scatter(rand(1000,1),rand(1000,1), 'filled'); ...