面向对象2:继承

news/2025/2/21 7:26:37/

目录

2.1继承

2.2 继承的好处

2.3 权限修饰符

2.4 单继承、Object

2.5 方法重写

2.6 子类中访问成员的特点

2.7 子类中访问构造器的特点



面向对象1:静态

2.1继承

向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是因为它有三大特征,继承、封装和多态

接下来,使用继承来编写代码,注意观察继承的特点。

public class A{//公开的成员public int i;public void print1(){System.out.println("===print1===");}//私有的成员private int j;private void print2(){System.out.println("===print2===");}
}

然后,写一个B类,让B类继承A类。在继承A类的同时,B类中新增一个方法print3

public class B extends A{public void print3(){//由于i和print1是属于父类A的公有成员,在子类中可以直接被使用System.out.println(i); //正确print1(); //正确//由于j和print2是属于父类A的私有成员,在子类中不可以被使用System.out.println(j); //错误print2();}
}

接下来,我们再演示一下,创建B类对象,能否调用父类A的成员。再写一个测试类

public class Test{public static void main(String[] args){B b = new B();//父类公有成员,子类对象是可以调用的System.out.println(i); //正确b.print1();//父类私有成员,子类对象时不可以调用的System.out.println(j); //错误b.print2(); //错误}
}

来看看继承的内存原理。

子类对象实际上是由子、父类两张设计图共同创建出来的。

所以,在子类对象的空间中,既有本类的成员,也有父类的成员。但是子类只能调用父类公有的成员。

 

2.2 继承的好处

  • 先写一个父类 People,用来设计Teacher和Consultant公有的成员。

public class People{private String name;public String getName(){return name;}public void setName(String name){this.name=name;}
}
  • 再写两个子类Teacher继承People类,同时在子类中加上自己特有的成员。

public class Teacher extends People{private String skill; //技能public String getSkill(){return skill;}public void setSkill(String skill){this.skill=skill;}public void printInfo(){System.out.println(getName()+"具备的技能:"+skill);}
}
  • 最后再写一个测试类,再测试类中创建Teacher、Consultant对象,并调用方法。

public class Test {public static void main(String[] args) {// 目标:搞清楚继承的好处。Teacher t = new Teacher();t.setName("播仔");t.setSkill("Java、Spring");System.out.println(t.getName());System.out.println(t.getSkill());t.printInfo();}
}

执行代码,打印结果如下:

只需要记住 :继承可以提高代码的复用性  

2.3 权限修饰符

在刚才使用继承编写的代码中我们有用到两个权限修饰符,一个是public(公有的)、一个是private(私有的),实际上还有两个权限修饰符,一个是protected(受保护的)、一个是缺省的(不写任何修饰符)。

什么是权限修饰符呢?

权限修饰符是用来限制类的成员(成员变量、成员方法、构造器...)能够被访问的范围。

每一种权限修饰符能够被访问的范围如下  

2.4 单继承、Object

Java语言只支持单继承,不支持多继承,但是可以多层继承

2.5 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

