内部类(调用某些框架会用到,使用场景较少)

  1. public class Outer {
  2. public class InnerTool { // 内部类
  3. public int add(int a,int b){
  4. return a+b;
  5. }
  6. }
  7. }

创建在一个类的类部,Outer称为外部类,InnerTool 称为内部类。

内部类实例化

调用内部类,实例化要在Outer内完成

  1. public class OuterUtil {
  2. public class InnerTool { // 内部类
  3. public int add(int a,int b){
  4. return a+b;
  5. }
  6. }
  7. private InnerTool tool = new InnerTool();
  8. }
  1. public class OuterUtil {
  2. public class InnerTool { // 内部类
  3. public int add(int a,int b){
  4. return a+b;
  5. }
  6. }
  7. private InnerTool tool = new InnerTool();
  8. public int add(int a,int b,int c){
  9. return tool.add( tool.add(a,b) , c );
  10. }
  11. }

其他类访问实例内部类
必须先实例外部类,一般情况下,不建议在外面直接调用内部类

  1. OuterUtil.InnerTool tool = new OuterUtil().new InnerTool();

实例内部类还有一个约束,就是不能有静态变量

静态内部类

  1. public class OuterUtil {
  2. public static class InnerTool { // 内部类
  3. public int add(int a,int b){
  4. return a+b;
  5. }
  6. }
  7. }

直接调用不需要实例化外部类

  1. import com.youkeda.util.OuterUtil;
  2. // 静态内部类是需要单独 import 的
  3. import com.youkeda.util.OuterUtil.InnerTool;
  4. public class OuterUtilTest {
  5. public static void main(String[] args){
  6. InnerTool tool = new InnerTool();
  7. int sum = tool.add(1,2);
  8. System.out.println(sum);
  9. }
  10. }

布局内部类(很少见)

  1. public class Tester {
  2. public void test(){
  3. class B{
  4. int a;
  5. }
  6. B b = new B();
  7. }
  8. }

匿名类(日常使用较多,特别是多线程)

  1. public class ATest {
  2. public static void main(String[] args){
  3. A a = new A(){
  4. public void method(){
  5. System.out.println("执行内部类");
  6. }
  7. };
  8. a.method();
  9. }
  10. }

A a = new A(){ }语法,其实匿名类的效果如下面的类

  1. public class AImpl implements A{
  2. public void method(){
  3. System.out.println("执行类");
  4. }
  5. }

除了实现接口还可以是继承父类

  1. public class Sub {
  2. public void print(){
  3. }
  4. }
  5. public class SubTest {
  6. public static void main(String[] args){
  7. Sub sub = new Sub(){
  8. public void print(){
  9. System.out.println("执行内部类");
  10. }
  11. };
  12. sub.print();
  13. }
  14. }

这个匿名类相当于

  1. public class SubNode extends Sub {
  2. public void print(){
  3. System.out.println("执行");
  4. }
  5. }

抽象类(建议用接口代替抽象类)

抽象类首先是一个父类,然后他的实例化必须要是有子类就像接口必须通过实现类才能实例化一样

  1. // 定义一个武器的抽象类
  2. public abstract class Weapon{
  3. // 抽象方法:攻击
  4. public abstract void attack();
  5. }

关键字 abstract
声明抽象类后,他的子类必须要实现抽象方法,

  1. public class GoldenBar extends Weapon {
  2. public void attack(){
  3. System.out.println("使用金箍棒进行劈一棍");
  4. }
  5. }

接口的默认方法

  1. public interface Vehicle {
  2. default void print(){
  3. System.out.println("我是一辆车!");
  4. }
  5. }

覆盖接口默认方法

  1. public class Car implements Vehicle {
  2. public void print(){
  3. System.out.println("我是一辆汽车!");
  4. }
  5. }

不覆盖

  1. public class Car implements Vehicle {
  2. }