java内部类与外部类

在Java中允许一个类定义在另一个类的内部,前者称为内部类,后者称为外部类。内部类和外层封装它的类之间存在逻辑上的所属关系。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class的名字不能与包含它的类名相同;
Inner class可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量;

内部类

  1. 内部类分为四种:成员内部类,静态内部类,局部内部类,匿名内部类
    1)成员内部类
    1、 成员内部类:指在外部类里直接定义的没有用static修饰的类
    2、 内部类的属性和类里面定义的方法一样,可以调用外部类任意修饰符修饰的属性,而外部类只能调用内部类里面使用static修饰的属性。
public class Increment {//外部类的定义
	private String name = "wangwu";
	public int age = 20;
	static String address = "北京市";
	 
	public class Information{//内部类的定义
		String sex = "男";
		int age = 100;
		//Information inf = new Information();
		public void show(){
			System.out.println("姓名为:"+name+"性别为:"+sex);
			System.out.println("年龄为:"+age+"地址为:"+address);
		}
	
	}

	public void show1(){
		System.out.println("姓名为:"+name+"性别为:");
		System.out.println("年龄为:"+age+"地址为:"+address);
		
	}
        
    
}
public class Test {

	public static void main(String[] args) {
		Increment in = new Increment();
		in.show1();
		Increment.Information inf = in.new Information();//外部类的实例化
		inf.show();
	}

}

结果图

在这里插入图片描述

2)静态内部类
1、静态内部类:顾名思义就是在常规内部类的前面加上修饰词Static。
2、静态内部类与静态方法相似。都是不能直接访问外部类中的变量。只能够直接访问外部类中的静态变量。但是我们可以通过在内部类里面实例化外部类的对象进行调用。
3、由于静态内部类不能对外部类中的非静态属性方法进行访问,所以不能够使用this关键字

public class Quiet {
	private static String name = "大圆子";
	public int age = 3;
	public String address = "北京市"; 
	static class Information{
		public int age = 4;
		public String sex = "母猫";
		public void show(){
			//年龄是静态的所以可以直接调用
			System.out.println("姓名:"+name+"年龄:"+age);
			//注意这里不能通过this等方式调用,只能通过对象调用
			//再外部类中调用内部类成员变量也需要实例化对象在调用
			Quiet q = new Quiet();
			System.out.println("性别:"+sex+"地址:"+q.address);
		}
	}
	public void show1(){
		System.out.println("姓名:"+name+"年龄:"+age);
		System.out.println("性别:"+" "+"地址:"+address);
	}
}
public class Test {
	public static void main(String[] args) {
		Quiet qu = new Quiet();
		qu.show1();
		System.out.println("~~~~~~~~");
		//静态内部类的可以使用调用方法
		Quiet.Information in =new Quiet.Information();
		in.show();
	}

结果图

在这里插入图片描述

3)方法内部类
1、方法内部类定义在方法内部且只能在该方法内使用。
2、由于1所以方法内部类不能被static修饰,也不能被访问修饰符修饰

public class MethodInner {
	private String name = "土豆";
	public int age = 5;
	
	public void show(){
		String address = "北京市";
		class Information{
			private String sex = "公猫";
		}
		Information in = new Information();
		System.out.println("姓名:"+name+"年龄:"+age);
		System.out.println("性别:"+in.sex+"地址:"+address);
	}

}

public class Test {
	public static void main(String[] args) {
	MethodInner mt = new MethodInner();
	mt.show();
	}
}

结果图

在这里插入图片描述

4) 匿名内部类
匿名内部类就是没有名字的内部类,究竟什么情况下需要使用匿名内部类呢?
如果满足下面的一些条件,建议使用匿名内部类
□只用到类的一个实例
□类在定义后立即用到
□类非常小(Sun推荐是在4行代码以下)
□给类命名并不会导致你的代码更容易被理解
在使用匿名内部类时需要遵循如下原则
□匿名内部类不能有构造方法
□匿名内部类不能定义任何静态成员、方法和类
□匿名内部类不能是public、protected、private和static
□只能创建匿名内部类的一个实例
□一个匿名内部类一定是在new的后面、用其隐含实现一个接口或实现一个类。
□因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效

interface Inter1{
			public void m();
		}
		class Test{
			public static void main(String[] args){
				Inter1 i = new Inter1(){
					//重写抽象方法
					public void m(){
						System.out.println("aaa");
					}
				};
				i.m();
			}
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值