1.权限修饰符的权限问题
分别阐述一下四个权限修饰符在不同情况下的访问权限问题?
private(私有的):只能在同一个包下的本类中使用
默认修饰符:只能在同一个包下的本类和子类中使用
piotected(受保护的):可以再同一个包下的本类和子类中,也可以在不同包下的子类中
public(公共的,访问权限最大):在相同包中和不同包中都可以使用
2.包中的编译运行
描述下在同一个包下和在包下针对Java源文件进行编译和运行的过程
在同一个包下:
手动:
1)先进入到xxx.java文件所在的目录中,使用javac对java源文件进行编译,会产生xxx.class文件
2)手动方式创建对应包目录,
3)将1)编译后的 xxx.class文件放在2)中的子文件夹中
4)运行(带上包运行)
自动:
1)针对源文件进行编译,javac -d(跟上参数).java源文件,将class文件存储到指定的包下
2)直接运行即可,java 包名.类名
在不同包下:
1)将当前被导入的类进行编译
2)进入到当前目录下
3)直接运行java包名.类名
3.形式参数与返回值是引用类型
形式参数如果是具体类,抽象类,以及接口类型,实际参数如何传递
形式参数是具体类:实际参数需要传递具体类的对象
形式参数是抽象类:实际参数需要传递该抽象类的具体实现子类对象
形式参数是接口:实际参数需要传递接口类具体子实现类对象
返回值是具体类,抽象类,以及接口类型,该方法如何返回?
返回值是具体类:需要返回该具体类对象
返回值是抽象类:需要返回该抽象类的具体实现子类对象
返回值是接口:需要返回该接口的具体子实现类对象
4.内部类问题
访问的方式:
内部类的成员直接可以访问外部类的成员包括私有!
外部类的成员向访问成员内部类的成员的时候,不能直接访问,而要通过内部类对象访问
想访问外部类中的成员内部类的成员方法的访问方式:
固定格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
成员内部类中的修饰符:
private:保证的数据安全性
static修饰: 有什么特点?
将静态的成员内部类看成是外部类的静态成员!
静态的成员内部类的成员方法(静态的还是非静态),只能访问外部类的静态成员!
如果成员内部类是一个静态的,通过外部类访问静态的成员内部类的成员方法,访问方式:
外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
静态的内部成员类:
外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
5.内部类的另一种形式
内部类另一种形式:
局部内部类:在局部位置中定义的类
局部内部类的成员可以直接访问外部类的成员,包括私有
外部类成员方法如何访问局部内部类的成员?
在当前外部类的成员方法中,只需要创建内部类对象调用它的方法
6.面试题
局部内部类访问局部变量的时候,为什么JDK7(JDK7以前,包含JDK7版本)将局部变量使用final修饰?
JDK8版本已经局部变量做了优化(已经定义了final修饰)
局部变量的生命周期:随着方法调用而存在,随着方法调用完毕而消失,
由于当前局部内部类中的成员方法还在使用局部变量,间接通过了外部类的成员方法中创建内部类对象
访问内部类的成员方法---访问局部变量,对象不会立即被回收,需要等待GC空闲时候回收,内部类的成员方法
还在访问,需要将当前局部变量定义为常量---内存中固定值!
7.匿名内部类
匿名内部类:
它是内部类的一种简化格式
没有具体类名
格式:
new 类名(抽象类类名)/接口名(){
重写方法....
};
举例:
new Person(){
public void love() {
...
}
} ;
匿名内部类的本质:
就是继承该抽象类或者实现了该接口的子类对象!