关闭

【黑马程序员】java中-------------内部类

425人阅读 评论(0) 收藏 举报
分类:

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


一、内部类定义

将一个类定义在另一个类的局部或者成员位置上,该类可以视为内部类


二、定义规则

1.一个内部类的成员不能被static静态修饰,如果要被static修饰,那么这个内部类也要被static修饰。。


2.当一个内部类定义在外部尅的成员位置上时,就可以被成员修饰符所修饰,如:private ;public; static;final。


3.内部类定义在局部时,不可以被成员修饰符修饰,private; public;static,但是可以被final修饰,

局部内部类的成员可以被成员修饰符修饰,(注意:static不可以,如果一旦修饰了,那内部类要被static修饰,但是

局部内部类不能用成员修饰符修饰)


三、内部类的访问规则

1.一个非静态内部类(其中成员不能是静态的),可以直接访问外部类成员。


而外部类访问内部类需要创建内部类对象之后,才可以访问内部类成员


2.一个被private 修饰的内部类(其中成员不能是静态),也可以访问外部类的任何成员

内部类一但被private修饰,外部类是不能无法访问的

注意:之所以内部类可以自己访问外部类中成员,是因为内部类中持有了外部类的一个引用:外部类名.this


3.一个非静态内部类,如果他的外部类静态方法要访问内部类时,就必须创建对象采矿进行访问

格式:Out.Inner     in=new  Out().new   Inner();

练习代码:

package neibulei;

	
public class Out{
	
	    class Inner{	//内部类Inner
	          
	    	int i =5;
	        public  void show()
	        {
	             System.out.println(i);
	        }
	    }
	    //外部类静态方法
	    public static void Method()
		{
			//创建内部类对象
	       Out.Inner  in = new Out().new Inner();
	       in.show();
		}	
}
class MainClass{
	public static void main(String[] args){
		
		Out.Method();//静态方法的调用
		
		
	}
}
4.外部类访问内部类,必须建立内部类对象


5.当内部类定义在外部类成员位置上,非私有修饰,可以被外部类直接创建对象。

格式:

外部类.内部类     变量名=new 外部类().new 内部类();
Out .Inner  in=new Out().new Inner();


6.当内部类被static修饰后,具备static的特性,只能访问外部类的static的成员


7.如果在外部类中的方法中访问static内部类的非static静态成员

练习代码:

package neibulei;

public class MainClass{
	public static void main(String[] args){
		
		new Out().Method();//创建外部类对象调用Method()方法
		
		
	}
}	
 class Out{
	
	   static class Inner{	//static 内部类Inner
	          
	    	int i =5;
	        public  void show()
	        {
	             System.out.println(i);
	        }
	    }
	    //外部类非静态方法
	    public void Method()
		{
			//创建内部类对象
	      Inner in=new Inner();
	       in.show();
		}	
}

8. 如果内部类是static的,而且类中成员也静态的

外部类就可以直接,类名.调用:如:Inner.show();


9.在外部其他类中,访问static的内部类和其中的static成员

直接外部类名.内部类名.show();调用即可

练习代码:

package neibulei;

public class MainClass{
	public static void main(String[] args){
		
		Out.Method();//创建外部类对象调用Method()方法
		
		
	}
}	
 class Out{
	
	   static class Inner{	//static 内部类Inner
	          
		   static int i =5;	//	static成员
	        public static  void show()//static方法
	        {
	             System.out.println(i);
	        }
	    }
	    //外部类静态方法
	    public  static void Method()
		{
			//直接类名调用
	      Inner.show();
		}	
}

10. 内部类定义在局部时,可以直接访问外部类中成员,而局部内部类要访问

外部类中局部成员只能访问被final修饰的成员变量

练习代码:

package neibulei;

