Java基础10---包内部类匿名内部类
Posted 冬有雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础10---包内部类匿名内部类相关的知识,希望对你有一定的参考价值。
一、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("匿名内部类");
;
以上是关于Java基础10---包内部类匿名内部类的主要内容,如果未能解决你的问题,请参考以下文章