继承和多态
1.继承
1.1为什么要继承
面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。在子类中,访问父类的成员方法和成员变量。
1.2继承概念
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承主要解决的问题是:共性的抽取,实现代码复用。
1.3继承的语法
1.4父类成员访问
1.4.1子类中访问父类的成员变量
在子类方法中 或者 通过子类对象访问成员时:
1.如果访问的成员变量子类中有,优先访问自己的成员变量。
2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
对于同名的成员变量和不同名的成员变量
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
1.4.2子类中访问父类的成员方法
1.5super关键字
【注意事项】
1.只能在非静态方法中使用
2.在子类方法中,访问父类的成员变量和方法。
用法:
public class Test5{
protected int a=19; } public class Test extends Test5{
public void func(){
System.out.println(super.a); } public static void main(String[] args) {
Test test =new Test(); test.func(); } }
1.6子类构造方法
1.要放在第一行
2.当子类承了父类之后,在构造子类对象的时候,一定要先帮助父类进行构造。调用父类的构造方法。
class Dog extends Animal{
public Dog(String name,int age){
//帮助初始化子类从父类继承下来的成员 super(name,age); }
1.7super和this
【相同点】
- 只能在类的非静态方法中使用,用来访问非静态成员方法和字段(不能在main方法中使用,main方法是静态方法)
- 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
1.this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有
1.8初始化
继承顺序:
package jic; class Person {
public String name; public int age; public Person(String name, int age) {
this.name = name; this.age = age; System.out.println("Person:构造方法执行"); } {
System.out.println("Person:实例代码块执行"); } static {
System.out.println("Person:静态代码块执行"); } } class Student extends Person{
public Student(String name,int age) {
super(name,age); System.out.println("Student:构造方法执行"); } {
System.out.println("Student:实例代码块执行"); } static {
System.out.println("Student:静态代码块执行"); } } public class Test {
public static void main(String[] args) {
Student student1 = new Student("张三",19); System.out.println("==========================="); Student student2 = new Student("ling",20); } public static void main1(String[] args) {
Person person1 = new Person("hp![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6f7253af6ece42e7b23b5b1d.png#pic_center) ",10); System.out.println("============================"); Person person2 = new Person("ling",20); } }
结论:
1.父类静态代码块优先于子类静态代码块执行,父类实例父类构造,子类实例子类构造。
2.第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行。
1.9protected关键字
范围 | protected |
---|---|
同一个包中的同一类 | √ |
同一个包中的不同类 | √ |
不同包中的子类 | √ |
不同包中的非字类 |
1.9继承方式
java是单继承,不支持多继承。一般我们不希望出现超过三层的继承关系.
1.9final关键字
- 修饰变量或字段,表示常量(即不能修改,只能初始化一次)
final int a = 10; a = 30; // 编译出错
- 修饰类:表示此类不能被继承
final public class Animal {
... } public class Bird extends Animal {
... } // 编译出错
- 修饰方法:表示该方法不能被重写
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/101502.html