内部类
1.定义:在一个类中定义另一个类,那么则为内部类
2.内部类可以访问外部类的成员,包括私有
外部类想要访问内部类的成员,必须通过创建内部类的对象访问该内部类的成员
3.内部类的分类:
(1)成员内部类:在外部类的成员位置
(2)局部内部类:在外部类的局部位置定义的这个类
4.在测试类中访问成员内部类中成员方法的方式:
(1)访问成员内部类中的非静态方法:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
(2)访问静态成员内部类中的方法:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
(3)访问静态成员内部类中的静态方法:
外部类名.内部类名.方法名();
5.访问局部内部类的成员方法:
创建该局部内部类的对象,在测试类中创建外部类对象,调用方法访问
例:
//访问局部内部类成员方法例子
//外部类
class Outer{
//外部类的成员变量
private int num1 = 100 ;
//外部类的成员方法
public void method(){
//局部变量
final int num2 = 200 ; //自定义常量(用final修饰)
//局部位置
class Inner{
//局部内部类的成员方法
public void show(){
System.out.println(num1);
//局部内部类中访问局部变量
System.out.println(num2);
}
}
//访问局部内部类中的方法
Inner i = new Inner() ;
i.show() ;
}
}
//测试类
public class InnerDemo {
public static void main(String[] args) {
//需求:访问局部内部类中的show()方法;
Outer o = new Outer() ;
o.method();
}
}
6.成员变量修饰符:
(1)private:为了保证数据的安全性(内部类在用private修饰后外部无法访问)
(2)static:为了方便调用
注:若成员内部类被 “static” 关键字修饰时,若要访问外部类的成员变量,则外部类的成员变量也应用 “static” 修饰
7.局部内部类:
问题:局部内部类访问局部变量出现问题。
局部变量必须用 “final” 关键字修饰
由于局部变量是随着方法调用而生成的,随着方法的调用完毕消失,而现在局部位置有一个局部内部类它要在自己的成员方法位置访问当前的局部变量,必须把变量变成一个常量(需要用final:自定义常量),这样的一个变量的值永远是固定的
匿名内部类
1.含义:内部类的简化格式
2.前提:必须存在一个接口或者一个类(具体或抽象均可)
3.格式: new 接口名 / 类名(){
方法重写;
}
4.当在接口中存在多个方法时:
接口名 对象名 = new 接口名(){
方法重写;
};
对象名.方法名();访问
例1:
//接口
interface Inter{
//抽象功能
public abstract void show1() ;
public abstract void show2() ;
}
class Outer{
public void method(){
Inter i = new Inter(){
@Override
public void show1() {
System.out.println("show1");
}
@Override
public void show2() {
System.out.println("show2");
}
};
i.show1();
i.show2();
}
}
public class Test{
public static void main(String[] args){
Outer o = new Outer();
o.method();
}
}
5.匿名内部类的实质:
继承了该类(抽象类)或者是实现了该接口的子类对象
例2:使用匿名内部类
//接口(使用匿名内部类的前提)
interface Inter{
public abstract void study() ;
}
class StudentDemo{
public void method(Inter i){//形式参数是一个接口
i.study() ;
}
}
//测试类
public class Test {
public static void main(String[] args) {
//需求:调用StudentDemo中的method()方法
StudentDemo sd = new StudentDemo() ;
//使用匿名内部类访问
sd.method(new Inter(){
@Override
public void study() {
System.out.println("好好学习,天天向上");
}
}) ; //分号必不可少
}
}
随堂练习(面试题)
/*
例1:看程序,填空分别输出:30,20,10
*/
class Outer {
public int num = ;
class Inner {
public int num = ;
public void show() {
int num = ;
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer().num); //要访问外部类的成员变量:匿名对象 :new 外部类名().成员变量
//System.out.println(Outer.this.num); //外部类的this限定
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
//结果:num依次为10,20,30
/*
例2(匿名内部类):按照要求补全代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
*/
interface Inter{
public abstract void show();
}
class Outer{
public static Inter method(){
return new Inter(){
@Override
public void show(){
System.out.println("Hello World!");
}
}; //分号必不可少
}
}
public class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
}