黑马程序员--Java基础学习笔记【参数传递、访问控制符、内部类】

 

 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------    

 

形式参数和返回值问题:基本类型传值,引用类型传址

包声明、导包、类声明的的顺序关系:packagecn.itcast; import java.util.*; public class Demo{}

 

  • 访问控制修饰符(权限修饰符)

protected 可以被子类及同一个包中的类使用

protected 受保护的权限,成员修饰成员只给子类

protected修饰的成员,只能在子类中super调用

默认访问控制的成员变量和方法可以被同一个包中的类调用

访问控制符修饰类

         public 修饰的类可以被任何一个类使用;

         默认访问控制的类只可以被同一个包中的类使用

访问控制符修饰成员

wKiom1YEiwDj5EQ3AAFZCkaP2iM328.jpg

 

  • 内部类:

         定义在类的内部,根据位置不同,分为成员内部类和局部内部类

内部类可以直接访问所在外部类的成员,包括私有

外部类要访问内部类的成员,要创建对象

 

成员内部类创建对象

                   外部类名.内部类名 对象名 = 外部类对象.内部类对象

         成员内部类的修饰符:

                   private 保证数据安全性

                   static 让数据访问更方便,被静态修饰的成员内部类只能访问外部类的静态成员

         局部内部类:

                   可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

         局部内部类的方法,访问局部变量,变量必须final 修饰,为什么?

 

/*

 * 局部内部类方法,访问局部变量,变量必须 final 修饰,为什么必须有 final

 * final,解决什么问题

 *

 * 生命周期:

 *  方法的生命周期,没有对象长

 *  out 方法运行出栈,变量 x 就会死亡

 *  用了 Inner 类的对象,调用方法 in,造成变量已经死亡不能访问

 *

 *  变量加 final 修饰:

 * 

 *  final修饰变量 x,和内存的生命周期没有关系

 *  final本身含义固定变量值,终身不变

 * 

 *  javac编译的时候,直接将内部类方法变量 x,直接替换成 1

 */

publicclassInnerClass {

 

    publicstaticvoid main(String[] args) {

       Outerouter= newOuter();

       Interfaceinterface1= outer.out();

       interface1.in();

    }

 

}

 

interface Interface {

    publicabstractvoid in();

}

 

class Outer {

    public Interface out() {

       finalintx = 1;

       class Inner implements Interface {

           publicvoid in() {

              /*

               * Cannot refer to the non-final local variablex defined               * in an enclosing scope

               */

              System.out.println("局部内部类的方法in " + x);

           }

       }

       returnnew Inner();

    }

}

 

  • 匿名内部类

    如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。

/*

 * obj 用匿名类所实现的接口或所继承的父类类型声明的引用

 * SuperType 匿名类所要实现的接口或继承的父类

 *

 *

 */

SuperTypeobj = new SuperType(…){

    // 匿名中定义的成员变量或方法

    … … …

};

 

  • 定义匿名内部类

// 定义接口 Action,含有抽象方法 execute

interface Action{

    publicabstractvoid execute();

}

 

publicclassMain {

 

    publicstaticvoid main(String[] args) {

      

       // 创建实现接口 Action 的匿名内部类对象

       Actionaction= newAction() {

           // 重写接口中的方法

           @Override

           publicvoid execute() {

              System.out.println("匿名内部类");

           }

       };

      

       // 调用匿名内部类对象的 execute 方法

       action.execute();

    }

 

}

 

  • 匿名内部类面试题

//按照要求,补齐代码:要求在控制台输出 "HelloWorld"

interface Inter {

    publicabstractvoid show();

}

 

class Outer1 {

    // 补齐代码

    publicstatic Inter method() {

       returnnew Inter() {

           @Override

           publicvoid show() {

              System.out.println("Hello World!!");

           }

       };

    }

}

 

publicclassOuterDemo {

 

    publicstaticvoid main(String[] args) {

       // 类名.静态方法,方法调用链,另一个方法 show

       // 要求方法返回的必须是对象

       // method 返回的应该是一个对象,是接口 Inter 的实现类对象

       Outer1.method().show();

    }

 

}


你可能感兴趣的:(内部类,参数传递,访问控制符)