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

原创 2013年12月03日 22:14:11

---------------------- <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>、期待与您交流! ----------------------


Java 四种内部类

Java 内部类  分四种:成员内部类、局部内部类、静态内部类和匿名内部类。  1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。 注意:成员内部类中不能定义静态变量,但可以访问...
  • superit401
  • superit401
  • 2016年07月30日 18:01
  • 4663

黑马程序员——Java基础---练习题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Java基础---练习题 1.写出程序结果class Demo { public stat...
  • liu007004
  • liu007004
  • 2015年01月19日 16:35
  • 703

Java内部类的this问题

一轮红日映朝阳 首页  标签  搜索  留言 Java内部类的this问题 2011-9-15 16:23:45 在一个风和日...
  • imxiangzi
  • imxiangzi
  • 2012年09月06日 09:49
  • 5639

【java】内部类例子

1.内部类是在类的内部定义的类 2.内部类分为成员内部类,局部内部类,匿名内部类。 3.内部类中可以直接调用其所在类的私有变量以及方法,但是外部类不可以调用内部类的成员。 4.内部类的实例一定要...
  • NeoAdrian
  • NeoAdrian
  • 2016年04月11日 14:10
  • 1199

java内部类常见面试题汇总

1.根据注释填写(1),(2),(3)处的代码 public class Test{ public static void main(String[] args){ /...
  • tomcat_2014
  • tomcat_2014
  • 2016年04月18日 17:13
  • 2805

关于java成员内部类(普通内部类)在main方法中调用

main方法访问普通内部类的例子: //外部类test public class Test { //非静态的外部类成员变量 int num=1; /** * 普通内部类Person ...
  • JcMR_Li
  • JcMR_Li
  • 2017年02月08日 00:41
  • 1460

JAVA和C++内部类

JAVA和C++内部类的异同
  • qq78442761
  • qq78442761
  • 2016年11月21日 22:52
  • 470

java内部类的四大作用

放在一个类的内部的类我们就叫内部类。 二、 作用 1.内部类可以很好的实现隐藏  一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所...
  • mid120
  • mid120
  • 2016年12月14日 19:25
  • 3441

Java内部类的作用

内部类的作用:1、隐藏你不想让别人知道的操作,也即封装性。2、一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!内部类的功能在于,每个内部类都能独立的继承一个接口的实现,所以无论外围类...
  • thinkGhoster
  • thinkGhoster
  • 2008年04月29日 13:53
  • 9316

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式。 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,...
  • u012142423
  • u012142423
  • 2014年08月05日 23:06
  • 2610
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【黑马程序员】java中-------------内部类
举报原因:
原因补充:

(最多只允许输入30个字)