package cn.itcast.day09.demo01;
public class Employee {
public void method(){
System.out.println("方法执行");
}
}
package cn.itcast.day09.demo01;
public class Teacher extends Employee {
//继承,Employee的子类
//包含了继承父类的方法
}
package cn.itcast.day09.demo01;
//定义了另外一个子类
public class Assistant extends Employee {
}
package cn.itcast.day09.demo01;
/*继承:子类就是一个父类
* 定义父类:常规的类定义方法
* 定义子类:public class 子类名称 extends 父类名称{}*/
public class Demo01Extends {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.method();//虽然什么也没写,继承了父类的方法
Assistant assistant = new Assistant();
assistant.method();//一个方法多次使用 达到代码复用的效果
}
}
package cn.itcast.day09.demo2;
public class Fu {
int numFu = 10;
int num = 100;
public void methodFu(){
System.out.println(num);//使用本类中
}
}
package cn.itcast.day09.demo2;
public class Zi extends Fu {
int numZi = 20;
int num = 1000;
public void methodZi(){
System.out.println(num);//本类中有num,用的是本类中的num
}
}
package cn.itcast.day09.demo2;
public class Demo01ExtandField {
public static void main(String[] args) {
Fu fu = new Fu();
System.out.println(fu.numFu);//仅有父类中的方法,没用子类的方法
Zi zi = new Zi();
System.out.println(zi.numFu);//10 ,继承于父类
System.out.println(zi.numZi);//20
//若父类与子类中成员变量重名,创建子类对象时有两者访问方法
//直接通过子类对象访问
//间接通过成员方法 方法属于谁,就优先用谁,没用则向上找
System.out.println("===========");
System.out.println(zi.num);//重名部分,根据Zi对象创建,优先子类 1000 若之中没用,则向上找
//System.out.println(zi.abc); //父类子类都没有,编译报错
System.out.println("===========");
zi.methodZi();//1000
zi.methodFu();//这个方法在父类中定义,属于父类,不会向下找子类 100
}
}
成员变量的区分:
package cn.itcast.day09.demo03;
public class Fu {
int num = 10;
}
package cn.itcast.day09.demo03;
public class Zi extends Fu {
int num = 20;
public void method(){
int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(super.num);//10 父类的成员变量
}
}
package cn.itcast.day09.demo03;
/*三个num 父类 子类 子类方法中
*局部变量:
* 本类的成员变量
*父类的成员变量
* */
public class Demo01ExtandField {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
package cn.itcast.day09.demo04;
public class Fu {
public void methodFu(){
System.out.println("父类方法执行");
}
public void method(){
System.out.println("父类同名方法执行!");
}
}
package cn.itcast.day09.demo04;
public class Zi extends Fu {
public void methodZi(){
System.out.println("子类方法执行");
}
public void method(){
System.out.println("子类同名方法执行!");
}
}
package cn.itcast.day09.demo04;
/*成员方法的访问
* */
/*重写(Override)
* 在继承关系中,方法名称一样,参数列表一样
* 重写(Override):参数列表一样 方法覆盖 创建对象是谁,就用谁的方法
* 重载(Overload):参数列表不一样*/
public class Demo01ExtandsMethod {
public static void main(String[] args) {
Zi zi = new Zi();
//子类与父类的不同名 方法调用
zi.methodZi();//向上找
zi.methodFu();
//
zi.method();//创建对象是谁,就优先使用谁的方法,如果没有则向上找 调用的子类方法
//无论成员方法或成员变量 若无则必然向上找父类,绝对不可能找子类
}
}
方法覆盖
package cn.itcast.day09.demo05;
public class Fu {
public void method(){
}
}
package cn.itcast.day09.demo05;
public class Zi extends Fu {
@Override//安全监测,写上不报错说明是正确的方法覆盖
public void method(){
//方法覆盖,不报错
//子类方法返回值需要小于等于父类方法
//String有一个父类Object
//Object是所有类的父类,继承关系的顶端 java.lang.Object
//子类方法权限必须大于等于父类方法的权限修饰符
//public>pretected>(dafulat)(留空,不是关键字)>private
}
}
package cn.itcast.day09.demo05;
//@Override 写在方法前面,用于检测是否是覆盖
public class Demo01Override {
}
构造方法
package cn.itcast.day09.demo06;
public class Fu {
public Fu(){
System.out.println("父类构造方法");
}
public Fu(int num){
System.out.println("父类有参数构造方法");
}
}
package cn.itcast.day09.demo06;
public class Zi extends Fu{
public Zi(){
//super() 编译器自动生成
super(20);//调用父类重载构造,super仅在子类构造方法中可以被调用,且必须为第一行第一个语句
System.out.println("子类构造方法!");
}
}
package cn.itcast.day09.demo06;
public class Demo01Construct {
public static void main(String[] args) {
Zi zi = new Zi();//先父类,再子类 父类构造方法 子类构造方法!
//子类构造方法中有默认隐含 super()调用 若什么都不写则有,因此先调用父类构造
//可以利用super关键字,
}
}