一、内部类
1.1、内部类概念
就是将一个类定义在另一个类的内部,内部的类简称内部类
public class Outer{
class Inner{
}
}
1.2、内部类特点
内部类可以很好的实现隐藏,可以使用protected private修饰符
内部类可以直接访问外部类的所有成员,包括私有的成员
外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问
//外部类访问内部类
void visitInner(){
Inner ii = new Inner();
ii.data = 90;
System.out.println("内部类的data=" + ii.data);
}
//主函数
Outter o = new Outter();
o.visitInner();
/*
内部类的data=90
*/
//外部类访问内部类,外部类
void initInner(int data){
iii = new Inner();
iii.data = data;
}
void visitInner(){
System.out.println("内部类的data=" + iii.data);
}
Inner iii;
//主函数
Outter o = new Outter();
o.initInner(30);
o.visitInner();
1.3、成员内部类及应用
成员内部类属于外部类的实例成员,成员内部类可以有public private default protected权限修饰符。在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式
创建成员内部类的实例使用“外部类名.内部类名 实例 = 外部类实例名.new 内部类构造方法(参数)”的形式
class Outter{
int data;
public void Outprint(){
System.out.println("外部类");
}
class Inner{
int data;
void Innerprint(){
System.out.println("内部类");
//内部类访问外部类,外部类名.this.成员方法”和“外部类名.this.成员属性
Outter.this.Outprint();
System.out.println("外部类data=" + Outter.this.data);
}
}
}
public class Test {
public static void main(String[] args) {
//实例化内部类,外部类名.内部类名 实例 = 外部类实例名.new 内部类构造方法(参数)
Outter o = new Outter();
o.data = 110;
Outter.Inner i = o.new Inner();
i.Innerprint(); //使用内部类方法
}
}
/*
内部类
外部类
外部类data=110
*/
二、匿名内部类
通常用在:线程、安卓按键响应
匿名内部类是没有名称的内部类,没办法引用它们。必须在创建时,作为new语句的一部分来声明并创建它们的实例
匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口,所有父类(或父接口)是抽象类,则匿名内部类必须实现其所有抽象方法
语法:实例
newinterface/superclass(){类体}
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例
三、代码演示
内部类完整代码
class Outter{
int data;
public void Outprint(){
System.out.println("外部类");
}
void initInner(int data){
iii = new Inner();
iii.data = data;
}
void visitInner(){
// Inner ii = new Inner();
// ii.data = 90;
System.out.println("内部类的data=" + iii.data);
}
class Inner{
int data;
void Innerprint(){
System.out.println("内部类");
//内部类访问外部类,外部类名.this.成员方法”和“外部类名.this.成员属性
Outter.this.Outprint();
System.out.println("外部类data=" + Outter.this.data);
}
}
Inner iii;
}
public class Test {
public static void main(String[] args) {
//实例化内部类,外部类名.内部类名 实例 = 外部类实例名.new 内部类构造方法(参数)
Outter o = new Outter();
o.initInner(30);
o.visitInner();
o.data = 110;
Outter.Inner i = o.new Inner();
i.Innerprint(); //使用内部类方法
}
}
/*
内部类的data=30
内部类
外部类
外部类data=110
*/
匿名内部类完整代码
abstract class Demo1{
abstract void printInfo();
}
interface Demo2{
abstract void interprint();
}
public class Test {
public static void main(String[] args) {
new Demo1(){
void printInfo() {
// TODO Auto-generated method stub
System.out.println("这不是demo1,而是匿名内部类的方法");
}
}.printInfo(); //可以直接.使用,或者使用多态的用法
//多态用法
Demo1 d = new Demo1(){
void printInfo() {
// TODO Auto-generated method stub
System.out.println("这不是demo1,而是匿名内部类的方法");
}
};
d.printInfo();
new Demo2(){
public void interprint() {
// TODO Auto-generated method stub
System.out.println("这不是接口的实例,而是匿名内部类的方法");
}
}.interprint();
}
}
/*
这不是demo1,而是匿名内部类的方法
这不是demo1,而是匿名内部类的方法
这不是接口的实例,而是匿名内部类的方法
*/