[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oshUoeln-1686188016077)(photo/JavaSE08_面向对象之继承.assest/1664783489643.png)]
继承的格式
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)]
/**
* 父类
*/
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);//200
System.out.println("------------------");
//2、间接通过成员方法访问成员变量
s.getFileds2();//200 该方法属于谁,就优先用谁,没有则向上找
f.getFileds1();//100
}
}
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)]
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)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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{
//方法名相同,参数列表相同
@Override
public void work(int a,int b){
System.out.println("子类重写父类的方法");
}
//子类的返回值类型要小于等于父类
public String watch(){
System.out.println("父亲在看电视");
return "新闻联播";
}
//子类的访问修饰符要大于等于父类
//权限修饰符大到小 public > protected > default > private
public int add(){
return 3;
}
}
对于已经使用的类,尽量不要进行修改,推荐定义一个新的类,进而重复利用其中的共性内容,同时添加新的内容
/**
* 父类:按键手机
*/
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方法
@Override
public 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)]
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)]
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("子类中的成员方法");
}
}
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;
}
}
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、一个子类的父类是唯一的,一个父类可以有多个子类