InnerClass内部类
1,内部类概述
- 定义:把A类定义在B类内部,则A类是内部类。如下所示:
class Outer1{外部类
String name1;
public void show(){
System.out.println("Outer1.show()"+new Inner1().name);
}
class Inner1{//内部类
String name;
public void fun(){
System.out.println("Outer1.Inner1.fun()"+name1);
}
}
}- 内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员或功能,则必须创建内部类的对象。
- 按照内部类在类中定义的位置不同,可以分为如下两种格式:
- 成员位置(成员内部类)
- 局部位置(局部内部类)
2,成员内部类
- 一般内部类就是不让外部访问的,但并不是不可以被访问(但你非得。。。)
- 被静态修饰的成员内部类只能访问外部类的静态成员
- 内部类被静态修饰后的方法
- 非静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类名();
- 静态方法 :上面创建的对象访问,或者 外部类名.内部类名.方法名();(类比,被静态修饰的类既可以直接通过类名访问其成员变量,也可以通过new出对象来访问)
//成员内部类的以上所有情况
class Outer1{
private String name1;
static String string;
class Inner2{
public void show(){
//内部类可以直接访问外部类的所有成员
System.out.println("Outer1.show()"+name1);
}
} static class Inner1{
String name;
public void fun(){//被静态修饰的内部类,只能访问外部类的静态成员
//因为静态修饰的类,一开始就会被加载进来,所以如果内部有外部成员,则必须是静态的
System.out.println("Outer1.Inner1.fun()"+name1);//访问外部非静态成员出错
System.out.println("Outer1.Inner1.fun()"+string);//访问外部静态成员正确
}
}
}- 面试的例子,如下
class Outer1 {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer1.this.num );
}
}
}
//在控制分别输出:30,20,10
public class TestMain2 { public static void main(String[] args) {
// TODO Auto-generated method stub Outer1.Inner inner = new Outer1().new Inner();
inner.show(); } }
3,局部内部类
- 局部内部类访问局部变量时,局部变量必须被final修饰(JDK1.8中局部变量可以不被final显式修饰,但还是有final属性的亲测正确。)
- 原因:因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
- 局部内部类只能在局部方法内部使用。详细代码如下
class Outer1{
private String name1;
static String string; public void show(){
int imkk=0;//局部变量
String string = "OK?";
class Inner2{//局部内部类
public void show(){
System.out.println("Outer1.show()"+string);//
System.out.println("Outer1.show()"+imkk);//编译失败是因为i不是final修饰的,JDK1.8可以通过
i=3;//会提示错误,说明还是有final属性的。
}
}
new Inner2().show();
}
} public class TestMain1 {
String name;
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer1 outer1 = new Outer1();
outer1.show();
}
}
4,匿名内部类
- 就是内部类的简化写法(在安卓开发中常用匿名内部类,节省内存空间)
- 前提:存在一个类或者接口(这里的类可以是具体类也可以是抽象类。)
- 格式:new 类名或者接口名() {重写方法;}
- 本质:是一个继承了类或者实现了接口的子类匿名对象
- 例子如下所示:
//匿名内部类
interface Listener{//接口 public void func1();
public void func2(); } public class TestMain3_niming { public static void main(String[] args) {
// TODO Auto-generated method stub
new Listener() {
@Override
public void func1() {
System.out.println("func1");
}
@Override
public void func2() {
System.out.println("func2");
}
} ;
}
}
InnerClass内部类的更多相关文章
- 【Java】InnerClass 内部类
Java 允许一个类的定义位于另一个类的内部,前者为内部类,后者称为外部类 InnerClass一般定义它的类或语句块之中外部类引用时必须给出完整的名称 成员内部类 & 局部内部类 - 静态成 ...
- Java基础_内部类、静态内部类、成员内部类、局部内部类、匿名内部类 (转)
From: http://www.itzhai.com/java-based-notebook-a-static-inner-class-within-a-class-member-within-th ...
- Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)
Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...
- Java内部类——成员内部类
成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...
- java —— 内部类
_ 普通内部类 静态内部类 局部内部类 匿名内部类 内部类 内部类是定义在另一个类中的类,定义内部类会起到的作用有以下三点: 1.内部类方法访问该类定义所在的作用域中的数据,包括私有的数据. 2.内部 ...
- Java进阶篇(二)——抽象类、内部类
之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...
- Java Nested Classes(内部类~第一篇英文技术文档翻译)
鄙人最近尝试着翻译了自己的第一篇英文技术文档.Java Nested Classes Reference From Oracle Documentation 目录 嵌套类-Nested Classes ...
- Java核心技术-接口、lambda表达式与内部类
本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...
- JAVA普通内部类的用法
内部类顾名思义就是定义在一个类的内部 内部类又有普通内部类.方法和域内的内部类.匿名内部类.嵌套内部类 普通内部类的基础用法 class MyClass{ class InnerClass1{ pub ...
随机推荐
- 修改ftp端口为50021
1. 配置 2. 增加防火墙规则 netsh firewall set portopening tcp 50021 ftp-50021 enable 3. 重启服务 net stop FileZill ...
- Codeforces Round #389 Div.2 D. Santa Claus and a Palindrome
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- bzoj2819 Nim
题意:给定一棵带点权的树,每次询问用一条路径上的点玩Nim游戏先手是否必胜,支持单点修改. Nim游戏:所有堆的数目异或起来不为0时先手必胜,否则必败. 所以就是单点修改+路径异或和查询. 树剖一发, ...
- ThreadPoolExecutor机制
一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务: 2.Execu ...
- 高性能JavaScript(您值得一看)
众所周知浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. ...
- POJ3928 Pingpong(统计比 K 小的个数 + 树状数组)
Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2691 Accepted: 996 Descript ...
- Node-webkit简介
Node-webkit 概述 Node-webkit 是Github 上一个非常热门的开源项目,它基于著名的浏览器开源项目 Chromium 和服务器端 JavaScript 实现 Node.js 的 ...
- List<T> 转换 DataTable
public class List2DataTable { public static string GetClassName(Type type) { if (typ ...
- 完整的ajax请求投票点赞功能的实现【数据库表一(票数)表二(ip限制重复投票)】
前端php页面 <?php if(isset($_GET['id'])){ $id=$_GET['id']; } include('data/conn.php'); $sqls="se ...
- Java——UDP
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; //===== ...