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成员
-
子类实例化时—先实例化父类,再实例化子类
-
在子类中所有的构造方法,默认调用父类的无参构造
当父类不存在无参构造时,需在子类第一行成功调用父类的有参构造
本文详细介绍了Java中的包的使用,包括命名规则和导入。接着讲解了继承的概念、好处、语法以及执行顺序,强调了子类如何覆盖父类的方法。此外,还探讨了super和this关键字的用法,以及final关键字在类、变量和方法中的应用。最后,文章总结了方法重写(覆盖)的规则以及对象创建的过程。

139

被折叠的 条评论
为什么被折叠?



