内部类
来源:互联网 发布:spss 22.0软件安装 编辑:程序博客网 时间:2024/06/05 15:48
这里先讲解三种内部类的方式:
1.成员内部类 2.方法内部类(局部内部类) 3.匿名内部类
一.成员内部类
1. 成员内部类可以使用外部类的成员变量和成员方法,不管用什么修饰,不管是private还是public
都是可以使用,因为这个内部类是在外部类的类内
2. 【在外部类类外创建内部类对象的方法】
外部类名.内部类名 引用类型变量 = new 外部类名().new 内部类名();
3. 如果在内部类当中,想要使用和外部类同名的成员变量或者方法
用这个格式
外部类名.this.同名成员变量;
外部类名.this.同名成员方法;
4. 在外部类中可以创建内部类对象
class Outer{
int num=100;
class Inner{
int num=50;
public void testInner1(){
System.out.println("内部类的成员方法testInner1");
System.out.println(num);
System.out.println(Outer.this.num);
test();
Outer.this.test();
}//内 public testInner1
public void test(){
System.out.println("内部类的成员方法test");
}//内 public test
}//class
public void test(){
System.out.println("外部类的成员方法test");
}//外 public test
}
public class TestMemberInnerClass {
public static void main(String[] args) {
//成员内部类的创建对象的方法
Outer outer=new Outer();
Outer.Inner in=outer.new Inner();
Outer.Inner in1=new Outer().new Inner();//这种方法是通过匿名对象调用的
}
}
二.局部内部类
局部内部类(方法内部类)
局部内部类 :放在方法或者函数里面的类,称之为局部内部类
[必会知识]
1. 局部变量的
【生存期】
从声明位置开始,到代码块结束
【作用域】
只能在代码块里面
2. 类对象的
【生存期】
通过new关键字创建的时候开始,JVM进行垃圾回收机制的时候销毁对象。结束
【作用域】
哪里有这个对象的首地址,哪里就是他的作用域
【记住】局部内部类对象是在函数的内部通过JVM虚拟机创建的,并且通过JVM的垃圾回收机制来销毁,
这个类对象的生存周期于testInner函数不同
但是testInner函数中普通局部变量n 他的生存周期是和testInner()一致的
如果在局部内部类对象里面使用了testInner函数的局部变量,就有可能存在testInner函数里面的
局部变量n的生存周期被拉长,这不符合Java原理
为了解决这个问题
如果局部内部类对象要使用所在函数的局部变量,这个局部变量用 final修饰(但是也不能重新赋值)
class Outer1{
int num=100;
public void testInner(){
final int n=56;
class MethodInner{
int i=40;
public void function(){
//n=14;
System.out.println(n);
System.out.println(num);
System.out.println(i);
System.out.println("局部内部类的function方法");
}
}
MethodInner mi=new MethodInner();
mi.function();
}
}
public class TestMethodInnerClass {
public static void main(String[] args) {
Outer1 outer=new Outer1();
outer.testInner();
}
}
三. 匿名内部类
abstract class Animal {
int age;
public abstract void test();
abstract public void jump();
}
class Monkey extends Animal {
@Override
public void test() {
System.out.println("探究什么是类的本体");
}
@Override
public void jump() {
System.out.println("猴子能跳");
}
}
interface A{
int i=12;
public void testA();
}
public class TestAnonymousInnerClass {
public static void main(String[] args) {
Monkey m=new Monkey();
m.test();
m.jump();
/*
Animal 是一个抽象类 a 是一个抽象类的引用类型变量
new Animal() {
这里的内容是要求继承于该抽象类的子类完成的方法
这里就是类的本体
但是这个类没有名字,所用称之为【匿名内部类】~~
这里有一个隐含的【继承】关系
};
*/
Animal a=new Animal() {//匿名内部类
@Override
public void test() {
System.out.println("这是匿名内部类的test()方法");
}
@Override
public void jump() {
System.out.println("这是匿名内部类的jump()方法");
}
};
a.test();
a.jump();
new A() {
public void testA() {
System.out.println("匿名内部类里面的遵从接口的test()方法");
}
}.testA();//匿名内部类的匿名对象调用自己的方法
}
}
内部类的作用:
1.内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可以实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- where、having之间的区别和用法
- javaScript 函数参数的按值传递
- QAQ
- Gnuplot:双折线图、双柱状图模板
- Superset接入CAS单点登录
- 内部类
- Apache的情书
- 浅谈分布式消息技术:KAFKA
- POJ 2524 Ubiquitous Religions (并查集)
- C-C++中static的用法全局变量与局部变量
- ptaSimulate小记及其坑爹之处
- 二十三种设计模式之命令模式
- arm-none-linux-gnueabi交叉工具链安装 ,介绍,区别总结
- Count The Pairs