版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42528266/article/details/102953867
引用变量的两种类型:
- 编译时类型(模糊一点,一般是一个父类)
- 由声明时的类型决定。
- 运行时类型(运行时,具体是哪个子类就是哪个子类)
- 由实际对应的对象类型决定。
- 多态的存在要有3个必要条件:
- 要有继承,要有方法重写,父类引用指向子类对象
引用数据类型的类型转换
- 子类转换为父类:自动转换
- 上转型对象不能操作子类新增的成员变量和方法。
- 上转型对象可以操作子类继承或重写的成员变量和方法
- 如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。
- 父类转换为子类:强制转换
- (绝不是做手术,而是父类的真面目就是一个子类,否则会出现类型转换错误)
final关键字
- final可以用来修饰变量,方法,类。
- 修饰变量:变量一旦被初始化便不可改变,相当定义了一常量。
- 修饰方法:final方法是在子类中不能被覆盖的方法
final returnType methodName(paramList){...}
final void eat() { … }
修饰类:final类是无法被任何类继承的。
final class finalClassName{ ... }
final class Person{ … }
抽象类
- 为什么需要抽象类? 如何定义抽象类?
- 是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩 展。
- 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计, 使子类之间更加通用。
- 要点:
- 抽象方法和抽象类均必须用abstract来修饰。
- 抽象方法没有方法体,只需要声明不需实现。
- 有抽象方法的类只能定义能抽象类
- 相反抽象类里面的方法不一定全是抽象方法,也可能没有抽象方法。
- 抽象类可以包含属性、方法、构造方法。
- 抽象类不能实例化,及不能用new来实例化抽象类,只能用来被子类调用。
- 抽象类只能用来继承。
- 抽象方法必须被子类实现。抽象类的子类必须覆盖所有的抽象方法才能被实例化,否则还是抽 象类
接口 interface
- 为什么需要接口?接口和抽象类的区别?
- 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专 业地实现了:规范和具体实现的分离。
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你 是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是 坏人,则必须欺负好人。
- 接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
- 项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的“不变”就是“规 范”。因此,我们开发项目往往都是面向接口编程!
- 接口相关规则
- 接口中所有方法都是抽象的。
- 即使没有显式的将接口中的成员用public标示,也是public访问类型的
- 接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量。
- 可以定义一个新接口,用extends去继承一个已有的接口
- 可以定义一个类,用implements去实现一个接口中所有方法。
- 可以定义一个抽象类,用implements去实现一个接口中部分方法。
Java与C++的对比
- C++支持多重继承,Java支持单重继承
- C++多重继承的危险性在于一个类可能继承了同一个方法的不同实现,会导致系统崩溃。
Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效 果和功能,也避免的多重继承的危险性。
内部类
将一个类定义置入另一个类定义中就叫作“内部类”
- 类中定义的内部类特点
- 内部类作为外部类的成员,可以直接访问外部类的成员(包括private成员),反之则不行。
- 内部类做为外部类成员,可声明为private、默认、protected或public。
- 内部类成员只有在内部类的范围之内是有效的。
- 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的 访问权限。
- 编译后生成两个类: OuterClass.class 和OuterClass$InnerClass.class
- 内部类分类
- 匿名内部类
- 成员内部类
- 静态内部类
- 方法内部类
垃圾回收机制
- 对象空间的分配:
- 使用new关键字创建对象即可
- 对象空间的释放:
- 传统