java的四种内部类(转)
一般来说,有4中内部类:常规内部类、静态内部类、局部内部类、匿名内部类。
一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中。
1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法。
2.在常规内部类中可以直接用内部类创建对象
3.代码如下:
public class MyOuter {
private int x = 100;
// 创建内部类
class MyInner {
private String y = "Hello!";
public void innerMethod() {
System.out.println("内部类中 String =" + y);
System.out.println("外部类中的x =" + x);// 直接访问外部类中的实例变量x
outerMethod();
System.out.println("x is" + MyOuter.this.x);
}
}
public void outerMethod() {
x++;
}
public void makeInner() {
//在外部类方法中创建内部类实例
MyInner in = new MyInner();
}
/**
* @param args
*/
public static void main(String[] args) {
MyOuter mo = new MyOuter();
// 使用外部类构造方法创建mo对象
MyOuter.MyInner inner = mo.new MyInner();//常规内部类需要通过外部类的实例才能创建对象,与实例变量需要通过对象来访问相似
// 创建inner对象
inner.innerMethod();
// TODO Auto-generated method stub
}
}
4.运行结果:
内部类中 String =Hello!
外部类中的x =100
x is101
二.静态内部类:与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。
3.由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,但是可以访问外部类中的static成员。这与一般类的static方法想通
4.实例代码:
package com.m.ou;
public class MyOuter {
public static int x=100;
public static class MyInner{
private String y="Hello!";
public void innerMethod(){
System.out.println("x="+x);
System.out.println("y="+y);
}
}
/**
* @param args
*/
public static void main(String[] args) {
MyOuter.MyInner si=new MyOuter.MyInner();//静态内部类不通过外部实例就可以创建对象;与类变量可以通过类名访问相似
si.innerMethod();
// TODO Auto-generated method stub
}
}
4.运行结果:
x=100
y=Hello!
三.局部内部类:在方法体或语句块(包括方法、构造方法、局部块或静态初始化块)内部定义的类成为局部内部类。
局部内部类不能加任何访问修饰符,因为它只对局部块有效。
1.局部内部类只在方法体中有效,就想定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象
2.在方法内部定义类时,应注意以下问题:
1.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和 abstract修饰
2.方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。
3.static方法中定义的内部类可以访问外部类定义的static成员
3.程序代码:
public class Jubu {
private int size=5,y=7;
public Object makeInner(int localVar){
final int finalLocalVar=localVar;
//创建内部类,该类只在makeInner()方法有效,就像局部变量一样。在方法体外部不能创建MyInner类的对象
class MyInner{
int y=4;
public String toString(){
return "OuterSize:"+size+
"\nfinalLocalVar"+" "+"this.y="+this.y;
}
}
return new MyInner();
}
}
class Main{ /**
* @param args
*/
public static void main(String[] args) {
Object obj=new Jubu().makeInner(47);//创建Jubu对象obj,并调用它的makeInner()方法,该方法返回一个
//该方法返回一个MyInner类型的的对象obj,然后调用其同toString方法。
System.out.println(obj.toString());
// TODO Auto-generated method stub
}
}
4.运行结果:
OuterSize:5
finalLocalVar this.y=4
四.匿名内部类:定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类
以这种方法定义的没有名字的类成为匿名内部类。
声明和构造匿名内部类的一般格式如下:
new ClassOrInterfaceName(){
/*类体*/ }
1.匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。
2.由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不能使用关键字来创建该类的实例。实际上匿名内部类的定义、构造、和第一次使用都发生在同样一个地方。此外,上式是一个表达式,返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量。例:
TypeName obj=new Name(){
/*此处为类体*/
}
同样,也可以将构造的对象作为调用的参数。例:
someMethod(new Name(){
/*此处为类体*/ });
3.程序代码:
public class NiMing {
private int size=5;
public Object makeInner(int localVar){
final int finalLocalVar=localVar;
return new Object(){
//使用匿名内部类
public String toString(){
return "OuterSize="+size+"\nfinalLocalVar="+finalLocalVar;
}
};
}
/**
* @param args
*/
public static void main(String args[])
{
Object obj=new NiMing().makeInner(47);
System.out.println(obj.toString());
}
}
4.程序运行结果:
OuterSize=5
finalLocalVar=47
java的四种内部类(转)的更多相关文章
- Java的四种内部类
Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...
- Java的四种内部类(含代码实例)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- java的四种内部类详解
引言 内部类,嵌套在另一个类的里面,所以也称为:嵌套类; 内部类分为以下四种: 静态内部类 成员内部类 局部内部类 匿名内部类 一.静态内部类 静态内部类: 一般也称"静态嵌套类" ...
- 类与接口(二)java的四种内部类详解
引言 内部类,嵌套在另一个类的里面,所以也称为 嵌套类; 内部类分为以下四种: 静态内部类 成员内部类 局部内部类 匿名内部类 一.静态内部类 静态内部类: 一般也称"静态嵌套类" ...
- Java中的四种内部类
Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...
- java内部类及四种内部类的实现方式
java内部类及四种内部类的实现方式 一.内部类定义:内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类. 二.为何要内部类?a.内部类提供了某种进入外围类的窗户.b.也是最吸引人的原因, ...
- Java中四种访问权限总结
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- java中四种引用类型
java中四种引用类型 今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...
随机推荐
- python_3_coding
# -*- coding:utf-8 -*- 也可以换成下划线 用于声明文件编码,python3本身就是utf-8类型,不用声明 name="你好,世界"#utf-8格式能显示汉字 ...
- linux awk 内置函数详细介绍(实例)
这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y ...
- Shell编程学习之Shell编程基础(一)
这篇随笔将要介绍关于Shell编程的基本知识,这些将会在假设你已经熟悉了Linux系统和命令行的基本知识. 构建基本脚本 你应该了解或熟悉使用Shell命令行了,但是只是使用Shell命令行的命令,有 ...
- U盘装CentOS6.4
1.打开UltraISO,依次点击“文件”>“打开”,选择“CentOS-6.4-i386-bin-DVD1.iso”文件. 2.“启动”>“写入硬盘映像”,在“硬盘驱动器选择u盘”,写入 ...
- 基于px2rpx-loader,探讨一下loader的封装思想
本文以px2rpx-loader的源码为学习对象,了解其工作机制以及loader封装的思想. 1.前言 最近在了解mpvue框架的时候,对于其能够实现一套代码兼容web和微信小程序(以下简称小程序)的 ...
- SpringBoot学习7:springboot整合jsp
springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymeleaf,对于java开发人员来说还是大多数人员喜欢使用jsp 1.创建maven项目,添加pom依赖 ...
- 牛客小白月赛2 A 数字方阵【随机】【找规律】
链接:https://www.nowcoder.com/acm/contest/86/A 题目描述 总是对数字的神秘感感到好奇.这次,他在纸上写下了 个从 到 的数字,并把这些数字排成了 的方阵. ...
- UVa中国麻将(Chinese Mahjong,Uva 11210)
简单的回溯题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- Mybatis基础进阶学习2
Mybatis基础进阶学习2 1.测试基本结构 2.三个POJO package com.pojo; import java.io.Serializable; import java.util.Dat ...
- centos6 下查看SELinux状态 关闭SELinux
转载自:https://blog.csdn.net/boomjane_testingblog/article/details/52859977 SELinux(Security-Enhanced Li ...