内部类,抽象类

内部类
plus:在某个类里面****创建的新类,而不是引用外部已经创建的类并将其作为成员属性
分类:

  • 1.成员内部类
    1)静态 在main中 实例化内部类的 因为是静态类随着外部类的加载而加载故可直接new 而不需要实例化外部类
    person.mind =new person.mind();
    2)非静态 先实例化person才能出现非静态的内部类 person p=new person(); p.mind mind=p.new mind();
    重名属性的调用: 参数列表直接 name 当前类(内部类) this.name 外部类的 person.this.name
  • 2.局部内部类
  • 1)构造器,代码块,成员函数内
  •  局部内部类所在的方法内,若定义了这个方法内的局部变量,内部类可以用但是不能修改
    

抽象类

  • 理解:为其它的有具体作用的类相当于搭建一个骨架或提纲,因此不可以投入实际的使用(抽象类自身不能实例化)
  • abstract class …{ } 虽然不可实例化,但是具有构造器以便于子类实例化

抽象方法

  • 只有方法头(加上分号),无方法体 public abstract void show();
  • abstract (意味着只有重写后这个方法才可用)方法 所以 不可修饰 静态,final,私有 这些都代表不可重写的属性
<think>我们正在讨论内部类抽象类的区别。首先,内部类(Inner Class)是定义在另一个类内部的类,而抽象类(Abstract Class)是一种不能被实例化,只能被继承的类。它们属于不同的概念范畴。 内部类的主要特点: 1. 可以访问外部类的所有成员(包括私有成员)。 2. 分为四种:成员内部类、静态嵌套类、局部内部类和匿名内部类。 3. 主要用于逻辑分组,提高封装性,或者用于事件监听等场景。 抽象类的主要特点: 1. 用abstract关键字修饰,可以包含抽象方法(没有实现的方法)和具体方法。 2. 不能直接实例化,必须由子类继承并实现所有抽象方法(除非子类也是抽象类)。 3. 可以包含构造方法、成员变量、非抽象方法等。 区别如下: 1. **定义位置**: - 内部类:定义在另一个类的内部。 - 抽象类:可以独立定义,也可以作为内部类(即抽象内部类)。 2. **功能目的**: - 内部类:主要用于增强封装性,将逻辑上相关的类组织在一起,或访问外部类的私有成员。 - 抽象类:主要用于定义一种模板或部分实现,要求子类完成具体实现。 3. **实例化**: - 内部类:可以直接实例化(但需要先有外部类实例,静态内部类除外)。 - 抽象类:不能直接实例化,只能通过子类实例化。 4. **与外部类关系**: - 内部类(非静态)持有外部类的引用,可以访问外部类的所有成员。 - 抽象类与外部类没有这种隐含的引用关系,除非它被定义为内部类。 5. **包含成员**: - 内部类:可以是任意类(普通类、抽象类、接口等)。 - 抽象类:可以包含抽象方法和非抽象方法,以及成员变量。 示例代码: 内部类的使用: ```java public class Outer { private int outerField = 10; // 成员内部类 class Inner { void display() { System.out.println("Accessing outer field: " + outerField); } } // 静态嵌套类 static class StaticNested { void show() { System.out.println("This is a static nested class"); } } } ``` 抽象类的使用: ```java public abstract class Animal { private String name; public Animal(String name) { this.name = name; } // 抽象方法 public abstract void makeSound(); // 具体方法 public void sleep() { System.out.println(name + " is sleeping"); } } public class Dog extends Animal { public Dog(String name) { super(name); } @Override public void makeSound() { System.out.println("Woof!"); } } ``` 注意:抽象类也可以作为内部类,即在一个类内部定义一个抽象内部类。 总结: 内部类是一种类的嵌套结构,抽象类是一种类的类型(不能实例化,需要子类实现)。两者不是互斥的概念:一个内部类可以是抽象类抽象内部类),同样,抽象类也可以包含内部类。 因此,区别主要在于它们的定义位置、用途和特性。 现在,根据要求,在回答末尾提出3-5个相关问题。</think>### 内部类抽象类的核心区别 #### 1. **本质定义不同** | **特性** | **内部类** | **抽象类** | |----------------|-------------------------------------|---------------------------------| | **本质** | 嵌套在其他类内部的类 | 用`abstract`修饰的类 | | **存在形式** | 必须依附于外部类 | 可独立存在 | | **实例化** | 需通过外部类实例创建 | 不能直接实例化,需子类继承实现 | **示例代码**: ```java // 抽象类 abstract class Animal { abstract void makeSound(); } // 外部类 class Zoo { // 内部类 class Enclosure { void maintain() { System.out.println("维护动物围栏"); } } } ``` --- #### 2. **功能定位差异** **内部类的核心作用**: ```java class Computer { private String model = "X-1000"; // 成员内部类:访问外部类私有成员 class CPU { void showModel() { System.out.println("CPU所属电脑型号: " + model); } } // 静态内部类:不依赖外部实例 static class RAM { static void check() { System.out.println("内存自检中..."); } } // 局部内部类:方法内定义 void repair() { class Tool { void fix() { System.out.println("维修工具启动"); } } new Tool().fix(); } // 匿名内部类:即时实现 void runProgram() { new Runnable() { @Override public void run() { System.out.println("程序运行中"); } }.run(); } } ``` **抽象类的核心作用**: ```java abstract class Shape { // 抽象方法(无实现) abstract double area(); // 具体方法(有默认实现) void display() { System.out.println("图形面积: " + area()); } } class Circle extends Shape { double radius; Circle(double r) { this.radius = r; } @Override double area() { return Math.PI * radius * radius; // 强制子类实现 } } ``` --- #### 3. **关键特性对比** | **特性** | **内部类** | **抽象类** | |------------------------|----------------------------------------|-------------------------------------| | 访问外部类成员 | ✅ 直接访问外部类私有成员 | ❌ 与外部类无关 | | 继承关系 | ❌ 不能被子类继承(除非声明为`public`) | ✅ 专门用于被继承 | | 抽象方法 | 可包含或不包含 | 必须包含至少一个抽象方法 | | 构造方法 | 可定义构造方法 | 可定义构造方法(用于子类super调用) | | 多继承支持 | ❌ Java单继承限制 | ❌ Java单继承限制 | | 设计模式应用 | 适配器模式、回调机制 | 模板方法模式、策略模式 | --- #### 4. **典型应用场景** **使用内部类**: - 需要访问外部类私有字段时(如事件处理器) - 逻辑强关联的辅助类(如`Map.Entry`实现) - 避免命名冲突(如模块化工具类) **使用抽象类**: - 定义通用模板方法(如`InputStream`抽象类) - 强制子类实现特定行为(如游戏角色基类) - 封装公共状态和逻辑(如`AbstractList`) --- #### 5. 特殊注意事项 **内部类的内存泄漏风险**: ```java class Outer { private int[] data = new int[1000000]; class Inner { void access() { System.out.println(data.length); // 隐式持有Outer引用 } } } // 解决方案:若不需要访问外部实例,声明为static嵌套类 ``` **抽象类的构造限制**: ```java abstract class Vehicle { String type; Vehicle(String type) { // 抽象类可有构造方法 this.type = type; } } class Car extends Vehicle { Car() { super("汽车"); // 子类必须调用抽象类构造器 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值