公共接口
1、Contents.java
package com.lh.innerclass.class3;
public interface Contents {
int value();
}
2、Destination.java
package com.lh.innerclass.class3;
public interface Destination {
String readLabel();
}
一、方法中的内部类
package com.lh.innerclass.class3;
/****
*
* 在方法体内部定义内部类
*
* @author Liu
*
*/
public class Parcel {
public Destination destination(String s){
class PDestination implements Destination{
private String label;
private PDestination(String whereTo){
this.label = whereTo;
}
public String readLabel(){
return this.label;
}
}
return new PDestination(s);
}
public static void main(String[] args) {
Parcel parcel = new Parcel();
Destination destination = parcel.destination("Tasmania");
System.out.println(destination.readLabel());
}
}
二、作用域(if语句)内的内部类
package com.lh.innerclass.class3;
/***
*
* 在if作用域中定义内部类
*
* @author Liu
*
*/
public class Parcel2 {
private void internalTracking(boolean b,String s){
if(b){
class TrackingSlip{
private String id;
private TrackingSlip(String id) {
this.id = id;
}
String getSlip(){
return this.id;
}
}
TrackingSlip trackingSlip = new TrackingSlip(s);
System.out.println(trackingSlip.getSlip());
}
}
public void track(String s){
internalTracking(true,s);
}
//客户端完全不知道有内部类的创建
public static void main(String[] args) {
new Parcel2().track("hello");
}
}
三、匿名内部类(实现接口)
package com.lh.innerclass.class3;
/***
*
* 使用匿名内部类
*
* @author Liu
*
*/
public class Parcel3 {
public Contents contents(){
return new Contents() {
private int value = 11;
//不仅仅是一个接口,还可以是一个抽象类,甚至是一个实现类,只是均需覆盖其中的方法
public int value() {
return this.value;
}
};
}
public static void main(String[] args) {
System.out.println(new Parcel3().contents().value());
}
}
四、匿名内部类(具体的实现类)
1、Wrapping.java
package com.lh.innerclass.class3;
/***
*
* 一个具体的实现类
*
* @author Liu
*
*/
public class Wrapping {
private int i;
public Wrapping() {
}
public Wrapping(int i) {
this.i = i;
}
//这里进行了改动
public int getI() {
return i * 10;
}
public void setI(int i) {
this.i = i;
}
}
2、Parcel4.java
package com.lh.innerclass.class3;
/***
*
* 覆盖一个具体实现类的例子
*
* @author Liu
*
*/
public class Parcel4 {
public Wrapping wrapping(int x) {
//Wrapping是一个具体的实现类
return new Wrapping(x) {
@Override
public int getI() {
return super.getI() * 5;
}
};
}
public static void main(String[] args) {
System.out.println(new Parcel4().wrapping(10).getI());
}
}
五、在匿名内部类中添加实现类的构造方法
package com.lh.innerclass.class3;
/****
*
* 如何在匿名内部类中添加实现类的构造方法的代码
*
* @author Liu
*
*/
public class AnonymousConstructor {
static abstract class Base {
private int i;
private Base(int i) {
this.i = i;
System.out.println("Base's Constructor: " + i);
}
public int getI() {
return i;
}
abstract void f();
}
public static Base getBase(int x){
//x传递给了父类的构造器
return new Base(x){
//使用{}添加子类构造器代码
{
System.out.println("调用子类的构造方法...");
}
@Override
void f() {
System.out.println("实现了的方法...");
}
};
}
public static void main(String[] args) {
AnonymousConstructor.getBase(10).f();
}
}