 注意:重写后,方法的访问遵循就近原则。下面我们看一个代码演示

写一个A类作为父类,定义两个方法print1和print2

public class A {public void print1(){System.out.println("111");}
​public void print2(int a, int b){System.out.println("111111");}
}

再写一个B类作为A类的子类,重写print1和print2方法。

public class B extends A{// 方法重写@Override // 安全,可读性好public void print1(){System.out.println("666");}
​
​// 方法重写@Overridepublic void print2(int a, int b){System.out.println("666666");}
}

接下来,在测试类中创建B类对象,调用方法

public class Test {public static void main(String[] args) {// 目标:认识方法重写,掌握方法重写的常见应用场景。B b =  new B();b.print1();b.print2(2, 3);}
}

执行代码,我们发现真正执行的是B类中的print1和print2方法

 

知道什么是方法重写之后,还有一些注意事项,需要和大家分享一下。

- 1.重写的方法上面,可以加一个注解@Override,用于标注这个方法是复写的父类方法
- 2.子类复写父类方法时,访问权限必须大于或者等于父类方法的权限public > protected > 缺省
- 3. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
- 4. 私有方法、静态方法不能被重写,如果重写会报错。

关于这些注意事项( 总结起来就8个字:声明不变,重新实现

 

方法重写的应用场景

方法重写的应用场景之一就是:子类重写Object的toString()方法,以便返回对象的内容。

2.6 子类中访问成员的特点

原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的  

2.7 子类中访问构造器的特点

子类中访问构造器的语法规则

  • 首先,子类全部构造器,都会先调用父类构造器,再执行自己。

    执行顺序,如下图按照① ② ③ 步骤执行:

 

子类访问构造器的应用场景

  • 如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。

 

时候我们也需要访问自己类的构造器。语法如下

this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器

 this和super的用法在总结一下 ​​​​​​​访问本类成员:
    this.成员变量    //访问本类成员变量
    this.成员方法    //调用本类成员方法
    this()           //调用本类空参数构造器
    this(参数)      //调用本类有参数构造器
    
访问父类成员:
    super.成员变量    //访问父类成员变量
    super.成员方法    //调用父类成员方法
    super()           //调用父类空参数构造器
    super(参数)      //调用父类有参数构造器
    
注意:this和super访问构造方法,只能用到构造方法的第一句,否则会报错。


http://www.ppmy.cn/news/1350522.html

相关文章

下个目标,突破 10w+

转眼间,2023 年已经过去了,今天是大年初四,还有十来天就马上除夕了,迈入新的一年。 回顾 2023 年,如果让我给自己打分,我算是 7.5 分吧。 在这一年了,工作上表现平平,并没有什么突…

【Java】案例:检测MySQL是否存在某数据库,没有则创建

1.代码 package hello; import java.sql.*;public class CeShi {//定义基本数据static final String JDBC_DRIVER "com.mysql.cj.jdbc.Driver";static final String DB_URL "jdbc:mysql://localhost/";static final String USER "your_username&q…

Dubbo集成Zookeeper embbed模式

为了简化应用支持服务方便的分合,使用Zookeeper embbed模式。集成Zookeeper比较容易,使用starter或自己写代码都可以。但是由于集成了Dubbo,每次启动时都会发现zookeeper没有启动就开始报错退出,但是确是已经集成了。 于是只能翻…

C++:面向对象——类的构造

1.1学会面向对象的编程思想 面向对象的英文缩写是OO,它是一种设计思想。 面向对象有3大特点:封装、继承和多态。 1.封装 封装有两个作用,一个是将不同的小对象封装成一个大对象;另外一个是把一部分内部属性和功能对外界屏蔽。…

基于JAVA开发的数字化智慧工地管理平台源码,可私有化部署、带可视化大屏

智能工地应用价值 智慧工地现场构建了基于物联网的智能化数据传感器通用的管理平台。利用计算机、人工智能、无线通信,全天候现场监视、施工检查、质量管理、服务,提高数字化管理、安全、绿色、施工等现场管理能力,标志着现场管理进入信息化时…

蓝桥杯每日一题之内存问题

蓝桥杯真题---内存问题 题目描述: 小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。 为了简化问题,变量的类型只有以下三种: int:整型变量,一个 int 型变量占用 4 Byte 的内存空间。 long&#xff…

渗透测试练习题解析 3(CTF web)

1、[网鼎杯 2020 朱雀组]phpweb 1 考点:反序列化漏洞利用 进入靶场,查看检查信息,发现存在两个参数 func 和 p 查看页面源代码 payload:funcfile_get_contents&pphp://filter/resourceindex.php 整理后,就是 PHP 代…

【More Effective C++】条款17:考虑使用lazy evaluation

含义:将计算拖延到必须计算的时候,以下为4个场景 优点:避免不必要的计算,节省成本 缺点: 管理复杂性:可能会增加代码复杂性,特别是在多线程环境中需要正确处理同步和并发问题。性能开销&…