内部类&包&权限修饰符

类中可以有平行类

一个文件中可以有多个并列关系的类

注意:一个java源文件中,只能有一个类被public修饰,且该类类名必须与文件名一致。

1 package com.offcn.Inner;
2 
3 public class Inner {
4 }
5 
6 class Outter2{
7 }

 内部类:

为什么存在内部类,因为内部类隐藏了代码,提高了安全性。

内部类的概述:

1.定义在类内部的类,就叫内部类,可以定义在方法的内部,也可以定义在类的内部。

2.根据定义的位置不同,可以分为:

          成员内部类

          局部内部类

3.成员内部类:

          普通的成员内部类

          私有的成员内部类

          静态的成员内部类

4.局部内部类(方法内部类):

5.根据表示的方式不同,可以分为:

    有名字的内部类

    匿名内部类

普通的成员内部类:

1.  定义在成员位置上的类,就是成员内部类

2.  定义格式:

    class  内部类类名{

    内部类成员

  }

3.  成员内部类的说明:

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

  2.外部类访问内部类的成员,必须先创建内部类的对象。

  3.在外部类以外,创建内部类的对象的格式:

    外部类名.内部类名 内部类对象名 = new 外部类名( ).new 内部类名( );

代码示例:

 

class Demo01_普通的成员内部类 {
    public static void main(String[] args) {
        Body.Heart bh = new Body().new Heart();
        bh.show();

        Body b = new Body();
        b.test();
    }
}

class Body {
    private double hight = 149.0;

    class Heart {
        int beats = 80;

        public void show() {
            System.out.println(hight + "..." + beats + "...扑通扑通的跳");
        }
    }

    public void test() {
        Heart h = new Heart();
        h.show();
    }
}

 私有的成员内部类:

1.也是一个成员内部类,在成员内部类上加上一个private关键字。

2.访问方式说明:

  1.在外部类以外,不能直接访问外部类中的私有成员内部类。

  2.可以在外部类中,定义一个访问私有成员内部类的公有方法,让外界可以调用公有方法,间接的访问外部类中的私有成员内部类。

代码示例:

 1 class Demo02_私有的成员内部类 {
 2     public static void main(String[] args) {
 3         Body b = new Body();
 4         //Body.Shen bs = b.new Shen();
 5         b.zouShen();
 6     }
 7 }
 8 
 9 class Body {
10     private double hight = 149.0;
11 
12     private class Shen {
13         int age = 40;
14 
15         public void show() {
16             System.out.println("该走心的时候别TM找我..." + hight + "..." + age);
17         }
18     }
19 
20     public void zouShen() {
21         Shen s = new Shen();
22         s.show();
23     }
24 }

 

 静态的成员内部类:

1.也是一个成员内部类,在成员内部类前加上一个static关键字。

2.访问特点:

  1.静态成员内部类是外部类的静态成员,所以可以通过外部类名.内部类名的方式直接访问,而不需要创建外部类的对象。

  2.静态内部类中的非静态成员,需要将所在的内部类对象创建出来以后,才能被调用。

  3.总结;一个类是否需要创建对象,不取决于该类是否是静态,而取决于要访问的成员是否静态。

3.静态成员内部类的对象创建格式:

  外部类名.内部类名 内部类对象名 = new 外部类名.内部类名();

代码示例:

 1 class Demo03_静态成员内部类 {
 2     public static void main(String[] args) {
 3         //System.out.println("Hello World!");
 4         Body.Gan bg = new Body.Gan();
 5         bg.show();
 6     }
 7 }
 8 
 9 class Body {
10     private double hight = 149.0;
11 
12     static class Gan {
13         String color = "black";
14 
15         public void show() {
16             Body b = new Body();
17             System.out.println(b.hight + "..." + color + "求你了哥,放过我吧别喝了");
18         }
19     }
20 
21     public static void test() {}
22 }

 

 局部内部类:

1.局部内部类:定义在方法中的内部类

2.局部内部类的访问说明:

方法中的局部变量,外部都没有办法访问到

3.解决办法:

在方法内部,创建局部内部类的对象,调用对象的方法。

外界调用局部内部类所在的方法,间接的创建局部内部类的对象,间接的访问局部内部类的方法

局部变量 必须final 才能被内部类引用

代码示例:

 1 class Demo04_局部内部类 {
 2     public static void main(String[] args) {
 3         //Fei f = new Fei();
 4         //通过调用breath方法,间接的访问局部内部类中的show方法
 5         breath();
 6     }
 7 
 8     public static void breath() {
 9         int f = 30;
10 
11         class Fei {
12             String color = "black";
13 
14             public void show() {
15                 System.out.println(f + "..." + color + "...饶了我吧受不了了太呛了");
16             }
17         }
18         //创建局部内部类对象
19         Fei fei = new Fei();
20         //调用局部内部类方法
21         fei.show();
22     }
23 }

 

 

匿名内部类:

没有名字的内部类

代码示例:

1 //new Car() 无参构造方法 
2         new Car(){
3             //重写父类drive方法 对象
4             public void drive(){
5                 System.out.println("anthor car is running ... ");
6             }
7         }.drive();

 

 1 class Demo05_匿名内部类 {
 2     public static void main(String[] args) {
 3         IPlayImpl ipi = new IPlayImpl();
 4         ipi.playGame();
 5 
 6         IPlay ip = new IPlay() {
 7             @Override
 8             public void playGame() {
 9                 System.out.println("wanyouxi");
10             }
11         };
12         ip.playGame();
13         ip.playGame();
14     }
15 }
16 
17 interface IPlay {
18     public abstract void playGame();
19 }
20 
21 class IPlayImpl implements IPlay {
22     @Override
23     public void playGame() {
24         System.out.println("玩游戏");
25     }
26 }

 包:命名:域名倒着写:com.baidu.map(全球唯一)

                  private     默认不写  protected   public
本类                  Y    Y   Y   Y
本包                  N    Y                   Y         Y  
子类                 N   N     Y   Y
其他        N   N      N   Y
posted @ 2019-03-28 17:30  ControllerMe  阅读(260)  评论(0编辑  收藏  举报