JavaJava学习笔记技术干货

总是搞不清内部类

2017-05-10  本文已影响63人  风吹稻子

内部类不多,就三种,但是知识点特别碎,总是把我搞迷糊。但我发现它和变量有些相似。哎!管它是什么?先写下来吧,好记性不如烂笔头么!

局部内部类

  1. 是指内部类定义在方法和作用域内
  2. 其作用域只在方法体内部
  3. 局部内部类的成员的方法的参数和局部变量必须是final定义的
  4. 不能使用private,protected,public 等访问修饰符

代码示例:

package innerclass;
/**
 * 局部内部类,是指内部类定义在方法和作用域内
 * 其作用域只在方法体内部
 * 成员的方法的参数和局部变量必须是final定义的
 * 不能使用private,protected,public 等访问修饰符
 * @author Administrator
 *
 */
public class JuBuClass {
    private String name="关头请";
    //成员的方法的参数和局部变量必须是final定义的
    public ShowCla showName(final int b){
        final int a = 10;
        //其作用域只在方法体内部
        //不能使用private,protected,public 等访问修饰符
        class Clazz extends ShowCla{
            private int num = 400;
        
            public void show(){
                System.out.print("jkdf"+b);
            }
        }
    
        //new Clazz().show();
        return new Clazz();
    }

    public static void main(String[] args){
        JuBuClass jubu = new JuBuClass();
        jubu.showName(10).show();
    }

}

abstract class ShowCla{
    public abstract void show();
}

测试结果:

jkdf10

成员内部类

  1. 如果外部类属性名和内部类属性名,我们用外部类.this来调用外部类的属性名
  2. 内部类的优点:可以不用创建对象去调用外部类的属性和方法
  3. 内部类的创建方式: 外部类.内部类 对象名 = new 外部类().new 内部类()

代码示例:

package innerclass;

public class School {
    private String name="河南";
    private int size = 100;
    
    public void outShow(){
        Clazz c = new Clazz();
        c.show();
    }
    
    public class Clazz{
        private int n=400;
        
        public void show(){
            size = 10;
            System.out.println("内部show方法"+size);
            
        }
    }

    public static void main(String[] args){
        School s = new School();
        Clazz c = s.new Clazz();
        s.outShow();
    }
}

测试结果:

内部show方法10

匿名内部类

  1. 由于匿名内部类没有名称,所以不能写构造方法

  2. 匿名内部类格式new 匿名类{方法体};

  3. 匿名内部类可以继承和实现一个接口

    代码示例:

     package innerclass;
     
     /**
      * 由于匿名内部类没有名称,所以不能写构造方法
      * 匿名内部类格式new 匿名类{方法体}
      * 匿名内部类可以继承和实现一个借口
      * @author Administrator
      *
      */
     public class WuMing {
         private String name = "光头请";
         
         public ShowCla cla(final int num){
             return new ShowCla(){
                 private int size;
                 public void show(){
                     System.out.println(size+" "+num);
                 }
             };
         }
         
         public static void main(String[] args){
             WuMing wu = new WuMing();
             wu.cla(10).show();
         }
     }
    

测试结果:

0 10

递归:

1.有反复执行的过程(调用自身)
2.有反复执行过程的条件(递归出口)
//递归跟循环或者算法,运行效率低
上一篇下一篇

猜你喜欢

热点阅读