java内部类讲解
一、内部类
1、定义
在一个类中,定义另外一个类的代码结构,通常定义在类内部的类称为“内部类”,外面的类称为“外部类”,在逻辑关系上内部类与外部类是从属关系,比如:一个People类存在收货地址(收货人,收货联系方法)
2、分类
2.1、普通内部类
(inner class) 一个类A中定义另外一个类B,其中类B就是类A的内部类,也是类A的一部分
public class People {
private String pname="小朱";
public void sayhello(){
System.out.println("let us say hello");
//知识点1:外部类的方法中,可以使用内部类的属性,方法
new Address().addressName="武汉";
new Address().contentName="小胡";
new Address().showAddressInfo();
}
/**
* 定义普通内部类 收货地址
*/
class Address{
private String addressName;//收货地址
private String contentName;//联系人
public void showAddressInfo(){
System.out.println("联系人:" + contentName + "收货地址:" + addressName);
//内部类的方法 可以直接访问外部类的属性
//由于通常情况访问类的属性都必须创建对象才能使用
System.out.println("访问外部类的属性:" + pname);
}
}
}
//使用
//1.创建内部类的对象 必须依赖外部类的创建
People people=new People();
//创建内部类
People.Address address=people.new Address();
//注意 这里的address对象不能访问 私有属性,方法
address.showAddressInfo();
注意两点
- 外部类的方法中,可以直接访问内部类的所有成员(包括私有)
- 外部类的方法中,也可以直接访问外部类的所有成员,当外部类和内部类都有同样的属性
2.2、静态内部类
在普通内部类基础上,增加static关键字,与静态方法类似,满足静态的要求
/**
* 定义静态内部类
*/
static class Card{
private static String cardNo="422202199809302439";
private String cardName="身份证";
//静态方法
public static void showCard(){
System.out.println("身份证号:"+cardNo);
} //非静态方法
public void showCard2(){
System.out.println("身份证:"+cardName);
}
}
//使用
//2、创建静态内部类的对象
People.Card.showCard();
//创建静态内部类的对象
People.Card card=new People.Card();
card.showCard2();
2.3、方法内部类
在一个方法中定义的类,其中这个类只属于该方法,也只能在该方法中使用
/**
* 方法内部类(在一个方法中定义一个类)
*/
public void method1(){
int score =90;
class MyClass{
String subject="java";
public void method2(){
System.out.println(pname + subject + "科目的分数:" + score);
}
}
//调用方法里面的类
MyClass mycls = new MyClass();
mycls.method2();
}
//调用
//调用方法内部类
people.method1();
2.4、匿名内部类
定义一个没有类名,只有对方法的具体实现,通常它依赖于实现关系(接口)或继承关系(父类)
基于接口
public interface MyInterface {
public void study();
public void work();
}
//测试
//通常实现接口对象的方法
Student student=new Student("小朱");
student.study();
student.work();
//匿名类实现接口
MyInterface myInterface=new MyInterface() {
@Override
public void study() {
System.out.println("这个人也好好学习");
}
@Override
public void work() {
System.out.println("这个人也好好工作");
}
};
myInterface.study();
myInterface.work();
基于继承关系
public class MyClass {
public void service(){
System.out.println("提供服务的方法。");
}
}
//测试
public class MyClass {
public void service(){
System.out.println("提供服务的方法。");
}
}