内部类&包&权限修饰符
类中可以有平行类
一个文件中可以有多个并列关系的类
注意:一个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 |