18 继承

继承

继承的注意点

  • 继承的本质是对某一批类的抽象, 从而实现对现实世界更好的建模。
  • extends的意思是“扩展”。子类是父类的扩展。
  • JAVA中类只有单继承,没有多继承! 一个儿子只能有一个爸爸,一个爸爸可以有多个儿子
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。组合就是用已定义好的类的实例作为新定义类的属性。
  • 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
  • 子类和父类之间,从意义。上讲应该具有"is a"的关系.
  • object类
  • super
  • 方法重写

类与类的两种关系

public class Person{	//组合
    
}
public class Student{
    Person person;
}
public class Person{	//继承
    
}
public class Student extends Person{
    
}

四种访问属性

  • 在Java中, 所有的类,都默认直接或者间接继承object,public class Person 相当于 public class Person extends object

super与this

  • 代表的对象不同
  • this:代表本身这个对象
  • super:代表本身的父类对象
  • 前提
  • this:没有继承也可以使用
  • super:只能在继承条件才可以使用,只能出现在子类的方法或者构造方法中
  • 构造方法
    • this(); 调用本类的构造方法,必须在构造方法的第一个
    • super(); 调用父类的构造方法,必须在构造方法的第一个
    • 故 super(); 和 this(); 不能出现在同一个构造方法中
    • super(); 和 this(); 广泛运用于构造方法重载
  • 注意点
    • 如果一个方法或属性,既不加this也不加super,那么他代表的是本类的还是父类的呢
    • 他代表的内容是由 参数/局部变量 -> 本类方法/属性 -> 父类方法/属性 的优先级逐个寻找

方法重写

  • 重写:需要有继承关系,子类重写父类的方法,子类重写了父类的方法,则执行子类的方法
  • 子类与父类的同名属性看作两个属性,故没有属性的重写,只有方法的重写
  • 重写的要求
    • 方法名必须相同
    • 参数列表列表必须相同
    • 重写只能是两个非静态函数
    • 修饰符:范围可以扩大但不能缩小: private<Default<Protected<public
    • 抛出的异常:范围,可以被缩小,但不能扩大 ClassNotFoundException --> Exception(大)
  • 重写,子类的方法和父类必要一致:方法体不同!
  • 为什么需要重写
    • 父类的功能,子类不一 定需要, 或者不一定满足 !
  • 注意事项
  • 静态同名同参不是重写,方法的调用只跟左边定义的数据类型有关
    • 非静态同名同参,即重写,方法的调用只跟右边创建的对象有关
    • 不允许子父类有同名,却一个静态,一个非静态的函数,会报错
    • static方法,属于类,它不属于实例,无法被重写
    • final 常量方法,无法被重写
    • private方法,无法被重写
//非静态同名同参,即重写
public class A {
    public void print(){
        System.out.println("A");
    }
}
public class B extends A {
    public void print(){
        System.out.println("B");
    }
}
public class Main {
    public static void main(String[] args) {
        A a = new B();	//A为父类,B为子类,父类的引用指向了子类
        B b = new B();	
        a.print();		//输出 B
        b.print();		//输出 B
    }
}
//=================================================
//静态同名同参,非重写
public class A {
    public static void print(){
        System.out.println("A");
    }
}
public class B extends A {
    public static void print(){
        System.out.println("B");
    }
}
public class Main {
    public static void main(String[] args) {
        A a = new B();	//A为父类,B为子类,父类的引用指向了子类
        B b = new B();	
        a.print();		//输出 A
        b.print();		//输出 B
    }
}

<think>好的,我现在要解决用户在IAR编译器中遇到的错误:“incomplete type is not allowed”。首先,我需要理解这个错误的含义和常见原因。根据我的知识库,这个错误常发生在代码中使用了未完全定义的类型,比如结构体或联合体声明了但未定义,或者前向声明了某个类型但没有提供完整的定义。 首先,我应该检查用户代码中是否有结构体或联合体的声明但没有定义的情况。比如,如果有一个结构体声明为`struct MyStruct;`,但没有后续的完整定义,那么在需要该结构体大小或成员的地方,编译器就会报这个错误。这时候,需要用户补全结构体的定义,包括成员变量。 其次,检查是否在头文件中只声明了类型而没有包含定义。例如,如果在头文件中使用前向声明,但在使用该类型的源文件中没有包含实际的定义头文件,这也会导致错误。此时,需要确保在使用类型的地方包含了正确的头文件,或者将前向声明替换为完整的定义。 另外,还要考虑typedef的问题。如果用户使用了typedef创建别名,但原始类型未完全定义,同样会引发错误。例如,`typedef struct MyStruct MyType;`之后,如果尝试使用MyType但MyStruct尚未定义,就会出错。需要确保在使用typedef之前,原始类型已经被完整定义。 此外,数组声明中的类型不完整也是一个常见原因。比如声明数组时,如果元素类型未完全定义,编译器无法确定数组的大小,导致错误。需要检查数组声明中的类型是否已经完整定义。 可能还有其他情况,比如在C和C++混合编程时,如果没有正确使用extern "C",或者在头文件中遗漏了必要的包含,也可能导致类型不完整。需要用户检查这些方面。 接下来,我需要将这些可能的原因整理成清晰的解决步骤,并给出具体的代码示例,帮助用户理解如何修改。同时,根据用户提供的引用内容,虽然引用[1]和引用[2]是关于其他错误的,但用户可能希望看到类似的结构,即分点说明解决方案,并引用相关资源。 最后,生成相关问题,帮助用户进一步了解可能相关的编译错误,比如类型未定义、前向声明问题等。这样用户可以有更全面的认识,预防其他类似错误的发生。</think>### IAR编译器错误'incomplete type is not allowed'解决方案 该错误表示代码中使用了**未完全定义的类型**,编译器无法确定其内存布局或成员信息。以下是具体原因及解决方法: #### 1. 结构体/联合体未定义完整 若声明了结构体但未定义成员,在实例化时会报错: ```c struct MyStruct; // 前向声明不完整 struct MyStruct var; // 错误:使用未完成类型 ``` **解决方案**:补全类型定义 ```c struct MyStruct { int id; char name[20]; }; ``` #### 2. 头文件包含缺失 当跨文件使用类型时,需确保定义可见: ```c // file.h struct Data; // 前向声明 // file.c struct Data { // 实际定义 int value; }; ``` **解决方案**:在使用该类型的文件中包含定义头文件 ```c #include "file.c" // 包含实际定义 ``` #### 3. typedef别名问题 使用typedef时原始类型必须完整: ```c typedef struct Node NodeT; // 前向声明 NodeT* ptr; // 允许指针声明 NodeT instance; // 错误:不完整类型 ``` **解决方案**:先完成类型定义再typedef ```c struct Node { int data; struct Node* next; }; typedef struct Node NodeT; ``` #### 4. 数组声明不完整 数组元素类型必须完全定义: ```c struct Element; struct Element arr[10]; // 错误:元素类型未定义 ``` **解决方案**: ```c struct Element { int type; float value; }; struct Element arr[10]; // 合法 ``` #### 调试建议 1. 在IAR工程中搜索错误行号定位问题代码 2. 使用Go to Definition功能追踪类型定义 3. 检查所有头文件包含链 4. 确认没有循环依赖的头文件 编译器需要知道类型的完整信息才能: - 计算sizeof大小 - 分配内存空间 - 访问成员变量 - 进行类型对齐 [^1]: 类似类型转换错误可参考浮点转整型的类型适配问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天才东西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值