一作用
1提供类更好的封装,不允许同一包中的其他类访问该类
2 内部类成员可以直接访问外部类的私有数据,外部类不能访问内部类的成员变量
3 匿名内部类适用于仅需要一次使用的类
实例一
public class Cow{
private double weight;
public Cow(){}
public Cow(double weight){
this.weight=weight;
}
//非静态内部类
private class CowLeg{
private double length;
private String color;
public CowLeg(){}
public CowLeg(double length,String color){
this.length=length;
this.color=colot;
}
//省略getter,setter方法
public void info(){
//可以直接访问外部类的weight 变量
}
}
//外部的普通方法
public void test(){
CowLeg c1=new CowLeg(1.12,"黑白相间");
c1.info();
}
public static void main(String [] args){
Cow cow=new Cow(378.9);
}
}
实例二
public class DiscernVariable{
private String prop="外部类的实例变量";
private class InClass{
private String prop="内部类实例变量";
public void info(){
String prop="局部变量";
DiscernVariable.this.prop;//类名+this+变量名访问外部类的变量;
this.prop;//访问内部类的实例变量
}
}
publilc void test(){
InClass in=new InClass();
in.info();
}
new DiscernVariable().test();
}
实例三
public class Outer
{
private int outProp=9;
class Inner{
private int inProp=5;
public void acessOuterProp(){
System.out.println("外部类的outProp值"outProp);
}
}
public void accessInnerProp(){
System.out.println(内部类的inProp值"inProp);//出现错误,不能直接访问
System.out.println("内部类的值"new Inner.inProp);
}
}
二 使用内部类
1 在外部类内部使用内部类
通过new 调用内部类调用内部类构造器来创建实例,不要再外部类的静态成员变量中使用非静态的内部类
2 在外部类以外使用非静态内部类
*使用private修饰的内部类只能在外部 类内部使用
*省略修饰符的,与外部类同一包中的其他类访问
*protected修饰的,与外部类同一包中的其他类和外部类的子类访问
* public 可以在任何地方被访问
3 使用静态内部类
比使用非静态内部类要简单很多,只要把外部类当成静态内部类的包空间即可。优先考虑使用静态内部类
三 匿名内部类
适合创建那种只需要一次使用的类
1 匿名内部类不能是抽象类 ,(要创建对象,而抽象类无法实例化)
2 不能定义构造器,(没有类名所以无法定义构造器)
interface Product{
public double getPrice();
public String getName();
}
public class AnonymousTest{
public void test(Product p){
System.out.println(p.getPrice+p.getName());
}
public static void main (String[]args){
AnonymousTest ta=new AnonymousTest();
ta.test(new Product (){
public double getPrice(){
return 567.8;
}
public String getName(){
return "AGP显卡";
}
});
}
}