成员内部类
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
内部类分类
1、成员内部类
2、局部内部类(包括匿名内部类)
成员内部类的定义格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
注意:外部类调用内部类,必须通过内部类的对象来进行调用
内部类调用外部类,可以随意调用
成员内部类方法的使用
1、间接使用:在外部类的方法中,使用内部类,然后在main中调用外部类的方法来实现内部类的调用
类:
public class Big { //外部类
public class Small{ //内部类
//内部类成员方法
public void in(){
System.out.println("内部类方法执行");
//内部类可以直接调用外部类方法
System.out.println("内部类开始调用外部类方法");
big();
}
}
//外部类方法 外部类在调用内部类方法时需要通过对象来进行调用
public void out(){
System.out.println("外部类方法执行");
//创建内部类对象进行调用
System.out.println("外部类调用内部类方法开始");
Small one = new Small();
one.in();
}
public void big(){
System.out.println("内部类调用外部类方法执行");
}
}
main:
public class Main_use {
public static void main(String[] args) {
//间接通过外部类方法调用内部类
Big out = new Big();
out.out();
}
}
运行结果:
外部类方法执行
外部类调用内部类方法开始
内部类方法执行
内部类开始调用外部类方法
内部类调用外部类方法执行
2、直接使用:直接创建内部类对象进行调用
格式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
类:
public class out { //外部类
public class in{ //内部类
public void in(){
System.out.println("内部方法执行");
}
}
}
main:
public class Use {
public static void main(String[] args) {
//外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
out.in one = new out().new in();
one.in();
}
}
运行结果:
public class Use {
public static void main(String[] args) {
//外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
out.in one = new out().new in();
one.in();
}
}
内部类的同名变量访问
如果出现了重名现象,那么内部类调用外部类的成员变量格式为:
外部类名称.this.外部类成员变量名
类:
public class out { //外部类
int num = 100;
public class in{ //内部类
int num = 10;
public void in(){
int num = 1;
//调用局部变量num
System.out.println(num); //1
//调用内部类的成员变量num
System.out.println(this.num); //10
//调用外部类的成员变量num
//格式:外部类名称.this.外部类成员变量名
System.out.println(out.this.num);//100
}
}
}
main:
public class Use {
public static void main(String[] args) {
//创建内部类对象进行调用
//外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
out.in one = new out().new in();
one.in();
}
}
运行结果:
1
10
100
局部内部类的定义
如果一个类是定义在一个方法内部的,那么这就是一个局部类。
注意:只有当前所属的方法才能使用它
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 内部类名称{
}
}
}
public class Outer{
public void outer(){
class Inner{
int num = 100;
public void inner(){
System.out.println(num);
}
}
//创建内部类对象进行使用
Inner in = new Inner();
in.inner();
}
}
main:
public static void main(String[] args) {
//创建外部类对象 调用方法来使用局部内部类
Outer out = new Outer();
out.outer();
}
运行结果:
100
类的权限修饰符:
public > protected > (不写) > private
定义一个类的时候,权限修饰符规则:
1、外部类:public / (不写)
2、成员内部类:public / protected / (不写) / private
3、局部内部类:什么都不能写