1.内部类定义
在 Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
2.成员内部类
定义在类中,充当类的一个成员。
访问权限:内部类可以访问外部类的属性和方法,外部类想要访问内部类的成员必须先创建内部类的对象来访问。 创建对象:new Demo01().new Demo02()
package case01;
public class Demo01 {//外部类
int a=1;//成员属性
public void show(){
System.out.println("外部类的show方法");
}
public static void main(String[] args){
System.out.println(new Demo01().new Demo02().a);//调用内部类的属性
new Demo01().new Demo02().show();//调用内部类的方法
}
//成员内部类
public class Demo02{//内部类中不能有主方法
int a=2;
public void show(){
System.out.println("内部类的show方法");
System.out.println(new Demo01().a);//调用外部类的成员属性
new Demo01().show();//调用外部类的的方法
}
}
}
3.局部内部类
定义在方法中,充当方法的一个变量,注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private 以及 static 修饰符的。
package case01;
public class Demo05 {
int a=3;
static int b=99;
public static void main(String[] args) {
new Demo05().show();//调用拥有局部内部类的方法
}
public void show(){
int a=5;
class Inner1{//局部内部类
int a=6;
public void show1(){
//内 调 外
System.out.println(a);
System.out.println(new Demo05().a);
System.out.println(Demo05.b);
System.out.println("内部类的show");
}
}
new Inner1().show1();//调用局部内部类
}
}
4.匿名内部类
匿名内部类,通常作为方法传参时使用,用于继承抽象类或实现接口,代替子类或实现类,并不需要额外定义方法。Jdk8开始可以使用Lambda表达式进行简化。
例子: ()-> System.out.println(“拍照”)
要求:接口中只有一个方法,同时如果有多行返回值需要{}
案例:
需求说明:原始的手机,可以发短信,通电话。随着发展,手机增加了音频、视频播放、拍照、上网功能。按照下面的类图进行程序设计:首先,编写类及接口,参照以下类的结构图;其次,编写测试类,让普通手机播放音频、发信息和通电话,让智能手机上网、播放视频、照相、发彩信和视频通电话。
Handsets.java代码:
package take04;
public abstract class Handset {
//功能接口作为属性
private Play play;
private Network network;
private TakePicture takePicture;
//普通属性
private String brand;
private String type;
//抽象方法
public abstract void sendInfo();
public abstract void call();
//实例info方法
public void info(){
System.out.println(brand+"-------"+type);
}
//封装get,set
public Play getPlay() {
return play;
}
public void setPlay(Play play) {
this.play = play;
}
public Network getNetwork() {
return network;
}
public void setNetwork(Network network) {
this.network = network;
}
public TakePicture getTakePicture() {
return takePicture;
}
public void setTakePicture(TakePicture takePicture) {
this.takePicture = takePicture;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
接口Network.java代码:
package take04;
public interface Network {
public abstract void netWort();
}
接口Play.java代码:
package take04;
public interface Play {
public abstract void play(String content);
}
接口TakePicture.java代码:
package take04;
public interface TakePicture {
public abstract void takePicture();
}
测试类TestHandset.java代码:
package take04;
public class TestHandset {
public static void main(String [] args){
//1.构造普通手机
Handset h1=new Handset() {
public void sendInfo() { System.out.println("文字信息"); }
public void call() { System.out.println("语音电话"); }
};
//2.属性赋值
h1.setPlay((String content)->System.out.println("播放音乐"+content));
h1.setBrand("索尼");
h1.setType("G502c");
//3.测试输出
h1.info();
h1.getPlay().play("心墙");
h1.sendInfo();
h1.call();
//1.智能手机
h1=new Handset() {
public void sendInfo() { System.out.println("图片和文字信息"); }
public void call() { System.out.println("视频通话"); }
};
//2.属性赋值
h1.setNetwork(()-> System.out.println("连上5G网络"));
h1.setPlay((String content)-> System.out.println("正在播放视频"+content));
h1.setTakePicture(()-> System.out.println("拍照"));
h1.setBrand("I9100");
h1.setType("HTC");
//3.测试输出
h1.info();
h1.getNetwork().netWort();
h1.getPlay().play("小时代");
h1.getTakePicture().takePicture();
h1.sendInfo();
h1.call();
}
}
5.静态内部类
静态内部类可以理解为类的一个静态成员。 静态内部类不需要依赖于外部类的对象,可以直接创建自己的对象。不能访问外部类的非static成员属性或方法,因为静态内部类不依赖外部对象,就可以自己创建对象,所以如果没有外部对象,就调用外部的实例成员,就产生了矛盾,因为外部的实例成员必须要有外部对象。
package case01;
public class Demo03 {
int a=0;
static int b=10;
public void show1(){
System.out.println("外部类实例方法");
}
static public void show2(){
System.out.println("外部类静态方法");
}
public static void main(String [] args){
System.out.println(new Demo04().a1);//调用内部类的实例属性
System.out.println(Demo04.b1);//调用内部类的静态属性
new Demo04().show3();//调用内部类的实例方法
Demo04.show4();//调用内部类的静态方法
System.out.println("-----------------------------------------------");
System.out.println(new Demo03().a);//调用外部类的实例属性
System.out.println(b);//调用外部类的静态属性
new Demo03().show1();//调用外部类的实例方法
show2();//调用外部类的静态方法
}
static public class Demo04{//静态内部类
int a1=120;
static int b1=56;
public void show3(){
System.out.println("内部类的实例方法");
}
static public void show4(){
System.out.println("内部类的静态方法");
}
public static void main(String [] args){
System.out.println(new Demo03().a);//调用外部类的实例属性
System.out.println(Demo03.b);//调用外部类的静态属性
new Demo03().show1();//调用外部类的实例方法
Demo03.show2();//调用外部类的静态方法
System.out.println(new Demo04().a1);//调用内部类实例属性
System.out.println(Demo04.b1);//调用内部类静态属性
new Demo04().show3();//调用内部类实例方法
Demo04.show4();//调用内部类静态属性
}
}
}