Java基础--内部类

内部类:

在有些程序开发中,类被定义成一个独立的程序单元,在某些情况下,也会将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
1:内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一包中的其他类访问该类。
2:内部类可以直接访问可以直接访问外部类的私有数据。但是外部类不能直接访问内部类的实现细节。
3:匿名内部类适合用于创建那些进需要一次使用的类,
4:内部类的定义可以被 private protected static修饰
5:非静态内部类不能拥有静态成员。

分为四种:
1、成员内部类
2、静态内部类

package test.java22;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Outter {

	public String name;
	public static int age;

	//非静态方法中,即可调用成员变量和静态变量
	public  void say() {
		System.out.println("say===name:"+name+"、age:"+age);
	}
	
	//静态方法中只能调用静态成员
	public static void message() {
		System.out.println("message===age:"+age);
	}
	
	//静态内部类就是在 public static class Inner{},但是类里面只能调用静态成员,name为非静态成员,会编译错误
	public class Inner{//类似成员方法,内部类可以继承

		public void test(){
			System.out.println("内部类==="+age+"==="+name);
		}
	}
}


测试类
package test.java22;

import test.java22.Outter.Inner;

public class OITest {

	public static void main(String[] args) {
		Outter outter = new Outter();
		outter.name = "fyl";
		Inner inner = outter.new Inner(); //成员内部类调用方法
		
//		Outter.Inner inner = new Outter.Inner();  //静态内部类调用方法
		inner.test();
	}
	
	
}


成员内部类是最普通的内部类,它的定义为位于另一个类的内部,成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
3、局部(方法)内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
1.局部内部类只在方法体中有效,就想定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象
2.在方法内部定义类时,应注意以下问题:
   1.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和abstract修饰
   2.方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。
   3.static方法中定义的内部类可以访问外部类定义的static成员
package test.java22;

public class Outter {

	public String name;
	public static int age;
	
	public void say(final String name,final int age) {
		class Inner{//方法里面的类
			public void print() {
				System.out.println("方法内部类===name:"+name+"、age:"+age);
			}
		}
		// 创建局部内部类的实例并调用方法
		new Inner().print();
	}

}


测试类
package test.java22;

public class OITest {

	public static void main(String[] args) {

		Outter outter = new Outter();
		outter.say("fyl", 20);
	}
}

4、匿名内部类

匿名内部类适合用于创建那种只需要一次使用的类,例如前面介绍
1匿名内部类不能定义构造函数,由于匿名内部类没有类名,所以无法定义构造器。但是可以定义代码块.
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

package test.java22;

import java.util.Date;

public class Outter {

	public String getDate(Date date) {
		return date.toString();
	}
}

测试类
package test.java22;

import java.util.Date;

public class OITest {

	public static void main(String[] args) {

		Outter outter = new Outter();
		String str1 = outter.getDate(new Date());
		System.out.println(str1);
		
		//使用匿名内部类
		String str2 = outter.getDate(new Date(){});// 使用了花括号,但是不填入内容,执行结果和上面的完全一致,生成了一个继承了Date类的子类的对象
		System.out.println(str2);
		
		  // 使用匿名内部类,并且重写父类中的方法
		String str3 = outter.getDate(new Date(){
			@Override
			public String toString(){
				return "Hello===="+super.toString();
			}
		});
		
		System.out.println(str3);
	}
}

运行结果:
Sun Oct 16 19:12:27 CST 2016
Sun Oct 16 19:12:27 CST 2016
Hello====Sun Oct 16 19:12:27 CST 2016



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值