内部类作用主要实现功能的隐藏、减少内存开销,提高程序的运行速度
内部类和外部类联系:内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部类的优先级比较高(只限于类内部,在主方法内,内部类对象不能访问外部类的成员方法和成员属性),外部类只能访问内部类的静态常量或者通过创建内部类来访问内部类的成员属性和方法
内部类定义的静态常量可以全局访问
创建内部类
第一种方式
假设A是外部类,B是内部类
A a=new A();
A.B b=a.new B();
或者用A类的匿名对象来访问
A.B b=new A().new B();
普通类权限
public和default
而内部类具有四种权限
A.this.name(反射机制创建当前对象)
类优先于字节码文件执行,编译完类才生成字节码文件
字节码文件可以通过反射机制来改变
类中的私有属性可以通过发射机制在类外访问,通过反射机制改变字节码文件中的东西
编译时和运行时
反射机制工作在运行时
静态内部类.
public class StaticInner {
//{
/*static class hello
{
普通代码块内不能定义静态内部类
}*
/
}*/
static
{
class hello
{
//静态代码块内可以定义静态内部类
public void test()
{
System.out.println("it's a inner class");
}
public void practice()//静态代码块内不能定义静态方法
{
System.out.println("it's a demo");
//System.out.println(a);
//method();这两句编译报错,可看出静态内部类不能访问外部类的普通成员和方法
System.out.println(a1);
test1();
//从这两句可以看出,静态内部类只能访问外部类的静态成员和静态方法
}
//从上看出静态内部类可以定义普通方法和静态方法
}
}
private int a;
private void method()
{
System.out.println("hello");
}
private static String a1;
private static void test1()
{
System.out.println("you can access this method,because it is static");
}
//静态内部类
static class Inner{
public void test()
{
System.out.println("it's a inner class");
}
public static void practice()
{
System.out.println("it's a demo");
//System.out.println(a);
//method();这两句编译报错,可看出静态内部类不能访问外部类的普通成员和方法
System.out.println(a1);
test1();
//从这两句可以看出,静态内部类只能访问外部类的静态成员和静态方法
}
//从上看出静态内部类可以定义普通方法和静态方法
}
}
静态内部类创建对象
StaticInner.Inner inn=new StaticInner.Inner();
这里可以把内部类当做外部类的一个静态成员
局部内部类
定义在方法体内
定义在普通代码块内
实例如下
public class Outer {
private int a;
private void practice()
{
System.out.println("This is a outer class method");
}
public void method()
{
int a1;
final int a2=0;
class inner
{
public void test()
{
//能访问外部类任何属性和方法
System.out.println(a);
practice();
//
// System.out.println(a1);//这句话出现编译错误--报错--不能访问外部类方法中定义的变量
System.out.println(a2);//把变量声明为final常量,final的另一用法
//final 提高局部变量的可见性 声明时需要同时赋值并初始化
}
}
//类的作用范围为这个方法体内,所以对象的创建在这个类声明以后
inner in=new inner();
{
class a{}//代码块中的内部类
}
}
//inner in=new inner();//因为在方法体之外所以报错
//总结:局部内部类具有普通类的功能
//内部类如果访问它所在方法中的局部变量是无法获取的
//解决办法加上final关键字,提高变量的可见性
//局部内部类的对象只能在该方法体的局部创建只能在局部类定义的后面创建对象
}
匿名内部类
出现背景
经常出现在使用其他技术时,出现接口类的情况,此时无法创建接口类型的实现
实例如下
public interface Fruit {
void seed();
void grow();
}
public class Worker {
public void getFruit(Fruit fruit)
{
System.out.println("this is a no name class");
fruit.grow();
fruit.seed();
}
}
public class Test1 {
public static void main(String[] args) {
Worker w=new Worker();
w.getFruit(new Fruit(){
@Override
public void seed() {
// TODO Auto-generated method stub
System.out.println("the seed is planted");
}
@Override
public void grow() {
// TODO Auto-generated method stub
System.out.println("it's growing");
}});
//1.匿名类没有名字
//2.匿名类是一个子类
//3.匿名类用它父类(接口,抽象)当名字,父接口的名字
//4.执行效率奇高
//多用在android开发中
//匿名类实现父类(接口,抽象)中的方法
}
}
//总结在代码中写了,有错请批评指出,谢谢哈 |