面向对象——内部类

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

7.面向对象――内部类

7.1内部类

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

格式:

class OutClass{

       class InnerClass{//内部类

     }

}

注意:内部类可以定义在外部类的成员位置,也可以是在外部类的局部位置.

:

class OutClass{
       public void method(){

              class InnerClass{//内部类在外部的局部位置上.

        }

    }

}

注意:内部类可以直接访问外部类中的成员,包括私有的,而外部类要访问内部类中的成员,必须要创建内部类的对象.

        7.1.1什么时候需要定义内部类呢?

在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这时就把还有的事物定义成内部类来描述.

       7.1.2访问格式

       第一种情况:直接通过外部类创建内部类对象

       :

class OuterClass//外部类
{
       class InnerClass//内部类
       {
              void method(){
                     System.out.println("内部类的方法");
              }
       }
}
public class Demo
{
       public static void main(String[]args){
              OuterClass.InnerClass oi=new OuterClass().new InnerClass();//直接通过外部类创建内部类对象,调用内部类的成员.
              oi.method();//调用内部类成员
       }     
}


 

第二种情况:当内部类中有static修饰的静态成员时,那么,内部类也必须是静态的.

如:
class OuterClass//外部类
{
	static class InnerClass//内部类前面加static 
	{
		static void method(){//method是静态的,所在的内部类也必须是静态的
			System.out.println("内部类的静态method方法");
		}
		void show(){
			System.out.println("内部类的非静态show方法");
		}
	}
}
public class Demo
{
	public static void main(String[]args){
		OuterClass.InnerClass oi=new OuterClass.InnerClass();//因为内部是静态的,所以可以用这种方法创建对象
		oi.show();//调用内部类的非静态成员方法.
	}	
}


 

第三种情况:直接调用内部类中的静态成员,可以不创建对象,直接用类名调用.

如:
class OuterClass//外部类
{
	static class InnerClass//内部类前面加static 
	{
		static void method(){//method是静态的,所在的内部类也必须是静态的
			System.out.println("内部类的静态method方法");
		}
		void show(){
			System.out.println("内部类的非静态show方法");
		}
	}
}
public class Demo
{
	public static void main(String[]args){
		OuterClass.InnerClass.method();//如果直接调用内部类中的静态成员时,可以不创建对象用类名直接调用.
	}	
}


 

7.1.3为什么内部类可以直接访问外部类中的成员,包括私有的.

因为,内部类持有了外部类的引用:外部类类名.this.

如:
class OuterClass//外部类
{
	private int num=3;//外部类的私有成员
	class InnerClass 
	{
		void show(){
			System.out.println("外部类的成员:num="+num);
//打印结果:3,因为内部类持有外部类的引用,实际上是调用了:OuterClass.this.num;相当于: System.out.println("外部类的成员:num="+OuterClass.this.num);
		}
	}
}
public class Demo
{
	public static void main(String[]args){
		new OuterClass().new InnerClass().show();
	}	
}


 

7.1.4局部位置上的内部类

class OuterClass//外部类

{

    void method(){

           class InnerClass//内部类在局部位置上

           {

           }

    }

}

 

注意:1,内部类在局部位置时不能被成员修饰符修饰。

         2,当内部类在局部位置上时,只能访问由final修饰的局部变量.

:

class OuterClass//外部类
{
	void method(){
		final int num=3;//这里的局部变量num必须要加上final,否则无法访问.
		class InnerClass//内部类在局部位置上
		{
			void show(){
				System.out.println(num);//内部类在访问局部变量num
			}
		}
		new InnerClass().show();//外部类要访问内部类的成员,必须要创建内部类的对象,完成调用.
	}
}
public class Demo
{
	public static void main(String[]args){
		new OuterClass().method();//调用外部类的成员方法,完成对局部内部类的成员的调用.
	}	
}


 

7.1.5匿名内部类

匿名内部类,就是没有名字的内部类,匿名内部类是内部类的简写形式,前提是,内部类必须继承或者实现一个外部类或者接口,匿名内部类实际上就是匿名子类对象.完成对父类或者接口的方法的覆写和调用.

:

格式:new 父类或接(){

         定义子类的内容;

}

interface Inter//接口
{
	void show();
}
class OuterClass//外部类
{
		class InnerClass implements Inter//匿名内部类的前提:必须继承或实现一个外部类或接口
		{
			public void show(){//覆写接口中的show()方法
				System.out.println("覆写接口Inter中的show方法");
			}
		}
		void method(){
			new InnerClass().show();//创建子类对象并调用show方法
		}
}
public class Demo
{
	public static void main(String[]args){
		new OuterClass().method();
	}	
}
//以上代码,用匿名内部类的形式可以写成:
interface Inter//接口
{
	void show();
}
class OuterClass//外部类
{
		
		/*
		class InnerClass implements Inter//匿名内部类的前提:必须继承或实现一个外部类或接口
		{
			public void show(){//覆写接口中的show()方法
				System.out.println("覆写接口Inter中的show方法");
			}
		}
		*/
		//将注释的代码写成匿名内部类的形式
		void method(){
			new Inter(){//这里就是创建Inter接口的子类对象
				public void show(){//完成对接口中抽象方法的覆写
					System.out.println("覆写接口Inter中的show方法");
				}
			}.show();//直接调用show方法
		}
}
public class Demo
{
	public static void main(String[]args){
		new OuterClass().method();//创建外部类对象,并调用method方法.
	}	
}


 

注意:以上接口中只定义了一个抽象方法,那么如果接口中有多个抽象方法,该如何调用呢.

这时,就可以给匿名子类对象起个名字,再完成方法的调用.

如:

interface Inter//接口
{
	void show1();
	void show2();
}
class OuterClass//外部类
{
		void method(){
		Inter in=new Inter(){//这里就是创建Inter接口的子类对象,并赋值给引用型变量in.相当于给子类对象起个名字
				public void show1(){//完成对接口中抽象方法的覆写
					System.out.println("覆写接口Inter中的show1方法");
				}
				public void show2(){//完成对接口中抽象方法的覆写
					System.out.println("覆写接口Inter中的show2方法");
				}
			};
			in.show1();//在这里分别调用两个方法
			in.show2();
		}
}
public class Demo
{
	public static void main(String[]args){
		new OuterClass().method();//创建外部类对象,并调用method方法.
	}	
}


 

总结:内部类中需要注意,成员修饰符的特点,以及外部类和内部类相互访问的方式,如何在主函数中创建内部类对象,完成对内部类成员的调用,内部类中有静态成员时,内部类的修饰符的变化.内部类在局部位置时,访问局部变量的前提.在匿名内部中要注意书写格式.

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值