1.什么是内部类
:内部类就是在一个类的内部进行其他类结构的嵌套的操作,简单结构如下
//外部类
class Outter{
//内部类
class Inner{
}
}
public class InnerTest {
public static void main(String[] args) {
}
}
2.为什么需要内部类
内部类和外部类可以互相访问彼此的私有域(比如private 修饰的属性和方法)
//外部类
class Outter{
private int a =5; //外部类的私有属性a
//内部类----------------------
class Inner{
public void print(){
System.out.println(a); //内部类输出外部类Outter的私有属性a
}
}
//-------------------内部类完成
public void fun(){ //外部类的普通方法fun
new Inner().print(); //调用内部类的print方法
}
}
public class InnerTest {
public static void main(String[] args) {
new Outter().fun(); //调用外部类的fun方法
}
}
- 内部类可以解决java的单继承局限
class A{
private int a =1; //A类的私有属性a
public int getA(){
return a;
}
}
class B{
private int b =2; //B类的私有属性b
public int getB(){
return b;
}
}
class OutterC{ //外部类OutterC
class InnerA extends A{ //内部类InnerA继承A类
public int printA(){
return super.getA(); //调用父类方法getA()
}
}
class InnerB extends B{ //内部类InnerB继承B类
public int printB(){
return super.getB(); //调用父类方法getB()
}
}
public int a(){
return new InnerA().printA();//1.内部类对象 2.内部类提供的方法
}
public int b(){
return new InnerB().printB();//1.内部类对象 2.内部类提供的方法
}
}
public class InnerTest {
public static void main(String[] args) {
System.out.println(new OutterC().a());//外部类对象调用外部类的方法
System.out.println(new OutterC().b());
}
}
- 内部类可以对同一包中的其他类进行隐藏,仅供自己的外部类使用,类似于封装。
3.内部类带来的缺点:破坏了程序的结构,使得程序变得复杂
4.内部类和外部类之间的关系
- 对于非静态内部类而言,内部类的创建需要依赖外部类的实例化对象,没有外部类对象之前,无法创建内部类
- 内部类是一个相对独立的个体,与外部类不是继承关系
- 内部类可以直接访问外部类的元素(包含私有域)
- 外部类不可以直接访问内部类元素,需要通过内部类的引用调用
class Outter{
private String msg = "I am Java";
//------------------------
class Inner{
public void print(){
System.out.println(msg); //内部类直接访问外部类的私有属性msg
}
}
//------------------------
public void fun(){
new Inner().print(); //外部类通过引用访问内部类的方法
}
}
public class InnerTest {
public static void main(String[] args) {
new Outter().fun(); //创建外部类的实例化对象
}
}
5.内部类的分类
- 成员内部类
- 成员内部类不能存在任何static变量或者方法,可以访问但是不可以拥有
- 成员内部类需要依附外部类的创建【语法:new 外部类().new 内部类()】
- 成员内部类可以使用private封装,表示私有内部类,该内部类仅供外部类使用【eg:ArrayList中的Node内部类】
- 静态内部类:使用ststic修饰的内部类。
- 静态内部类的创建不需要依附外部类,可以直接创建【语法:new 外部类.内部类()】
- 静态内部类不可以访问任何外部类的非static域,可以拥有,但不能访问
- 方法内部类:被定义在外部类方法中的类,只能作用在该方法中。
- 方法内部类不能使用任何访问权限修饰符
- 方法内部类对外(方法外)完全隐藏,除了该方法可以访问,其余地方都不可以
- 方法内部类要想使用方法形参,该形参必须使用final声明(JDK8是隐式final声明)
- 匿名内部类:没有名字的方法内部类
- 匿名内部类没有访问修饰符
- 匿名内部类必继承一个抽象类或者实现一个接口
- 匿名内部类中不能存在任何static成员或方法
- 匿名内部类是没有构造方法的,因为他没有类名
- 匿名内部类要是想使用方法形参,该形参必须使用final声明
1878

被折叠的 条评论
为什么被折叠?



