java 内部类的学习总结

  最近开始学习有关内部类的知识,做些笔记来记录一些疑难点,以下是关于三种内部类的一些小总结 。

目录: 

  1. 静态内部类
  2. 成员内部类
  3. 匿名内部类(重点)

1.静态内部类

  什么是静态内部类?顾名思义就是static有修饰符,属于外部类本身

格式如下:

public static class Outer{
//静态内部类
    public class Inner{

    }
}

简单举个例子: 

例子中包含两个问题,大家不妨认真思考下:

  1. 静态内部类中是否可以直接访问外部类的静态成员?
  2. 静态内部类的实例方法中是否可以直接访问外部类的实例成员?
public class outer {
public static int a= 100;//定义一个静态变量,静态内部类是否访问外部类的静态成员?
public static class Inner {
		private String name;
		private int age;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		
		public void create() {
			System.out.println("静态内部类");
			System.out.println(a);	//静态内部类内部类可以直接访问外部静态类	
			}
	}
}

测试类: 

public class Test {

	public static void main(String[] args) {
/*	静态内部类	*/
outer.Inner in=new outer.Inner();//格式:外部类名.内部类名 对象名=new 外部类名.内部构造器();
in.create();
	}
}

 2.局部内部类 

什么是局部内部类?顾名思义就是无static修饰符,属于外部类的对象

  • JDK16之前,成员内部类中不能定义静态成员 

格式如下:

public class Outer{
//成员内部类
    public class Inner{

    }
}

简单举个例子 :

例子中包含两个问题,大家不妨认真思考下:

  1. 成员内部类中是否可以直接访问外部类的静态成员?
  2. 成员内部类的实例方法中是否可以直接访问外部类的实例成员?

public class outer {
   public outer(String hobby) {//构造方法
		this.hobby=hobby;
	 }
	public String hobby;//成员内部类是否访问外部类的实例成员?
public static int b=100;//成员内部类是否访问外部类的静态成员?
public class Inner{
		private String name;
		private int age;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public void create() {
			System.out.println("局部内部类");
			System.out.println(b);//内部类可以直接访问外部静态类
			System.out.println("爱好:"+hobby);//内部类可以直接访问外部实例成员变量
		}
	}
}

测试类: 

public class Test {

	public static void main(String[] args) {
/*成员内部类*/
outer.Inner in1= new outer("敲代码").new Inner();//外部类名.内部类名 对象名=new 外部类构造器.new 内部类构造器()
//其中 new outer() 中是创建对象时构造方法的调用。即在创建对象时,会调用与参数列表对应的构造方法
in1.create();
	}
}

3.匿名内部类 

 本质上是一个没有名字的局部内部类,也即继承了该类或者实现了该接口的子类匿名对象

有一个很重要的前提条件:存在一个类或者接口,这里的类可以是具体类也可以是抽象类

作用:方便创建子类对象。

格式:

new 类名|抽象类名|接口名(){
//重写方法;
};

简单举个例子 (接口入门版):

定义一个接口

public interface anonymity {
    public void listen();
}

 在测试类使用匿名内部类

public class Test {

	public static void main(String[] args) {
//方案1
        anonymity am = new anonymity(){//"="右边的内容实际上是实现anonymity接口的匿名类并实行其中的方法
         public void listen(){
            System.out.println("匿名");
        }
     };
     am.listen();
  }
}
public class Test {
 
	public static void main(String[] args) {
//方案2
        new anonymity(){
         public void listen(){
            System.out.println("---");
        }
     }.listen();
//等价于直接用一个匿名类(即不用创建一个新的类去实现接口)实现了接口并调用了重写方法
  }
}

类入门版 :

定义一个类

public class(){
    public int age;
    public void Hello(){
        System.out.println("你好,匿名内部类");
   }
}

在测试类使用匿名内部类

public class Test {

	public static void main(String[] args) {
        class cs = new class(){//"="右边的内容实际上是实现class类的匿名类并实行其中的方法
         public void say(){
            System.out.println("name:"+类);
        }
     };
    cs.name("anonymity");//对name进行赋值
    cs.say();//调用say方法
  }
}

实际应用版:

//定义一个接口
public interface chief{
   void lecture();
}

/*
//定义一个student类实现接口
public class student implements weird{
   public void lecture(){
      System.out.println("正式");
   }
}
*/


//定义一个opp类,里面有个方法,方法的参数是接口名
public class opp{
   public void method(chief c){
       c.lecture();
   }
}

//测试类调用
public class Test {

	public static void main(String[] args) {
//创建opp类的对象,调用method方法
       opp op = new opp();
        op.method(new chief(){//使用匿名类
          public void lecture(){
              System.out.println("匿名");
        }
     });
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值