java 内部类

来源:互联网 发布:本港台网络电视 编辑:程序博客网 时间:2024/06/06 01:00

一作用

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显卡";

}

});

}

}


0 0
原创粉丝点击