2022.7.24
上周学习了java中的继承和派生,本周继续学习这一部分,首先是一个例子
public class Employee{
String name;
public void work()
{
System.out.println(“打工人打工魂”);
}
}
class Developer extends Employee {
public void printName()
{
System.out.println(“name=”+name);
}
}
public class E1 {
public static void main(String[] args) {
Developer d = new Developer ();//创建一个对象
d.name=”小明”;//赋值
d.printName(); //调用函数进行输出
d.work();调用函数进行输出
}
}
在这个例子中,通过Developer运用extends关键字继承Employee的方式,对父类的name和work()函数进行了访问。
继承这一方式的好处是提高了代码的复用性,可以提高软件开发效率,同时让类和类之间产生了联系,是多态的前提
以上的内容与C++中的继承是很类似的,但是在java中也有一些其他的注意事项,例如,在java中只支持单继承,即一个类只能有一个父类,但是多个类可以继承一个父类,在java中支持多层继承,举例来说,B继承了A,C继承了B,那C也可以称作A的子类。
2022.7.25
今天继续看继承中父子类中成员变量的特点,举例来说
class Fulei
{
int a=5;
}
class Zilei extends Fulei
{
int b=4;
public void show()
{
System.out.println(“a=”+a);
System.out.println(“b=”+b);
}
}
class Demo
{
public static void main(String[] args)
{
Zilei z=new Zilei();
z.show();
}
}
上述例子说明,在java中父类的成员变量是非私有的,子类可以直接访问,若父类的成员变量私有则不能直接访问。
当父子类中出现了同名变量时,若想访问父类中的变量,需要使用关键词super,例子如下
class Fulei
{
int a=5;
}
class Zilei extends Fulei
{
int a=4;
public void show()
{
System.out.println(“a=”+super.a);
System.out.println(“zi a=”+this.a);
}
}
class Demo
{
public static void main(String[] args)
{
Zilei z=new Zilei();
z.show();
}
}
2022.7.26
今天学习在继承中,父子类的成员函数的重写和应用
程序通过对象调用函数时,会先在子类中查找,若存在则执行,若不存在则会执行父类中相应的方法,举例来说
class Fu{
public void show(){
System.out.println(“Fu类中的show方法执行”);
}
}
class Zi extends Fu{
public void show2(){
System.out.println(“Zi类中的show2方法执行”);
}
}
public class Test{
public static void main(String[] args) {
Zi z = new Zi();
z.show(); //子类中没有show方法,但是可以找到父类方法去执行
z.show2();
}
}
此外,对于成员函数还有一种特殊情况,即覆盖
当子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖,举例如下
class Fu
{
public void show()
{
System.out.println(“Fu show”);
}
}
class Zi extends Fu
{
//子类复写了父类的show方法
public void show()
{
System.out.println(“Zi show”);
}
}
2022.7.27
今天继续学习函数重写(覆盖)的应用
当子类需要父类的功能时,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
举例来说,比如手机,当描述一个手机时,它具有发短信,打电话,显示来电号码功能,后期由于手机需要在来电显示功能中增加显示姓名和头像,这时可以重新定义一个类描述智能手机,并继承原有描述手机的类。并在新定义的类中覆盖来电显示功能,在其中增加显示姓名和头像功能。
在子类中,访问父类中的成员方法格式为 super.父类成员函数(); 举例如下
//手机类
class Phone{
public void sendMessage(){
System.out.println(“发短信”);
}
public void call(){
System.out.println(“打电话”);
}
public void showNum(){
System.out.println(“来电显示号码”);
}
}
//智能手机类
class NewPhone extends Phone{
//覆盖父类的来电显示号码功能,并增加自己的显示姓名和图片功能
public void showNum(){
//调用父类已经存在的功能使用super
super.showNum();
//增加自己特有显示姓名和图片功能
System.out.println(“显示来电姓名”);
System.out.println(“显示头像”);
}
}
2022.7.28
重载与重写的区别
先说重载,修饰符用的是 public/private/默认:无关
重载时两个函数的函数名必须相同
形参类型的顺序、个数或者类型不同,三者至少满足一个,重载类型与返回值类型无关
重写的修饰符同样是public/private/默认:无关,子类函数的权限>=父类函数的权限
函数名:子类函数与父类函数的函数名必须相同
形参列表:子类函数和父类函数的形参列表必须相同,返回值类型和基本数据类型也必须相同,子类函数的返回值类型和父类函数的返回值类型相同,或者子类函数的返回值类型是父类函数返回值类型的子类
抽象类的学习如下
与C++中的抽象类似,是发现了事物共性的内容,向上抽取的来的产物,在java中的关键字是abstract(抽象),被它修饰的类是抽象类
定义如下:
public abstract 返回值类型 函数名 (参数);
abstract class 类名{}
例如
abstract class Developer {
public abstract void work();
}
class JavaEE extends Developer {
public void work(){
System.out.println(“正在努力学习“);
}
}
class Android extends Developer {
public void work(){
System.out.println(“也在努力学习”);
}
}
2022.7.29
今天继续学习抽象类的特点
1、首先来说,抽象类和抽象函数都被关键子abstract修饰,抽象函数一定要定义在抽象类中
2、与C++一致地,抽象类不可以直接创建对象,是因为调用抽象函数没有意义
3、只有覆盖了抽象类中的所有的抽象函数后,这个子类才可以创建对象,否则该子类还是一个抽象类
抽象类的细节问题:
1、抽象类一定是个父类? 是的,因为不断抽取而来的。
2、抽象类中是否可以不定义抽象方法。是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用
3、抽象关键字abstract不可以和哪些关键字共存?
private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
2022.7.30
今天看一道整体的从网上查来的例题,关于java中的员工类的系列定义
题目如下:
某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)。研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师。
公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。
工作内容
JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机
请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系。进行XX工程师类的对象创建,完成工作方法的调用。
代码如下:
public abstract class Employee{
private: String id;
private String name;
public String getId()
{
return id;
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public abstract void work();
}
public abstract class Developer extends Employee{
}
public abstract class Maintainer extends Employee
{}
public class JavaEE extends Developer {
@Override
public void work() {
System.out.println(“员工号为 ” + getId() + ” 的 ” + getName() + ” 员工,正在研发淘宝网站”);
}
}
public class Android extends Developer {
@Override
public void work() {
System.out.println(“员工号为 ” + getId() + ” 的 ” + getName() + ” 员工,正在研发淘宝手机客户端软件”);
}
}
public class Network extends Maintainer {
@Override
public void work() {
System.out.println(“员工号为 ” + getId() + ” 的 ” + getName() + ” 员工,正在检查网络是否畅通”);
}
}
public class Hardware extends Maintainer {
@Override
public void work() {
System.out.println(“员工号为 ” + getId() + ” 的 ” + getName() + ” 员工,正在修复打印机”);
}
}
public class Test {
public static void main(String[] args) {
//创建JavaEE工程师员工对象
JavaEE ee = new JavaEE();
//设置该员工的编号
ee.setId(“000015”);
//设置该员工的姓名
ee.setName(“小明”);
//调用该员工的工作方法
ee.work();
}
}
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/277703.html