版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37129433/article/details/87937264
文章目录
package关键字的概述及作用
为什么要有包?
- 将字节码(.class)进行分类存放
- 包其实就是文件夹
包的定义及其注意事项:
包的格式,package 包名;多级包用.分开
package语句必须是程序的第一条可执行的代码,package语句在一个java文件中只能有一个,如果没有package,默认表示无包名。
那么如何编译和运行带包的类呢?javac -d 类命.java即可。
运行。 java 包名.类名 即可。不同包之间的访问。直接用Import导入相应的类即可。
import关键字的概述和使用
为什么要有import?其实就是让有包的类对调用者可见,不用写全类名了
import 包名;
面试题
package,import,class有没有顺序关系?有,一般来说package在第一句。Import 在package后面 class在import 后面。
四种权限修饰符
本类 | 同一个包下子类和无关类 | 不同包下子类 | 不同包下(无关类) | |
---|---|---|---|---|
private | 可以 | |||
默认 | 可以 | 可以 | – | – |
protected | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
类的修饰符
- 权限修饰符:默认修饰符,public
- 状态修饰符:final
- 抽象修饰符:abstract
- 用的最多的就是:public
成员变量修饰符:
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 用的最多的就是:private
构造方法:
- 权限修饰符:private,默认的,protected,public
- 用的最多的就是:public
成员方法:
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 抽象修饰符:abstract
- 用的最多的就是:public
除此以外的组合规则:
- 成员变量:public static final 接口
- 成员方法:public static,public abstract,public final。
内部类概述和访问特点
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员,必须创建内部类对象。
- 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inter lala = new Outer().new Inter()
静态成员内部类
就算内部类是用static修饰的类。
外部类名.内部类名 对象名 = 外部类名.内部类对象;
Outer.Inter lala = new Outer.Inter();
面试题
要求:使用已知的变量,在控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
内部类之所以能获取外部类的成员是因为内部类可以获取外部类的引用。Outer.this。
局部内部类访问局部变量的问题
- 局部内部类访问局部变量必须用final修饰
- 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug,虽然取消,如果在书写代码时候,没有手动添加,系统底层也会默给你final。
匿名内部类的格式和理解
匿名内部类其实就是类的简化写法。前提存在一个类(具体类或者抽象类都行),或者接口。
格式:
new 类名或者接口名(){
重写方法;
}
如果内部类是抽象方法的话,那么必须重写所有的抽象方法。如果是接口的话,必须重写接口中所有的方法。
本质其实就是继承了该类或者实现了该接口的子类匿名对象。
匿名内部类重写多个方法调用
匿名内部类值针对一个方法的时候使用,超过一个方法的时候就不用。太麻烦了。
package com.lzj;
interface Inter{
abstract public void print();
abstract public void print1();
}
class Demo2 {
public void show() {
new Inter() {
public void print() {
System.out.println("lala");
}
public void print1() {
System.out.println("lala");
}
}.print();
new Inter() {
public void print() {
System.out.println("lala");
}
public void print1() {
System.out.println("lala");
}
}.print1();
}
}
public class Demo1 {
public static void main(String[] args) {
Demo2 zDemo2 = new Demo2();
zDemo2.show();
}
}
面试题
按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
package com.lzj;
interface Inter { public abstract void show(); }
class Outer {
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("hello");
}
};
}
}
public class Demo1 {
public static void main(String[] args) {
Outer.method().show();
}
}