zoukankan      html  css  js  c++  java
  • 包和权限修饰符

    //包名采用全部小写字母

    * 包的特点:

     * 可以有多层

     * 不同包下的文件名可以重复

     * 包的声明必须是第一行代码

    * 不同包之间的互相访问

     * 使用类的全名

     * 使用关键字import将类导入

     *

     *

     * 注意:*代表的是通配符,代表导入了这个包下所有的类,并没有导入子包下的类

     *

     * 类的全名:包名.类名

    权限修饰符:

    public

    protected

    default

    private

    同一类中

    同一包中(子类与无关类)

    不同包的子类

    不同包中的无关类

     

    修饰符:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    抽象修饰符:abstract

    类:
    权限修饰符:默认修饰符,public
    状态修饰符:final
    抽象修饰符:abstract

    //此处不允许使用修饰符private

    //此处不允许使用修饰符protected

    //此处不允许使用修饰符static

    用的最多的就是:public

    成员变量:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    //此处不允许使用修饰符abstract
    用的最多的就是:private

    构造方法:
    权限修饰符:private,默认的,protected,public

    //此处不允许使用修饰符static
    //public static Demo(){}
    //此处不允许使用修饰符final
    //public final Demo() {}
    //此处不允许使用修饰符abstract
    //public abstract Demo(){}

    用的最多的就是:public


    成员方法:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    抽象修饰符:abstract
    用的最多的就是:public

    除此以外的组合规则:
    成员变量:public static final
    成员方法:public static
    public abstract
    public final

    什么是内部类

    将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。

    注意: 1:内部类和外部类没有继承关系。

                2: 通过外部类名限定this对象。  如果访问内部类中的成员变量num的格式: Outer.this.num

    1.1 成员内部类

    成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问

    A:定义格式

    class 外部类 {

    修饰符 class 内部类 {

    //其他代码

    }

    }

    B:访问方式

    外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

     

    * 成员内部类:

     * 在类的成员位置,和成员变量以及成员方法所在的位置是一样的

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

     

    * 成员内部类的修饰符:

     * 我们可以使用private修饰成员内部类,为了保证数据的安全性,无法在其他类中访问

     * 我们可以使用static修饰成员内部类,不用再创建外部类的对象了。内部类可以用static修饰是因为内部类可以看成是外部类的成员。注意:静态内部类访问的外部类数据必须用静态修饰。成员内部类被static修饰后的访问方式是:外部类名.内部类名 对象名 = new 外部类名.内部类名();

     *

     * 我们可以使用abstract,final修饰成员内部类

     

    1.2 局部内部类

      局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问

    * 局部内部类在方法内,出了方法之后就无法使用

    局部内部类
    A:可以直接访问外部类的成员
    B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

    面试题:
    局部内部类访问局部变量的注意事项?
    A:局部内部类访问局部变量必须用final修饰
    B:为什么呢?
    局部变量是随着方法的调用而调用,随着调用完毕而消失。
    而堆内存的内容并不会立即消失。所以,我们加final修饰。
    加入final修饰后,这个变量就成了常量。既然是常量。你消失了。
    我在内存中存储的是数据20,所以,我还是有数据在使用。

     1 class Outer {
     2     private int num  = 10;
     3     
     4     public void method() {
     5         //int num2 = 20;
     6         final int num2 = 20;
     7         class Inner {
     8             public void show() {
     9                 System.out.println(num);
    10                 //从内部类中访问本地变量num2; 需要被声明为最终类型
    11                 System.out.println(num2);//20
    12             }
    13         }
    14         
    15         //System.out.println(num2);
    16         
    17         Inner i = new Inner();
    18         i.show();
    19     }
    20 }

    1.3 匿名内部类

    匿名内部类
    就是内部类的简化写法。

    前提:存在一个类或者接口
    这里的类可以是具体类也可以是抽象类。

    格式:
    new 类名或者接口名(){
    重写方法;
    }

    本质是什么呢?
    是一个继承了该类或者实现了该接口的子类匿名对象。

     1 interface Inter {
     2     public abstract void show();
     3     public abstract void show2();
     4 }
     5 
     6 class Outer {
     7     public void method() {
     8         //一个方法的时候
     9         /*
    10         new Inter() {
    11             public void show() {
    12                 System.out.println("show");
    13             }
    14         }.show();
    15         */
    16         
    17         //二个方法的时候
    18         /*
    19         new Inter() {
    20             public void show() {
    21                 System.out.println("show");
    22             }
    23             
    24             public void show2() {
    25                 System.out.println("show2");
    26             }
    27         }.show();
    28         
    29         new Inter() {
    30             public void show() {
    31                 System.out.println("show");
    32             }
    33             
    34             public void show2() {
    35                 System.out.println("show2");
    36             }
    37         }.show2();
    38         */
    39         
    40         //如果我是很多个方法,就很麻烦了
    41         //那么,我们有没有改进的方案呢?
    42         Inter i = new Inter() { //多态
    43             public void show() {
    44                 System.out.println("show");
    45             }
    46             
    47             public void show2() {
    48                 System.out.println("show2");
    49             }
    50         };
    51         
    52         i.show();
    53         i.show2();
    54     }
    55 }

     

     

    匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:

    1 new Person(){
    2     public void eat() {
    3         System.out.println(“我吃了”);
    4 }
    5 }.eat();

    匿名内部类作为参数传递

     1 /*
     2     匿名内部类在开发中的使用
     3 */
     4 interface Person {
     5     public abstract void study();
     6 }
     7 
     8 class PersonDemo {
     9     //接口名作为形式参数
    10     //其实这里需要的不是接口,而是该接口的实现类的对象
    11     public void method(Person p) {
    12         p.study();
    13     }
    14 }
    15 
    16 //实现类
    17 class Student implements Person {
    18     public void study() {
    19         System.out.println("好好学习,天天向上");
    20     }
    21 }
    22 
    23 class InnerClassTest2 {
    24     public static void main(String[] args) {
    25         //测试
    26         PersonDemo pd = new PersonDemo();
    27         Person p = new Student();
    28         pd.method(p);
    29         System.out.println("--------------------");
    30         
    31         //匿名内部类在开发中的使用
    32         //匿名内部类的本质是继承类或者实现了接口的子类匿名对象
    33         pd.method(new Person(){
    34             public void study() {
    35                 System.out.println("好好学习,天天向上");
    36             }
    37         });
    38     }
    39 }
     1 /*
     2     匿名内部类面试题:
     3         按照要求,补齐代码
     4             interface Inter { void show(); }
     5             class Outer { //补齐代码 }
     6             class OuterDemo {
     7                 public static void main(String[] args) {
     8                       Outer.method().show();
     9                   }
    10             }
    11             要求在控制台输出”HelloWorld”
    12 */
    13 interface Inter { 
    14     void show(); 
    15     //public abstract
    16 }
    17 
    18 class Outer { 
    19     //补齐代码
    20     public static Inter method() {
    21         //子类对象 -- 子类匿名对象
    22         return new Inter() {
    23             public void show() {
    24                 System.out.println("HelloWorld");
    25             }
    26         };
    27     }
    28 }
    29 
    30 class OuterDemo {
    31     public static void main(String[] args) {
    32         Outer.method().show();
    33         /*
    34             1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
    35             2:Outer.method().show()可以看出method()方法的返回值是一个对象。
    36                 又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口,其本质是该接口的子类对象。
    37         */
    38     }
    39 }
  • 相关阅读:
    常用的android弹出对话框
    Android 启动后台运行程序(Service)
    java 日期获取时间戳
    stringbuffer与stringbuilder的区别
    Linux记录-sysctl.conf优化方案
    Linux记录-salt分析
    Hadoop记录-fair公平调度队列管理
    Linux记录-GC分析
    Hadoop记录-hdfs转载
    Linux记录-salt-minion安装
  • 原文地址:https://www.cnblogs.com/samuraihuang/p/9785571.html
Copyright © 2011-2022 走看看