一:成员内部类
在一个类中除了可以定义成员变量,成员方法外还可以定义成员内部类(有点俄罗斯套娃那个意思)成员内部类可以访问外部类的所有方法;
package LianXi;
public class NeiBULei {
private int age = 999;
private String name = "罗小黑";
public void test1(){
System.out.println("这个是外部方法");
}
//定义一个内部类
class f1{
//内部类属性
int n = 10;
//内部类方法
void show1(){
System.out.println("这是内部类方法");
System.out.println(age);
System.out.println(name);
test1();
System.out.println(n);
}
}
}
调用测试类测试内部类
1.
package LianXi;
public class Test {
public static void main(String[] args){
//1.首先要创建外部类的对象
NeiBULei neiBULei = new NeiBULei();
neiBULei.test1();//外部类的方法
//2.通过外部类对象创建内部类对象
NeiBULei.f1 f = neiBULei.new f1();
f.show1();
}
}
package LianXi;
public class Test {
public static void main(String[] args){
/* //1.首先要创建外部类的对象
NeiBULei neiBULei = new NeiBULei();
neiBULei.test1();//外部类的方法
//2.通过外部类对象创建内部类对象
NeiBULei.f1 f = neiBULei.new f1();
f.show1();*/
//二。一步到位创建到内部类的对象
NeiBULei.f1 f= new NeiBULei().new f1();
f.show1();
}
}
成员内部类的注意点:
1.当外部类和内部类存在重名的属性的时候会优先访问内部类的
package LianXi;
public class NeiBULei {
private int age = 999;
private String name = "罗小黑";
public void test1(){
System.out.println("这个是外部方法");
}
//定义一个内部类
class f1{
//内部类属性
int n = 10;
String name = "张三";
//内部类方法
void show1(){
System.out.println("这是内部类方法");
System.out.println(age);
System.out.println(name);
test1();
System.out.println(n);
}
}
}
内部类的属性和外部类的属性相同时要访问外部类的属性的格式时:外部类.this.属性;
package LianXi;
public class NeiBULei {
private int age = 999;
private String name = "罗小黑";
public void test1(){
System.out.println("这个是外部方法");
}
//定义一个内部类
class f1{
//内部类属性
int n = 10;
String name = "张三";
//内部类方法
void show1(){
System.out.println("这是内部类方法");
System.out.println(age);
System.out.println(name);
System.out.println(NeiBULei.this.name);//与外部类相同的属性调用
test1();
System.out.println(n);
}
}
}
2.内部类不能定义静态成员(static修饰)但是可以定义静态常量(static final)
报错了
没有报错。
二:静态内部类
静态内部类,就是用static关键字修饰过的内部类。与内部类,在形式上静态内部类比普通内部类前面加了static关键字。在功能上静态内部类只能访问外部类的静态成员。
静态内部类在级别上是和外部类是一个层级的,可以不依赖外部类对象,可以直接创建对象或者是通过类名方法。可以声明静态成员
只有内部类可以用static修饰正常类是不可以加static的
package LianXi;
public class NeiBULei {
private int age = 999;
static String name = "张三";
//静态内部类
static class Inner{
static int n = 10;
void f1(){
System.out.println(name);
System.out.println(n);
}
}
}
静态内部类调用外部类与正常的两个类调用一样,要先创建对象(new)再调用
package LianXi;
public class NeiBULei {
private int age = 999;
static String name = "张三";
//静态内部类
static class Inner{
static int n = 10;
void f1(){
System.out.println(name);
System.out.println(n);
NeiBULei neiBULei = new NeiBULei();//调用外部类要先创建实例对象然后调用
System.out.println(neiBULei.age);
}
}
}
运行结果
三:局部内部类
局部内部类,也称为方法内部类,是指定义在某个局部范围中的类,它和局部变量一样都是在方法中定义的,有效范围也只限于方法内部。
在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法只能在所属的方法中访问。
package LianXi;
public class NeiBULei {
//外部类属性
private int age = 999;
String name = "张三";
//外部类方法
public void f1(){
System.out.println("我是外部方法");
}
public void f2(){
int n = 10;
//局部内部类和局部变量一样不能在前面加方法修饰符
//创建局部内部类
class Inner{
//局部内部类方法
void show(){
//调用外部类的属性和方法
System.out.println(age);
System.out.println(name);
f1();
System.out.println(n);
}
}
//调用局部内部类要在方法内先创建对象后然后调用
Inner inner = new Inner();
inner.show();
}
}
package LianXi;
public class Test {
public static void main(String[] args) {
//创建对象进行测试
NeiBULei neiBULei = new NeiBULei();
neiBULei.f1();//正常的外部类方法
neiBULei.f2();//包含了局部内部类的方法
}
}
运行结果
局部内部类的总结及注意点:
1.局部内部类是定义在外部类的方法中的类,作用范围和创建对象的范围仅限于当前方法。
2.局部内部类与局部变量一样不能在前面加修饰符。
3.局部内部类访问方法内的局部变量时:jdk1.7要求:变量要加上final,jdk1.8自动添加final;局部内部类访问外部类当前方法中的局部变量时无法保障变量的生命周期与自身相等,所有要在变量前要加上final修饰符
4.不可以定义static静态变量,但是可以定义static final静态常量
四:匿名内部类:
匿名内部类是指没有没有名称的内部类。Java中调用某个方法是,如果该方法的参数是接口类型,除了传入一个接口实现类外,还可以使用实现接口的匿名内部类作为参数,匿名内部类中直接完成方法的实现。
例:先定义一个接口,在接口内定义一个方法
package LianXi;
public interface Animal {
void fly();
}
使用匿名内部类可以直接在new出接口的时候直接进行方法的实现这样会节省代码和时间,比再创建个类继承接口然后实现接口方法再调用实现类要快捷一些。
package LianXi;
public interface Animal {
void fly();
}
//为了方便就直接在下面直接定义一个类进行演示测试
class TestAnimalimp{
String name = "小鸟";
Animal animal = new Animal() {
@Override
public void fly() {
System.out.println(name + "会飞");
}
};//要加分号不然会报错
}
匿名内部类的总结及注意:
1.匿名内部类就是一个没有名字的内部类(一切特征都与局部内部类xiangt)
2.必须继承一个父类,或者实现一个接口
3.定义类,实现类,创建对象这个流程的语法是合并在一起的,只能创建一个该类的对象
优点:减少代码量
缺点:可读性较差