JAVA内部类使用
一、什么是内部类?
一个类的定义放在另一个类的内部,这个类就叫做内部类
二、内部类有那些特性?
1、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
2、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
3、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
三、内部类有哪几种?
1.成员内部类
package com.test01;
public class A {
// 内部类 B 继承 TestPojo 和实现 TestInterface 接口
class B extends TestPojo implements TestInterface{
//内部类 B 自己的方法
public void run(){
System.out.println("我正在跑!");
}
//重写的接口方法
public void testf() {
System.out.println("实现接口!");
}
}
// 方法里面调用内部类
public void test(){
B b = new B() ;
b.testf() ; // 掉用重写接口方法
b.run() ; // 调用自己的方法
b.testpojo() ; // 调用继承父类的方法
}
// main 方法测试
public static void main(String[] args) {
A a = new A() ;
a.test() ;
}
}
// 定义了一个接口 ,方法为testf()
interface TestInterface{
public void testf() ;
}
// 定义了一个普通类 方法testpojo()
class TestPojo{
public void testpojo(){
System.out.println("我是简单的pojo类");
}
}
// 实现 调用内部类里面的方法
class Textone{
public static void main(String[] args) {
A.B b = new A().new B() ; //调用类A里面的内部类B
/** 等同于 下面代码
* A a = new A() ;
* A.B b = a.new B() ;
* */
b.testf() ; // 掉用重写接口方法
b.run() ; // 调用自己的方法
b.testpojo() ; // 调用继承父类的方法
}
}
2、方法内部类
package com.test01;
public class PerTest {
public void test(){ // 定义一个方法
class Ne{ // 定义一个方法内部类
public void fle(){ // 定义方法内部类的方法
System.out.println("我正在飞翔!");
}
} ;
new Ne().fle() ; //调用内部类的方法
}
public static void main(String[] args) {
new PerTest().test() ; //测试
}
}
注意: (1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,
局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变
量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。 (该理解来源于百度百科)
3、匿名内部类
1)、抽象匿名内部类
package com.anonymous;
public class AbstractClass {
public void test(){ //方法为test
TestA a = new TestA(){ //实现抽象类
@Override
public void run() { //实现抽象类的方法
System.out.println("我正在使用抽象匿名内部类");
}
} ;
a.run() ; //调用内部类的方法
}
public static void main(String[] args) {
new AbstractClass().test() ; //测试
}
}
//定义一个抽象类 TestA 抽象方法为run()
abstract class TestA{
public abstract void run() ;
}
2)、接口匿名内部类
package com.anonymous;
public class TestAnonymous {
MyInterface m = new MyInterface(){ //实现接口
public void eat() { //重写MyInterface 接口方法
System.out.println("我正在吃饭!");
}
} ;
public void ss(){ //方法ss
m.eat() ; //调用重写的方法
}
public static void main(String[] args) {
new TestAnonymous().ss() ; //测试
}
}
//定义一个接口 方法为 eat
interface MyInterface{
public void eat() ;
}
注意:匿名内部 类 可以定义在方法内也可以定义在类的成员中,不管是那种匿名内部类都不能被外部类直接调用
四、内部类的作用?
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有
内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。
接口解决了部分问题,而内部类有效地实现了“多重继承”。
JAVA内部类使用的更多相关文章
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
- Java内部类小程序(成员内部类,静态内部类,匿名内部类)
/** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- 9)Java内部类(Inner Class)
内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...
- JAVA内部类(转)
源出处:JAVA内部类 在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部.内部类作为其外部类的一个成员,与其他成员一样, ...
随机推荐
- 问得最多的十个JavaScript前端面试问题
我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时. 我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方 ...
- 各大IT公司校园招聘程序猿笔试、面试题集锦
转自:http://blog.csdn.net/hackbuteer1/article/details/7959921#t4 百度一面 1.给定一个字符串比如“abcdef”,要求写个函数编程“def ...
- Asp.net Mvc模块化开发系列(目录)
模块化开发是非常重要的,模块化开发是个系统性问题,为此我觉得有必须要写一个系列的文章才能基本说的清楚 那又为什么要写一个目录呢? 其一.是对我昨天承诺写一个系列新的文章的回应 其二.是先写出一个大纲, ...
- Codeforces Round #369 (Div. 2)---C - Coloring Trees (很妙的DP题)
题目链接 http://codeforces.com/contest/711/problem/C Description ZS the Coder and Chris the Baboon has a ...
- 转载java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.spinner/com.example.spinner.MainActivity}: java.lang.NullPointerException
今天学习Android开发突然遇到了这个问题,查阅了很多资料,并且对集中原因进行了分析. 错误信息字符串:java.lang.RuntimeException: Unable to start act ...
- SoapUI 使用笔记
1. 构建项目 安装完成后 右键Project --> New SOAP Project 在弹出的 New SOAP Project框中输入名字 和 webservice服务地址(example ...
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...
- 【自然框架】终于把源码弄到git上了。
好久没写博客了,发现又从左面的排名里掉出去了. 说来惭愧,一直说是开源,但是源码一直没能放到git里面.原因是,不会用. 最近终于把git弄明白了.把源码都放进去了. 刚兴趣的话可以来看看. http ...
- Nodejs与ES6系列1:变量声明
1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...
- 初探百度F.I.S — 由工具到解决方案
1. 前言 阅兵放假三天,我哪儿也没去,宅着看了一些东东:git命令行.svn命令以及下面的主角——百度FIS.对看过的git.svn的命令也做了一些总结,请参见:<git命令学习笔记>和 ...