//包名采用全部小写字母
* 包的特点:
* 可以有多层
* 不同包下的文件名可以重复
* 包的声明必须是第一行代码
* 不同包之间的互相访问
* 使用类的全名
* 使用关键字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 }