java 结合内部类与外部类的静态(static)与非静态的用法

        阅读提示:如果觉得不好理解,可以按照我的思路自己操作一遍。不同元素的名称区分的比较细,注意区分几个概念:非静态外部类、静态和非静态内部类、静态和非静态方法,静态和非静态属性等。

         java中的静态和非静态主要由static关键字区分,static关键字可修饰成员内部类、方法和变量(属性)三种内容。类可以分为两种,外部类和内部类,内部类是包含在外部类里面的,也就是说一个内部类一定对应一个的外部类,内部类又分为成员内部类、匿名内部类和局部内部类,本文仅涉及成员内部类。

1静态与非静态类构造

        用如下代码测试:Eclipse为非静态外部类,Button为非静态内部类,Window为静态内部类,Eclipse和Window包含静态变量、非静态变量、静态方法、非静态方法。Button包含非静态变量和方法。得出以下几点:

1.1 static只能修饰内部类(例Window),不能修饰外部类(例Eclipse)。所以外部类只有非静态外部类,内部类分为静态内部类和非静态内部类。

1.2 非静态外部类和静态内部类可包含静态变量和方法,非静态内部类不包含静态变量和方法

1.3 无论是非静态外部类还是非静态内部类以及静态内部类,都可以包含非静态变量和方法。

class Eclipse{//外部类
	String name;
	static String icon;	
	void getname() {		
	}
	
	static void geticon() {		
	}
	
	class Button{//按钮内部类
		String name;
		static String icon;//报错,非静态类中不能声明静态变量和静态方法
		
		void getname() {			
		}
		
		static void geticon() {//报错	
		}
	}
	
	static class Window{//窗口内部类
		String name;
		static String icon;
	
		void getname() {			
		}
		
		static void geticon() {			
		}
	}
}

2静态与非静态类调用

        用如下代码进一步测试,得出以下几点:

2.1非静态外部类调用:

2.1.1 非静态外部类非静态方法中,可以调用所有非静态类和静态类的非静态、静态方法、变量。

2.1.2 非静态外部类静态方法中,不可以调用非静态外部类非静态变量、方法和非静态内部类的实例、方法、变量,可以调用静态内部类的实例、实例.方法、实例.变量。

2.2内部类调用:

2.2.1.非静态内部类只有非静态方法,与非静态外部类非静态方法一样,可以调用所有非静态类和静态类的非静态、静态方法、变量。

2.2.2.静态内部类的静态与非静态方法,不可调用所有非静态内部类的实例、方法、变量,可以调用所有非静态外部类的实例、实例.方法、实例.变量。

public class InnerClass {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		new Eclipse().getname();
//		new Eclipse().geticon();
//		new Eclipse().new Button().getname();
//		new Eclipse().new Window().geticon();//报错
		new Eclipse.Window().getname();
//		new Eclipse.Window().geticon();//与Eclipse.Window.geticon()等效
//		Eclipse.Window.geticon();

//              非静态内部类和静态内部类实例化的方法
//		Eclipse.Button btn=new Eclipse().new Button();
//		Eclipse.Window win=new Eclipse.Window();
	}


}


class Eclipse {// 外部类
	String name = "eclipsename";
	static String icon = "eclipseicon";


	void getname() {
		System.out.println(name);
//		new Button().getname();
//		new Window().getname();
//		new Window().geticon();
//		Window.geticon();
//		String btnname=new Button().name;
		
	}


	static void geticon() {
		System.out.println(icon);
//		getname();//报错
//		System.out.println(name);//报错
//		Button btn=new Button();//报错
//		new Button().getname();//报错
//		Window w=new Window();
//		new Window().getname();
//		new Window().geticon();	
//		Window.geticon();
	}


	 class Button {// 按钮内部类
		String name = "buttonname";
		// static String icon;


	    void getname() {
//			System.out.println(name);
//			new Eclipse().getname();
//			Eclipse.this.getname();//非静态内部类里也用非静态外部类名.this.方法实现调用实例方法的效果
//			new Eclipse().geticon();
//			Eclipse.geticon();			
//			new Window().getname();
//			new Window().geticon();
//			Window.geticon();
//			String ecname=new Eclipse().name;
//			String ecicon=new Eclipse().icon;
                        String s=Eclipse.this.name;//非静态内部类里也用非静态外部类名.this.变量实现调用实例变量的效果
		}


		// static void geticon() {
		// }
	}


	 static class Window {// 窗口内部类
		String name = "windowname";
		static String icon = "windowicon";


		void getname() {
			System.out.println(name);
			new Eclipse().getname();
			new Eclipse().geticon();
//			new Button().getname();//报错
			Eclipse.geticon();
			String ecname=new Eclipse().name;
			String ecicon=new Eclipse().icon;
		}


		static void geticon() {
  			System.out.println(icon);
//			new Eclipse().getname();
//			new Eclipse().geticon();
		    new Button().getname();
//			Eclipse.geticon();
//			String ecname=new Eclipse().name;
//			String ecicon=new Eclipse().icon;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值