黑马程序员--Java基础--内部类

---------------------- Android培训 Java培训 、期待与您交流! ---------------------- 
 

内部类的定义:将一个类定义在一个类里面,对里面那个类就称为内部类

内部类的访问规则:

 1,内部类可以直接访问外部类中的成员,包括私有成员。

  之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,

  格式    外部类名.this.  例如:Outer.this.x

class Outer
{
	int i=4;
	public void method()
	{
		System.out.println("Outer.method()被调用");
	}
	class Inter
	{
		int i=3;
		public Inter() {
			//内部类直接访问外部类成员i
			System.out.println("外部类成员i= "+Outer.this.i);
			
			//内部类成员和外部类成员同名,默认访问内部类成员;
			//如果只有外部类成员,则访问外部类成员,同上
			System.out.println("外部类成员i= "+i);  //默认
		}
	}
}

2,外部类要访问内部类,必须建立内部类对象。

 Outer.Inter iClass=new Outer().new Inter();

  

访问格式

 1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

 可以直接建立内部类对象。

  外部类名.内部类名  变量名=外部对象.内部对象;

Outer.Inner in=new Outer().new Inner();

   2,当内部类在成员位置上,就可以被成员修饰符所修饰。

  比如,private:将内部类在外部类中进行封装。

  static:内部类就具备static的特性。

  当内部类采用static修饰时,只能直接访问外部类中的static成员,出现了访问局限。 

class Outer
{
	int i=4;
	static int x=9; //定义静态成员变量
	public void method()
	{
		System.out.println("Outer.method()被调用");
	}
	static class Inter
	{
		int i=3;
		public Inter() {
			//当内部类采用static修饰时,只能直接访问外部类中的static成员
			//System.out.println("外部类成员i= "+Outer.this.i); //不能访问非静态成员
			System.out.println(x);			
		}
	}
}
//当内部类采用static修饰时,建立内部类对象如下
	Outer.Inter in=new Outer.Inter();

  在外部其他类中,如何直接访问static内部的非静态成员呢?

	new Outer.Inter().InMethod();

  在外部其他类中,如何直接访问static 内部的静态成员呢? 

	Outer.Inner.function();

  注意:当内部类中定义了静态成员,该内部类必须是static

   当外部类中的静态方法访问内部类时,内部类也必须是static

   

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事物在使用外部事物的内容

class Body  
{
	private class XinZang  //定义XinZang内部类为私有类型
	{
		XinZang()  //定义XinZang内部类构造函数
		{
			System.out.println("内部类XinZang类被调用!");
		}		
	}
	public void show()
	{
		new XinZang();//将心脏封装起来,通过外部方法show访问
	}
}

 内部类定义在局部时,

 1,不可以被成员修饰符访问

 2,可以直接访问外部类中的成员,因为还特有外部类中的引用。

  但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量

class Outer2
{
	final int x=3;
	void method()
	{
		int i=9;  //定义局部变量
		final int y=99;		
		class Inner2	//内部类定义在局部method()方法内
		{			
			void function()
			{
				System.out.println(x);//可以直接访问外部类中的成员
				//System.out.println(i);//不可以访问它所在的局部中的变量
				System.out.println(y);//只能访问被final修饰的局部变量
			}
		}
		new Inner2().function();
	}
}

 

匿名内部类:

1,匿名内部类其实就是内部类的简写格式

2,定义匿名内部类的前提

内部类必须是继承一个类或者实现接口。

3,匿名内部类的格式: new 父类或者接口(){定义子类的内容}

4,其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的对象

5,匿名内部类定义方法最好不要超过三个

abstract class AbsDemo
{
	abstract void show();
}
class Outer3
{
	int x=3;
	class Inner3 extends AbsDemo
	{
		void show()  //对抽象类中的方法进行重写
		{
			System.out.println("method:x="+x);
		}
	}	

	public void function()
	{
		new Inner3().show();//调用内部类show方法
	}
}
public class InnerClassDemo3 {
	public static void main(String[] args)
	{
		new Outer3().function();
	}
}

============================将其简化为内部类============================

abstract class AbsDemo
{
	abstract void show();
}
class Outer3
{
	int x=3;	

	public void function()
	{
		AbsDemo absDemo=new AbsDemo() {			
			@Override
			void show() {//对抽象类中的方法进行重写
				System.out.println("method:"+x);				
			}
		};
		absDemo.show(); 
	}
}
public class InnerClassDemo3 {
	public static void main(String[] args)
	{
		new Outer3().function();
	}
}


----------------------Android培训Java培训、期待与您交流! ---------------------- 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值