一、package关键字
包的作用是将字节码(.class)进行分类存放 ,包其实就是文件夹。
1.注意事项
- package语句必须是程序的第一条可执行的代码
- package语句在一个java文件中只能有一个
- 如果没有package,默认表示无包名
2.带包类的编译运行
javac编译的时候带上-d即可
javac -d . HelloWorld.java
通过java命令执行。
java 包名.HellWord
package cn.ds93;
import xyz.junshuai.*;
public class Programer {
public static void main(String[] args) {
Translator t = new Translator("HouHou","nv");
System.out.println(t.getName() + " is " + t.getSex());
}
}
package xyz.junshuai;
public class Translator {
private String name;
private String sex;
public Translator(){ }
public Translator(String name,String sex) {
this.name = name;
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
}
二、四种权限修饰符
权限修饰符 | 本类 | 同一个包下(子类和无关类) | 不同包下(子类) | 不同包下(无关类) |
---|---|---|---|---|
private | Y | |||
默认 | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
1.类及其组成所使用的常见修饰符
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 抽象修饰符:abstract
2.关于类的修饰符
- 权限修饰符:默认修饰符,public
- 状态修饰符:final
- 抽象修饰符:abstract
- 用的最多的就是:public
3.关于成员变量的修饰符
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 用的最多的就是:private
4.关于构造方法的修饰符
权限修饰符:private,默认的,protected,public
用的最多的就是:public
5.关于成员方法的修饰符
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
抽象修饰符:abstract
用的最多的就是:public
6.除此以外的组合规则
- 成员变量:public static final
- 成员方法:
- public static
- public abstract
- public final
三、内部类
1.内部类访问特点
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员,必须创建对象。
- 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
2.静态成员内部类
- 用static修饰
- 成员内部类被静态修饰后的访问方式是:
- 外部类名.内部类名 对象名 = 外部类名.内部类对象;
来个面试题:
class InnerClass {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.print();
}
}
class Outer {
public int dong = 100;
class Inner {
public int shuai = 200;
public void print() {
int hou = 300;
System.out.print(hou + "\n");
System.out.print(this.shuai + "\n");
System.out.print(Outer.this.dong + "\n");
}
}
}
3.局部内部类访问局部变量的问题
- 局部内部类访问局部变量必须用final修饰
- 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用。但是jdk1.8取消了这个事情,老师认为这是个bug。
四、匿名内部类
1.匿名内部类就是内部类的简化写法。
2.前提:存在一个类或者接口
- 这里的类可以是具体类也可以是抽象类。
3.格式
new 类名或者接口名(){
重写方法;
}
4.本质
是一个继承了该类或者实现了该接口的子类匿名对象。
举个例子(面试题,补齐Outer类中的代码):
interface HouHou {
public void english();
}
class Outer {
class Inner implements HouHou {
public void english() {
// System.out.println();
}
}
public void print() {
new Inner() {
public void english() {
System.out.println("Shanghai Haishi University");
}
}.english();
}
}
public class AnonymousInnerClass {
public static void main(String[] args) {
new Outer().print();
}
}
5.匿名内部类,只在重写一个方法时用
interface Inter {
public void dong();
public void shuai();
}
class Outer {
public void hou() {
new Inter() { //匿名内部类,只在重写一个方法时用
public void dong(){
System.out.println("lijun");
}
public void shuai(){
System.out.println("lijun2");
}
}.dong();
new Inter() {
public void dong(){
System.out.println("lijun");
}
public void shuai(){
System.out.println("lijun2");
}
}.shuai();
}
}
public class AnonymousInner {
public static void main(String[] args) {
new Outer().hou();
}
}
6.匿名内部类在开发中的应用
//匿名内部类在开发中的应用
//本例为有名类,作为对比
public class AnonymousInner2 {
public static void main(String[] args) {
Caomin c = new Caomin();
c.bitter(new Employee());
}
}
abstract interface Employer {
public abstract void exploit();
}
class Employee implements Employer {
public void exploit() {
System.out.println("哪里有压迫,哪里就有反抗。");
}
}
class Caomin {
public void bitter(Employee e) {
e.exploit();
}
}
//匿名内部类在开发中的应用
//本例为匿名内部类
public class AnonyInnerDevelop {
public static void main(String[] args) {
Caomin c = new Caomin();
c.bitter(new Employee() { //匿名内部类,编译看左边,运行看右边
public void exploit() {
System.out.println("哪里有压迫,哪里就有反抗。");
}
});
}
}
abstract interface Employer {
public abstract void exploit();
}
class Employee implements Employer {
public void exploit() {
//System.out.println("哪里有压迫,哪里就有反抗。");
}
}
class Caomin {
public void bitter(Employee e) {
e.exploit();
}
}
再来一个面试题
//匿名内部类的面试题
public class AnonyInnerInterview {
public static void main(String[] args) {
Outer.dong().shuai(); //链式编程,每次调用方法后还能调用方法,第一次调用方法返回的是对象
}
}
interface Inter {
void shuai();
}
class Outer {
public static Inter dong() {
return new Inter() { //返回实现的接口(子类对象)
public void shuai() {
System.out.print("匿名内部类");
}
};
}
}