JavaSE-08 【继承】
第一章 继承
1.1 继承介绍
- 继承的概念:
- 让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员
- 继承是多态的前提,如果没有继承,就没有多态
- 继承主要解决的问题就是共性抽取
- 继承关系中的特点
- 1、子类可以拥有父类的内容
- 2、子类还可以拥有自己独有的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oshUoeln-1686188016077)(photo/JavaSE08_面向对象之继承.assest/1664783489643.png)]
1.2 继承的格式
-
继承的格式
- 定义父类的格式
public class 父类名称(){//... }
- 定义子类的格式
public class 子类名 extends 父类名{//... }
-
定义父类
/*** 定义一个父类*/
public class Employer {//定义父类的成员方法public void work(){System.out.println("父类的方法被调用了");}
}
- 定义子类
/*** 定义员工的子类 Teacher,继承父类Employer*/
public class Teacher extends Employer{}
/*** 定义员工的子类 Coder,继承父类Employer*/
public class Coder extends Employer{}
- 测试
/*** 继承的格式* 定义父类的格式* public class 父类名称(){* // ...* }* 定义子类的格式:* public class 子类名 extends 父类名{* //...* }*/
public class TestExtends {public static void main(String[] args) {//创建一个子类Teacher的对象Teacher teacher = new Teacher();//Teacher类继承了父类Emoloyer中的方法teacher.work();//创建一个子类Coder的对象Coder coder = new Coder();//Coder类继承了父类Emoloyer中的方法coder.work();}
}
- 结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7w6laWtJ-1686188016078)(photo/JavaSE08_面向对象之继承.assest/1664785379097.png)]
1.3 继承中成员变量的访问特点
- 继承中成员变量的访问特点
- 在子父类继承关系中,如果成员变量重名,那么子类对象访问成员变量的方式有两种
- 1、直接通过子类对象访问成员变量
- 规则:等号左边是谁,就优先用谁,没有则向上找
- 2、间接通过成员方法访问成员变量
- 规则:该方法属于谁,就优先用谁,没有则向上找
- 定义父类和子类
/*** 父类*/
public class Father {int numFu = 10;int num = 100;public void getFileds1(){System.out.println(num);}
}/*** 子类*/
public class Son extends Father{int numZi = 20;int num = 200;public void getFileds2(){System.out.println(num);}
}
- 测试
/*** 继承中成员变量的访问特点* 在子父类继承关系中,如果成员变量重名,那么子类对象访问成员变量的方式有两种* 1、直接通过子类对象访问成员变量* 规则:等号左边是谁,就优先用谁,没有则向上找* 2、间接通过成员方法访问成员变量* 规则:该方法属于谁,就优先用谁,没有则向上找*/
public class TestExtendsFiled {public static void main(String[] args) {//创建父类对象Father f = new Father();//获取属性值System.out.println(f.numFu);// 10 只能使用父类的属性,没有任何子类的内容System.out.println("------------------");//创建子类对象Son s = new Son();//获取属性,子父类的成员变量不重名System.out.println(s.numFu);//10 获取父类的属性System.out.println(s.numZi);//20 获取子类的属性System.out.println("------------------");//1、直接通过子类对象访问成员变量//等号左边是谁,就优先用谁,没有则向上找System.out.println(s.num);//200System.out.println("------------------");//2、间接通过成员方法访问成员变量s.getFileds2();//200 该方法属于谁,就优先用谁,没有则向上找f.getFileds1();//100}
}
1.4 区分继承中重名的三种变量
- 区分继承中重名的三种变量
- 子类方法的局部变量: 直接写变量名访问
- 子类的成员变量: this.变量名
- 父类的成员变量: super.变量名
- 父子类
public class Father {int num = 100;
}public class Son extends Father{int num = 200;public void getFields(){int num = 300;System.out.println("局部变量"+num);// 300 局部变量System.out.println("子类成员变量"+this.num);// 200 本类的成员变量System.out.println("父类成员变量"+super.num);//100 父类的成员变量}
}
- 测试
/*** 区分继承中重名的三种变量* 子类方法的局部变量: 直接写变量名访问* 子类的成员变量: this.变量名* 父类的成员变量: super.变量名*/
public class TestFileds {public static void main(String[] args) {//创建子类对象Son son = new Son();//调用方法son.getFields();}
}
- 结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x68nlUyZ-1686188016080)(photo/JavaSE08_面向对象之继承.assest/1664787336499.png)]
1.5 继承中成员方法的访问特点
- 继承中成员方法的访问特点
- 规则:创建的对象是谁,就优先用谁,如果没有就向上找
- 注意事项:无论是成员方法还是成员变量,本类如果没有找到,都是向上找,不会向下找子类的
- 父子类
public class Father {public void methodF1(){System.out.println("methodF1---被调用");}public void method(){System.out.println("父类的重名方法被调用");}
}public class Son extends Father {public void methodZ1(){System.out.println("methodZ1---被调用");}public void method(){System.out.println("子类的重名方法被调用");}
}
- 测试
/*** 继承中成员方法的访问特点* 规则:创建的对象是谁,就优先用谁,如果没有就向上找* 注意事项:无论是成员方法还是成员变量,本类如果没有找到,都是向上找,不会向下找子类的*/
public class TestFileds {public static void main(String[] args) {Father father = new Father();father.methodF1();father.method();System.out.println("----------------------");Son son = new Son();son.methodZ1();son.methodF1();//创建的对象是谁,就优先用谁,如果没有就向上找son.method();//我是子类的方法}
}
- 结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayNTViZx-1686188016081)(photo/JavaSE08_面向对象之继承.assest/1664788367968.png)]
1.6 继承中方法的重写
- 方法重写:Override
- 在继承关系中,方法名相同,参数列表相同,称之为方法的重写
- 重写注解:@Override ,用于标识重写 - 注意事项:
- 必须保证父子类的方法名相同,参数列表也想同
- 子类方法的返回值类型必须小于等于父类防范的返回值范围
- 子类方法的权限修饰符必须大于父类方法的权限修饰符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vbnTeds-1686188016092)(photo/JavaSE08_面向对象之继承.assest/1664795791847.png)]
public class Father {public void work(int a,int b){System.out.println("父类的方法");}public Object watch(){System.out.println("父亲在看电视");return "新闻联播";}protected int add(){return 3;}
}/*** 子类从写父类方法*/
public class Son extends Father{//方法名相同,参数列表相同@Overridepublic void work(int a,int b){System.out.println("子类重写父类的方法");}//子类的返回值类型要小于等于父类public String watch(){System.out.println("父亲在看电视");return "新闻联播";}//子类的访问修饰符要大于等于父类//权限修饰符大到小 public > protected > default > privatepublic int add(){return 3;}
}
1.7 继承中方法重写的应用场景
对于已经使用的类,尽量不要进行修改,推荐定义一个新的类,进而重复利用其中的共性内容,同时添加新的内容
/*** 父类:按键手机*/
public class KeyPhone {public void call(){System.out.println("打电话");}public void sendMessage(){System.out.println("发信息");}public void show(){System.out.println("显示号码");}
}
/*** 子类:智能手机*/
public class SmartPhone extends KeyPhone{//子类重写父类的show方法@Overridepublic void show() {super.show();//调用父类的show方法重复利用//子类扩展父类方法的功能System.out.println("显示属地");System.out.println("显示头像");System.out.println("显示专用铃声");}
}
/*** 方法重写应用场景*/
public class TestOverride {public static void main(String[] args) {//创建父类对象,调用方法KeyPhone keyPhone = new KeyPhone();keyPhone.call();keyPhone.sendMessage();keyPhone.show();System.out.println("------------");//创建子类对象,调用方法SmartPhone smartPhone = new SmartPhone();smartPhone.call();smartPhone.sendMessage();smartPhone.show();}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IktLGxZl-1686188016098)(photo/JavaSE08_面向对象之继承.assest/1664797300985.png)]
1.8 继承中构造方法的访问特点
- 继承中构造方法的访问特点
- 1、子类构造方法中有一个默认隐含的super()方法,所以一定是先调用父类的构造,后执行子类的构造
- 2、子类构造可以使用super关键字调用父类的构造
- 3、super语句必须是子类构造方法中的第一行,且不能多次调用
public class Father {private String name;//无参构造方法public Father() {System.out.println("父类的无参构造方法");}public Father(String name) {this.name = name;System.out.println("父类的有参构造方法");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Son extends Father{private int age;public Son() {super();//调用父类的无参构造方法System.out.println("子类的无参构造方法");}public Son(int age) {super("Tom");this.age = age;System.out.println("子类的有参构造方法");}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
/*** 继承中构造方法的访问特点* 1、子类构造方法中有一个默认隐含的super()方法,所以一定是先调用父类的构造,后执行子类的构造* 2、子类构造可以使用super关键字调用父类的构造* 3、super语句必须是子类构造方法中的第一行,且不能多次调用*/
public class TestConstructor {public static void main(String[] args) {//使用子类的无参构造方法创建对象Son son1 = new Son();System.out.println(son1.getName());System.out.println("--------------");//使用子类的有参构造创建对象Son son2 = new Son(22);System.out.println(son2.getName());System.out.println(son2);}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WU5zPYD5-1686188016104)(photo/JavaSE08_面向对象之继承.assest/1664801359682.png)]
第二章:this和super
2.1 super关键字的三种用法
- super关键字的用法
- super关键字用于访问父类的内容
- 1、在子类的成员方法中,访问父类的成员变量
- 2、在子类的成员方法中,访问父类的成员方法
- 3、在子类的构造方法中,访问父类的构造方法
public class Father {int num = 100;public void method(){System.out.println("父类中的成员方法");}
}/*** super关键字的用法* 1、在子类的成员方法中,访问父类的成员变量* 2、在子类的成员方法中,访问父类的成员方法* 3、在子类的构造方法中,访问父类的构造方法*/
public class Son extends Father{int num = 200;public Son() {super();//默认存在,子类构造器默认访问父类的构造方法}public void methodZi(){System.out.println(super.num);//访问父类的成员变量}public void method(){super.method();//访问父类的成员方法System.out.println("子类中的成员方法");}
}
2.2 this关键字的三种用法
- this关键字的三种用法
- this关键字用于访问本类中的内容
- 1、在本类的成员方法中,访问本类的成员变量
- 2、在本类的成员方法中,访问本类的另外一个成员方法
- 3、在本类的构造方法中,访问本类的另一个构造方法
- 注意事项:super和this两种构造调用,不能同时使用,因为他们都必须在第一行
public class Father {int num = 100;
}
/*** this关键字的三种用法* this关键字用于访问本类中的内容* 1、在本类的成员方法中,访问本类的成员变量* 2、在本类的成员方法中,访问本类的另外一个成员方法* 3、在本类的构造方法中,访问本类的另一个构造方法* 注意事项:super和this两种构造调用,不能同时使用,因为他们都必须在第一行*/
public class Son extends Father{int num = 200;public void methodZi(int num){System.out.println(num);//局部变量System.out.println(this.num);//本类中的成员变量System.out.println(super.num);//父类的成员变量}public void method1(){System.out.println("111");}//在本类中的成员方法中,访问本类中的成员方法public void method2(){this.method1();System.out.println("222");}//无参构造public Son() {this(300);//本类的无参构造调用本类的有参构造}//有参构造public Son(int num) {this.num = num;}
}
2.3 Java继承的三个特点
- 1、Java语言是单继承的。一个子类只能有一个父类
- 2、Java语言可以多级继承。如A的父类是B,B的父类是C,同时C也是A的父类
- 3、一个子类的父类是唯一的,一个父类可以有多个子类
ntln(this.num);//本类中的成员变量
System.out.println(super.num);//父类的成员变量
}
public void method1(){System.out.println("111");
}//在本类中的成员方法中,访问本类中的成员方法
public void method2(){this.method1();System.out.println("222");
}//无参构造
public Son() {this(300);//本类的无参构造调用本类的有参构造
}//有参构造
public Son(int num) {this.num = num;
}
}
## 2.3 Java继承的三个特点- 1、Java语言是单继承的。一个子类只能有一个父类
- 2、Java语言可以多级继承。如A的父类是B,B的父类是C,同时C也是A的父类
- 3、一个子类的父类是唯一的,一个父类可以有多个子类