内部类(一)----成员内部类

内部类主要分为四类:
(1)成员内部类
(2)静态内部类
(3)方法内部类
(4)匿名内部类
在本文中主要介绍成员内部类:

1、成员内部类

1.1 成员内部类的定义

成员内部类是最常见的一种内部类,定义一个成员内部类就和定义成员变量类似,直接在一个类的内部再定义一个类,和成员变量可以说是同级关系。

public class OutClass {
	private String name = " ";//成员属性
	
	public class InnerClass{//成员内部类
		private String name = "";//成员内部类中的属性可以和外部类的属性同名
		private static Integer age = 18;//此处报编译错误,成员内部类中的属性不可以用static修饰
		
		public static void print() {//内部类中的方法也不能用static修饰			
		}	
	}
}

需要注意的是:
(1) 成员内部类中的属性可以和外部类的属性同名
(2)成员内部类中的属性不可以用static修饰
(3)内部类中的方法也不能用static修饰
正如成员方法中要定义属性的话,只能用final进行修饰,无法利用 privatestatic 修饰一样
在这里InnerClass 需要以来外部类OutClass的存在而存在,及想要创建一个内部类,需要先创建一个外部类。
另外:
(1)内部类对象可以访问外部类对象中所有访问权限的字段;
(2)外部类对象也可以通过内部类的对象引用来访问内部类中定义的所有访问权限的字段。

1.2 成员内部类的调用

1.2.1 在外部类中创建内部类对象

class OutClass {
	String name = "张三";
	InnerClass innerClass = new InnerClass();//1.在外部类中创建内部类对象
	public class InnerClass{//成员内部类
		private String name = "李四";
		private Integer age = 18;
		
		public void print() {
			System.out.println("name:"+name+" age:"+age);
		}
	}
}
public class test{
	public static void main(String[] args) {
		OutClass outClass = new OutClass();//2.创建外部类对象
		outClass.innerClass.print();//3.通过outClass调用内部类中的方法
	}
}

**输出结果:**name:李四 age:18

1.2.2 利用构造方法调用成员内部类

class OutClass {
	String name = "张三";
	public OutClass() {
		InnerClass innerClass = new InnerClass();//在构造方法中创建内部类对象
		innerClass.print();//调用内部类中的方法
	}
	public class InnerClass{//成员内部类
		private String name = "李四";
		private Integer age = 20;
		
		public void print() {
			System.out.println("name:"+name+" age:"+age);
		}
	}
}
public class test{
	public static void main(String[] args) {
		OutClass outClass = new OutClass();//利用外部类的无参构造方法调用其内部类对象
	}
}

**输出结果:**name:李四 age:20

1.3 内部类如何调用外部类中的属性

1.3.1 利用static修饰

将外部类的成员属性用static修饰,然后直接类名.属性(这种情况属于外部类的属性与内部类的属性重名时)

class OutClass {
	static String name = "张三";//用static修饰
	InnerClass innerClass = new InnerClass();
	public class InnerClass{//成员内部类
		private String name = "李四";
		private Integer age = 20;
		
		public void print() {
			System.out.println("name:"+name+" age:"+age+" 外部类属性:"+OutClass.name);//直接类名.属性
		}
	}
}
public class test{
	public static void main(String[] args) {
		OutClass outClass = new OutClass();//利用外部类的无参构造方法调用其内部类对象
		outClass.innerClass.print();
	}
}

**输出结果:**name:李四 age:20 外部类属性:张三

1.3.2 直接调用属性

当外部类的属性与内部类的属性没有同名时,可以直接在内部类中使用外部类中的属性

class OutClass {
	String name = "张三";
	InnerClass innerClass = new InnerClass();
	public OutClass() {}
	public class InnerClass{//成员内部类
		//private String name = "李四";//注释掉同名的属性
		private Integer age = 20;
		
		public void print() {
			System.out.println("name:"+name+" age:"+age);//直接使用外部类中的属性即可
		}
	}
}
public class test{
	public static void main(String[] args) {
		OutClass outClass = new OutClass();//利用外部类的无参构造方法调用其内部类对象
		outClass.innerClass.print();
	}
}

**输出结果:**name:张三 age:20

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值