Java 内部类
来源:互联网 发布:excel数据丢失 编辑:程序博客网 时间:2024/05/23 17:19
2.内部类又分为:静态内部类、匿名内部类、局部内部类、成员内部类。
(1)静态内部类的应用场景是:只可以访问外部类的静态成员变量和静态成员方法。
(2)成员内部类的应用场景是:它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
(3)局部内部类:像局部变量一样,不能被public, protected, private和static修饰。只能访问方法中定义的final类型的局部变量。
(4)匿名内部类:匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。匿名内部类隐式地继承了一个父类或者实现了一个接口。匿名内部类使用得比较多,通常是作为一个方法参数。
实例1:内部类的基本结构
//外部类
class
Out {
private
int
age =
12
;
//内部类
class
In {
public
void
print() {
System.out.println(age);
}
}
}
public
class
Demo {
public
static
void
main(String[] args) {
Out.In in =
new
Out().
new
In();
in.print();
//或者采用下种方式访问
/*
Out out = new Out();
Out.In in = out.new In();
in.print();
*/
}
}
运行结果:12
从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?
因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class
其中$代表了上面程序中Out.In中的那个 .
Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意
1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中
2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量
实例2:内部类中的变量访问形式(成员内部类)
class
Out {
private
int
age =
12
;
class
In {
private
int
age =
13
;
public
void
print() {
int
age =
14
;
System.out.println(
"局部变量:"
+ age);
System.out.println(
"内部类变量:"
+
this
.age);
System.out.println(
"外部类变量:"
+ Out.
this
.age);
}
}
public Out(int age){
this.age = age;
}
}
public
class
Demo {
public
static
void
main(String[] args) {
Out.In in =
new
Out().
new
In();
in.print();
}
}
运行结果:
局部变量:14
内部类变量:13
外部类变量:12
从实例1中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名
否则,内部类中的局部变量会覆盖外部类的成员变量
而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名
外部类访问内部类必须先创建内部类的对象,再进行访问
实例3:静态内部类
class
Out {
private
static
int
age =
12
;
static
class
In {
public
void
print() {
System.out.println(age);
}
}
}
public
class
Demo {
public
static
void
main(String[] args) {
Out.In in =
new
Out.In();
in.print();
}
}
运行结果:12
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性
其次,因为内部类被静态化,因此Out.In可以当做一个整体看,不依赖与外部类。可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)
实例4:私有内部类
class
Out {
private
int
age =
12
;
private
class
In {
public
void
print() {
System.out.println(age);
}
}
public
void
outPrint() {
new
In().print();
}
}
public
class
Demo {
public
static
void
main(String[] args) {
//此方法无效
/*
Out.In in = new Out().new In();
in.print();
*/
Out out =
new
Out();
out.outPrint();
}
}
运行结果:12
如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类
上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象
也就是说,此时的内部类只有外部类可控制
如同是,我的心脏只能由我的身体控制,其他人无法直接访问它
实例5:方法内部类(局部内部类)
class
Out {
private
int
age =
12
;
public
void
Print(
final
int
x) {//形参需要被内部类里面使用时,该形参必须为final
class
In {
public
void
inPrint() {
System.out.println(x);
System.out.println(age);
}
}
new
In().inPrint();
}
}
public
class
Demo {
public
static
void
main(String[] args) {
Out out =
new
Out();
out.Print(
3
);
}
}
运行结果:
3
12
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法
如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义
至于final在这里并没有特殊含义,只是一种表示形式而已
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的实例6:匿名内部类
匿名内部类是不能有名称的内,所以没办法引用。必须在创建时,作为 new 语句的一部分来声明,如下:
new <类或接口> <类的主体>
//方法主体
}
public class NiMing {
在使用匿名内部类时,要记住以下几个原则。
2.匿名内部类不能定义任何静态成员,方法和类。
3.匿名内部类不能使用public,protected,private,static。
4.只能创建匿名内部类的一个实例,只能够使用一次,不能重复使用。
5.一个匿名内部类一定时在 new 后面,匿名内部类不能是抽象类,用其隐含实现一个接口或实现一个类,两者不可兼得,它必须实现继承的类或者实现的接口的所有的抽象方法。
- 【Java】【内部类】Java 内部类简介
- [Java] Java 内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- java的内部类、匿名内部类、局部内部类
- java内部类之成员内部类、静态内部类
- java 成员内部类 局部内部类,匿名内部类
- Java 静态内部类/内部类
- java内部类、静态内部类 小结
- Java内部类,静态内部类
- JAVA 内部类与静态内部类
- java内部类--局部内部类
- Java 内部类以及匿名内部类
- centos7开通ssh服务
- bootstarp-table表格中嵌套多个BUTON按钮实现
- 关于如何将Eclipse中@author进行修改的解决方法
- 看完《第一行代码》再看什么书可以进一步提高?
- Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.MethodFilter
- Java 内部类
- 【经验】Linux安装redis服务
- vuex—数据管理器
- 如何在Ubuntu容器中查看容器的IP地址?
- [未完待续][NOI2017模拟]谈笑风生
- 什么是面向对象 什么是面向过程
- Tensorflow学习——MNIST多层卷积网络解决方案
- js html 图片显示 canvas 压缩
- 环首剑