Java-OOP_Extends
继承
对象们 - 有所同 ,有所不同
- 羊 - 吃草 - 移动 - 睡觉
- 老虎 - 吃肉 - 移动 - 睡觉
- 将类进行一个分类
语法格式:
- 关键字:extends
- 格式: public class 子类 extends 父类
- 父类 SuperClass
权限范围:
学生类 (大学生类 中学生类 小学生类)
-
子类继承到了父类的哪些东西?
所有 -
子类以及子类对象可以调用到继承的哪些东西?
访问权限修饰符 :
范围
- private 类的{}中
- protected
- public 整个项目中
- 缺省的 不写
项目的结构:
项目: public
包:缺省 和 protected
文件:
类: private
不同包:
文件:
子类:protected
Code Test
同包下
package oop.zyf0730.extendsV1;
/**
* 父类 Student
*/
public class Student {
public String name;
protected int age;
int id;
private int score;
}
package oop.zyf0730.extendsV1;
// UNStudent 在同包继承了Student
// 只有 私有的 不能调用
public class UNStudent extends Student{
public void printUnStuInfo(){
System.out.println("姓名:"+name);
System.out.println("年齡:"+age);
System.out.println("ID"+id);
//System.out.println("學分:"+score);
}
}
package oop.zyf0730.extendsV1;
/**
* StuManage 属于 与父类以及子类在同一个包中
* 子类以及父类的对象只有私有的不能访问
*/
public class StuManage {
public static void main(String[] args) {
UNStudent unstu = new UNStudent();
unstu.name="LZW";
unstu.age=20;
unstu.id=1;
// unstu.score=10;// 'score' 在 'oop.zyf0730.extendsV1.Student' 中具有 private 访问权限
unstu.printUnStuInfo();
}
}
不同包:
package oop.zyf0730.extendsV2;
import oop.zyf0730.extendsV1.Student;
/**
* 不同包中的子类
* MidStudent 继承了 不同包中的父类
* 公共的与受保护的可以调用
* 缺省与私有的不行
*/
public class MidStudent extends oop.zyf0730.extendsV1.Student{
public void printUnStuInfo(){
System.out.println("姓名:"+name);
System.out.println("年齡:"+age);
System.out.println("ID"+id);
System.out.println("學分:"+score);
}
}
package oop.zyf0730.extendsV2;
/**
* MidStuManage 属于 与父类以及子类在不同包中
* 子类以及子类的对象 只能调用public 修饰的
*/
public class MidStuManage {
public static void main(String[] args) {
MidStudent mdstu = new MidStudent();
mdstu.name="LZW";
}
}
任务:
来总结可以访问的范围权限
方法重写:
// 方法实现:接口中 -- 抽象方法在类重写
接口中所有的方法都需要重写实现
继承中的方法重写:可以选择性重写
- 两个类必须有继承关系
- 子类中可以重写父类的方法
- 格式: 一般要求 除方法体之外与父类方法一致
- 重写之后,子类以及子类对象优先调用重写之后的方法
- 在子类中,super 可以指代父类 调用方法属性
// 重写父类方法
@Override
public int test(String name) {
super.test(name);// 保留父类方法原本的代码
System.out.println("子类重写的方法");
return 100;
}
方法重载:
- 一个类中,可以写多个同名的方法
- 格式要求,参数列表必须不一致
- 前提是已经实现了方法重载 - 访问修饰符 返回值类型没有要求,方法之间可以改
子类对象可以向父类类型转型
大学生类 的对象
- 某一个大学生 类型有哪些?
- 首先是大学类
- 然后是学生类
- 然后是人类
A a = new A(); x A类型
a 是一个子类对象 大学生类
B b = a;// 前提:
变成了一个、父类对象 学生类
A a1 = (A)b;// 强制转型 -- 向下转型
// 前提是 原本的类型就是 当前需要向下转的类型
我是学生! 对方: 属于学生类
// 子类对象转型父类类型之后还是调用自己重写的方法
// 子类对象转型父类类型之后不能调用自己独有的方法
- 但是可以再向下转型来调用
package oop.zyf0730.extendsV1;
import oop.zyf0730.extendsV2.MidStudent;
/**
* StuManage 属于 与父类以及子类在同一个包中
* 子类以及父类的对象只有私有的不能访问
*/
public class StuManage {
public static void main(String[] args) {
UNStudent unstu = new UNStudent();
unstu.name="LZW";
unstu.age=20;
unstu.id=1;
// unstu.score=10;// 'score' 在 'oop.zyf0730.extendsV1.Student' 中具有 private 访问权限
// unstu.printUnStuInfo();
MidStudent mdstu = new MidStudent();
mdstu.name="LZW";
mdstu.age=20;
//mdstu.id=1;
unstu.printUnStuInfo();
unstu.test("LZW");
mdstu.test("LZW2");
UNStudent unstuX= new UNStudent(); // 1- 2-1
Student stuX=unstuX;// 向上转型
stuX.test("LZW");// 子类对象转型父类类型之后还是调用自己重写的方法
// 正确的向下转型
UNStudent unstuX1 = (UNStudent) stuX;
unstuX1.printUnStuInfo();
// 错误的向下转型 stu = new Student(); 属于父类类型的对象
Student stu = new Student();// 父类 // 2 -1
UNStudent unstu1 = (UNStudent)stu;// ClassCastException
unstu1.printUnStuInfo();
}
}

浙公网安备 33010602011771号