该文章Github地址:https://github.com/AntonyCheng/java-notes
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
上一章:由浅到深认识Java语言(16):接口
27.内部类(内部类:类的第五成员)
内部类定义
面向对象的重点是类的设计,类的设计重点是设计类的成员;
内部类是类的第五大成员,由于类中有一些成员没有办法简单地通过一个属性或者一个方法就能完全描述;
比如一个人类,脑袋就能成为一个内部类:
class Person{
String name;
int age;
class brain{ //内部类
String n;
int a;
public(){};
}
}
内部类分类
- 成员内部类:普通成员内部类,静态成员内部类;
- 局部内部类:普通的局部内部类,匿名的局部内部类;
局部内部类
局部内部类是定义在方法内部的类;
局部内部类的应用场景:
往往一个方法需要返回一个抽象类或者接口的对象,对于我们来说有两种解决方案;
一是在类的外部定义一个抽象类的子类,或者接口的实现类,但是在类的外部定义的这个类只用了这一次,所以这样定义在外部会消耗更多的资源;
二是在类的内部定义一个内部类,此时这个类就是一个局部内部类;
接口:
正常写法:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
getMyInterface();
}
public static MyInterface getMyInterface() { //3.进行抽象类的创建
MyInterface mif = new MyInterfaceImpl(); //4.运用多态
mif.m1();
return mif;
}
}
interface MyInterface { //1.接口,也是一个极端的抽象类
void m1();
}
class MyInterfaceImpl implements MyInterface { //2.将接口转为普通类
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println(" 学校 ");
}
}
内部类写法:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
getMyInterface();
}
public static MyInterface getMyInterface() {
class MyInterfaceImpl implements MyInterface { //将外部类转为内部类
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println(" 学校 ");
}
}
MyInterface mif = new MyInterfaceImpl();
mif.m1();
return mif;
}
}
interface MyInterface {
void m1();
}
打印效果如下:
抽象类:
正常写法:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
Student();
}
public static Person Student() {
Person Stu = new Student();
Stu.show();
return Stu;
}
}
abstract class Person {
public abstract void show();
}
class Student extends Person {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Student.show()");
}
}
内部类写法:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
Student();
}
public static Person Student() {
class Student extends Person{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Student.show()");
}
}
Person Stu = new Student();
Stu.show();
return Stu;
}
}
abstract class Person{
public abstract void show();
}
打印效果如下:
匿名内部类
局部内部类的类名并不是很重要,可以直接简化,就有了下面的匿名内部类,这个就好似类与抽象类的关系,在匿名内部类中继承(实现)了父类;
基本格式:
//对象名 变量名 = new 对象名(){
// 方法的重写:
//}
//例如下:
Animal a = new Animal(){
public void show(){
}
}; //注意:!!!!这里有一个分号!!!!
abstract class Animal{
public abstract void show(){
}
}
将局部内部类的实例改写如下:
接口:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
MyInterfaceImpl();
}
public static MyInterface MyInterfaceImpl() {
MyInterface mif = new MyInterface() {
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println(" 学校 ");
}
};
mif.m1();
return mif;
}
}
interface MyInterface{
void m1();
}
打印效果如下:
抽象类:
package top.sharehome.Bag;
public class Demo {
public static void main(String[] args) {
Student();
}
public static Person Student () {
Person Stu = new Person() {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Student.show()");
}
};
Stu.show();
return Stu;
}
}
abstract class Person {
public abstract void show();
}
打印效果如下: