package day02;
/**
* 继承
*
* 2022/10/12
*/
public class Test1_Extends {
public static void main(String[] args) {
/*
* 创建子类对象时,代码的执行流程:
* 子类构造 -> 父类构造 -> 父类成员变量初始化 ->
* 父类构造方法体 -> 子类成员变量初始化 -> 子类构造方法体
*/
Teacher t = new Teacher();
//子类可以调用从父类中继承过来的内容
t.eat();
t.sleep();
//也可以使用本类中特有的内容
t.teach();
t.test();
Student s = new Student();
s.show();
//重写之前执行父类的,重写之后执行子类的
s.eat();//吃肉
s.sleep();//睡觉
B b = new B();
b.study();
System.out.println(b.age);
}
}
//超类/父类/基类 通常用于存放所有子类共有的内容
class Person{
//四种访问权限修饰符及其访问范围, -- 讲义
protected int age;//父类中的内容想要被子类访问至少protected
protected String name;
//私有属性可以被继承,但是不能被子类直接使用
private double money = 20;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
//私有方法不能被继承
private void shopping(){
System.out.println("购物");
}
public Person() {
System.out.println("父类构造");
}
public Person(int age, String name) {
this.name = name;
this.age = age;
/*
* 创建子类对象时,子类构造中的super()会调用父类的构造方法但是不会创建父类的对象,
* 只是通过触发父类的构造器来让父类中的内容加载到JVM中,从而实现子类的继承
*/
System.out.println(this);//day01.day02.Teacher@1b6d3586
}
public Person get(){
return new Person();
}
}
//派生类/子类
//用extends关键字实现继承关系后,子类可以使用父类中的非私有内容
//教师类
class Teacher extends Person{
// private String name;
// private int age;
private int tid = 0;//教师编号
// public void eat(){
// System.out.println("吃饭");
// }
// public void sleep(){
// System.out.println("睡觉");
// }
public void teach(){
System.out.println("讲课");
}
public void test(){
System.out.println(name);
System.out.println(tid);
}
public Teacher() {
/*
* super([参数])可以在子类构造方法中调用父类的构造方法
* 在子类构造第一行默认隐藏了一个super()来调用父类的无参构造
*
* 当父类中没有提供无参构造时,子类通过super()调用时会出现编译报错,
* 我们可以选择给父类添加无参构造,也可以显示的在子类构造方法中调用父类的有参构造
*/
// super();
super(40,"张三");
System.out.println("子类构造");
}
public Teacher(int age, String name, int tid) {
//this()和super()不能同时出现在一个构造方法中
// this();
super(age, name);
this.tid = tid;
}
//构造方法不能被继承
// public Person() {}
//学生类
}
class Student extends Person {
// private String name;
// private int age;
private int sid;//学号
// public void eat(){
// System.out.println("吃饭");
// }
// public void sleep(){
// System.out.println("睡觉");
// }
public void study() {
System.out.println("学习");
}
private String name = "祖国的炸弹";
public void show(){
System.out.println(name);
/*
* 使用关键字可以在子类中调用父类的成员变量,成员方法
* 当子类的成员与父类成员重名时秒如果想使用父类的成员,
* 可以用super.来调用,不重名时可以省略
*/
System.out.println(super.name);//null
}
public void eat(){
System.out.println("吃肉");
}
/*
* 当父类提供的方法实现不满足子类的使用需求时,可以对方法进行重写(Override)
* 重写的语法要求(两同两小一大)
* 1.方法名相同
* 2.参数列表相同
* 3.返回值类型小于等于父类
* 如果时void或者基本数据类型,必须相同
* 如果是引用类型,可以相同,也可以是父类方法返回值类型的子类型
* 4.抛出的异常小于等于父类
* 5.访问权限大于等于父类
*/
@Override
public void sleep() {super.sleep();}
public Student get(){
return new Student();
}
/*
* 子类不能被继承父类中的私有方法,所以不能对其进行重写
* 如果在子类中定义了相同的方法,则为子类特有方法
*/
// @Override//该注解用于表示当前方法为重写的方法
private void shopping(){
System.out.println("购物");
}
}
//java中的类只支持单继承,即一个类只能继承一个父类,不能同时继承多个
//class A extends Teacher,Student {}
/*
* 继承具有传递性,子类既可以使用父类的内容,
* 也可以使用其父类的父类中的内容,以此类推
*/
class B extends Student{}
5. 继承以及重写
于 2022-10-24 22:20:54 首次发布