public class MainClass{
	public static void main(String[] args){
		
		Out.Method();//外部类名调用Method()方法
		
		
	}
}	
 class Out{
	
	   
	    //外部类静态方法
	    public  static void Method()
		{	
	    	final int x=0;//需要final修饰
	    	 class Inner{	//局部 内部类Inner
		          
	 		    int i =5;	//	成员
	 	        public  void show()//内部类方法
	 	        {
	 	             System.out.println(i);
	 	             //局部内部类方法访问外部类中成员
	 	            System.out.println(x);
	 	        }
	 	        
	 	      } 
	 	     //创建局部内部类对象
	 	        Inner in=new Inner ();
	 	        in.show();
		}	
}

11. 内部类可以直接访问外部类中成员,是因为持有外部类 的引用

类名.this.变量名


练习代码:

public class Test5 {

	/**5.在打印语句中如何打印这3个x变量?
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//建立内部类对象,并且调用内部类func()方法
		A.B b=new A().new B();
		b.func();
	}

}
class A {
    int x = 1;
 
   public class B {
        int x = 2;
 
        public void func() {
            int x = 3;
            //此x是打印本方法中的成员
            System.out.println( x );
            //此x是打印内部类的成员变量,因为x有内部类的引用:类名.this.x
            System.out.println( B.this.x );
            //此x是打印外部类的成员变量,因为此x有外部类的引用:外部类名.this.x
            System.out.println( A.this.x );
        }
    }
}

12. 在内部类中,静态访问静态同样符合


四、内部类的使用

1.当描述事物时,事物的内部还有事物,则该事物使用内部类来描述,因为内部类事物要使用外部类中的内容

举例说明:

比方说人这个对象,它的内部还有心脏这个事物。

如果单独定义一个类描述心脏,就不符合现实生活中的规则

2.在接口中,也有一个比较特殊的

它属于接口中的内部接口

//内部接口的形式

interface Map{
	public static interface Entry{
		public abstract Object getKey();
		public abstract Object getValue();
	}
}
//内部类实现内部接口的形式
class HashMap implements Map{
	class haha implements Map.Entry{
		public Object getKey(){}
		public Object getValue(){}
	}
}

五、匿名内部类

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


2.定义匿名内部类的前提:内部类必须继承一个类或者实现一个接口


注意:可以不继承一个类,仍然可以定义匿名内部类,那么依靠Object类来定义匿名类

因为,他们读书Object的子类

3.匿名类的格式:new  父类名或者接口(){子类主体}


注意:

a.其实匿名内部类就是一个匿名子类对象,而且这个对象特点比较丰满


b.匿名内部类中定义的方法最好不要超过3个


c.当创建接口或者抽象类的匿名子类对象时,必须覆盖接口或者抽象类中的抽象定义


d.当创建一般类的匿名子类对象时,可以不用全部覆盖方法,覆盖自己需要的即可

联系代码:

package neibulei;

public class MainClass{
	public static void main(String[] args){
		
		Out o=new Out();//建立外部类对象
		o.Method();
		o.show();
		
	}
}
//接口
interface inter{
	public abstract void smoke();
	public abstract void dapai();
}

//一般类
class person{
	public void seelp(){
		System.out.println("疲惫了就睡觉");
	}
	
}
 class Out{
	 	public void show(){
	 		new person(){
	 			//person类匿名子类对象,并且调用seelp()方法
	 			public void seelp(){
	 				System.out.println("即使困了,累了,我们还是要坚持!");
	 			}
	 		}.seelp();
	 	}
	   
	   
	    public void Method()
		{	
	    	
	    	 
	    	inter i=new inter(){	//局部匿名 内部类inter
	    		//覆盖所有抽象方法
	    		public    void smoke(){
		        	 System.out.println("抽烟有害健康!");
		         } 
	    		public  void dapai(){
		        	 System.out.println("赌博不是好的习惯");
		         }
	 		   
	 	        
	 	      } ;
	 	      i.smoke();
	 	      i.dapai();
	 	   
		}	
}











































---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11352次
    • 积分:349
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档