面向对象3

it2025-10-21  8

Java基础-面向对象3

本章目标

包的使用理解继承的概念、作用、以及实现方式理解在继承时,子类如何覆盖父类的操作理解在继承时,构造方法的执行过程熟练掌握super、this关键字熟练掌握final关键字

包的定义

使用package声明包,以英文分号结尾如果有包的声明,一定是Java源代码的第一条语句一个Java文件中,最多只能出现一次package语句

包的命名规则

包名由小写字母组成,不能以圆点开头或结尾

一般为域名倒置

项目.模块名

eg:com.baidu.shopping.dao

包的导入

import

继承

继承的好处

父类中方便代码修改子类中减少代码量

继承的概述

继承是一种特性,利用继承可以重用已有类,也是代码重用的一种体现在Java中,采用extends继承一个已有类,被继承的类被称为父类(超类),继承的类称为子类继承符合 is a 关系。例如Dog is a animal 而不能说 Animal is a dog

继承的语法

class SonClass extends FatherClass{}

继承的理解

子类并非继承父类的所有资源,子类继承父类的非private的属性和方法子类可以拥有自己的属性和方法,即对父类的拓展子类可以用自己的方法重写覆盖父类的方法Java采用单继承,即一个子类只有一个父类,但是可以采用多重继承 D e C e B e A

继承的顺序

父类属性父类构造方法子类属性子类构造方法

继承中的protected

保护不同包的子类,可以访问protected的方法和变量

1 package javalearning.kkb7oob4; /** * @author chenxu * @date 2020/10/21 - 19:38 */ public class PersonFather { public String name; protected String sex; String id; private int age; public void eat(){ System.out.println("PersonFather.eat"); } }2 package javalearning.kkb7oob4Test; import javalearning.kkb7oob4.PersonFather; /** * @author chenxu * @date 2020/10/21 - 19:42 */ public class PersonSon extends PersonFather { public static void main(String[] args) { PersonFather personFather = new PersonFather(); personFather.sex = "female"; // error: 'sex' has protected access in 'javalearning.kkb7oob4.PersonFather' //protected修饰符保护的是不同包的子类的修饰权力 PersonSon personSon = new PersonSon(); personSon.sex = "male"; } }

super、this关键字

super用于子类访问父类

构造方法(必须在子类的构造方法的第一句)属性方法

​ this访问本类构造方法必须放在第一行 访问的是本类的属性和方法 this可以引用当前对象

​ super访问父类的构造方法必须放在第一行 访问的是父类的属性和方法 super只能放在子类中使用

​ super、this都不能放在静态方法中使用,构造方法中引用构造方法时不能同时出现,因为只有一个第一行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVJr3C7p-1603338247804)(C:\Users\11587\AppData\Roaming\Typora\typora-user-images\1603293270960.png)]

小结

Java是单继承,只有一个父类通常在父类中写入一些通用的方法和属性子类自动继承父类的非私有方法和属性当没有显示继承任何类时,默认继承Java.lang下的Object类

方法的覆盖(方法的重写)&方法重载

规范

子类方法必须和父类有相同的方法名称、参数列表和返回值类型子类方法的访问权限必须大于或等于父类的权限子类方法抛出的异常不能大于父类被重写方法的异常

区别和联系

重载就是在同一个类当中有多个名称相同方法,但各个相同方法的参数列表不同(无关返回值类型)

重写则发生在不同的类当中,并且两者要有继承关系,重写是方法名字和参数的列表是要完全一致

对象创建的过程

JVM会先记载父类,再加载子类

在栈内存中为定义的变量分配内存空间,同时在堆内存中为真正的对象分配内存空间

调用构造器为创建出来的对象进行初始化

子类所有的构造方法,默认都会调用父类中的无参构造方法==子类实例化之前会先实例化父类

先执行父类的构造方法在执行子类的,默认在子类的构造方法中第一行加上super();

如果父类中不存在无参构造,而是有参构造,则需要在子类的构造方法中第一行写上

super(参数列表)

父类: public class Father { public Father(){ System.out.println("Father.Father"); } } 子类: public class Son extends Father { public Son(){ //默认 super(); System.out.println("Son.Son"); } public static void main(String[] args) { Son son = new Son(); } } 此时输出结果为: Father.Father Son.Son

当父类不存在无参构造时

public class Father { public Father(int a){ System.out.println("Father.Father"); } } public class Son extends Father { public Son(){ super(666);//在子类的构造方法中成功调用父类的构造方法即可 System.out.println("Son.Son"); } public static void main(String[] args) { Son son = new Son(); } }

Object类的构造方法是最先被执行的

final概述

final修饰的类不能被继承

eg:String类

final修饰变量

该变量只能被赋值一次且必须赋值一次

所以被final修饰的变量是常量

成员变量、局部变量都可以用final修饰

成员变量在使用final修饰时必须在声明时就赋值(或通过构造方法赋值)变成常量

public class FinalDemo { final int age =12; final int num; public FinalDemo(int num){ this.num=num; //通过构造方法给其赋值 } }

局部变量不用,但是必须在调用成员变量前为其赋值

final修饰方法

表示该方法不能被重写覆盖

总结

继承

符合is a 关系使用extends关键字代码复用

方法重写的规则

方法名相同参数列表相同返回值类型相同或者是其子类访问权限不能小于父类

super关键字访问父类

super只能出现在子类的方法和其构造方法中

super调用构造方法时,只能出现在第一句

super不能访问父类的private成员

子类实例化时—先实例化父类,再实例化子类

在子类中所有的构造方法,默认调用父类的无参构造

当父类不存在无参构造时,需在子类第一行成功调用父类的有参构造

最新回复(0)