软件构造学习笔记第七章——面向对象编程

目录

1.基本概念

1.1类方法(静态方法)和实例方法(√)

1.2接口

1.2.1一些简单的注意事项

1.2.2例题1

1.2.3例题2

1.3子类型(subtype)(不是子类subclass)

1.4子类(subclass)

1.4.1严格继承

 1.4.2一些注意点

1.4.3一些题

2.重写(override)和重载(overload)

2.1重写(发生在父与子之间)

2.1.1

​编辑 2.1.3重写的异常和规约

2.2重载

2.3重写和重载的调用和输出

2.3.1重写(在运行阶段才确定使用哪个方法)

2.3.2重载(在编译阶段就确定了使用哪个方法)

2.4重写和重载对比图

3.泛型

4.造型

4.1向上造型

4.2向下造型

5.Object中一些重要的函数

5.1简介

5.1.1equals

5.1.1toString

5.1.2hashCode

5.2重写这些函数

6.编一个良好的类(不赘述)

7.抽象类(简单)


1.基本概念

1.1类方法(静态方法)和实例方法(√)

简单,不赘述。

1.2接口

该部分不详细介绍如何使用接口,只是介绍一下与接口的相关的一些注意事项以及分析一道例题。

1.2.1一些简单的注意事项

①接口不能有构造器,可以在接口里通过静态方法来构造一个相关的类。

(由于接口没有构造器,因此用户使用实现接口的类时必须知道类的名称,如下的FastMyString类是一个实现了MyString接口的类,用户使用它时,如果不知道FastMyString这个类的类名,那么就无法像下面这样new一个FastMyString类)

(但是,如果在接口中通过静态方法来构造一个实现了该接口的类,那么就可以通过接口MyString直接构造这个类,如下图1,首先在接口中通过一个返回类型是MyString类型的静态方法valueOf来构造一个FastMyString的类,然后再如图2通过调用静态方法来构造这个类即可,此时用户并不知道FastMyString的类名,只知道通过调用接口MyString的静态方法valueOf就可以构造一个可以实现FastMyString功能的类)

②实现接口的类不能违背接口的规约。

        编译器会帮我们检查实现接口的类是否正确(正确的函数名、参数类型、返回值类型)实现了所有的接口函数,但并不会帮我们检查我们实现的函数是否满足接口规约。

③接口里只能有默认方法、静态方法、抽象方法和public static final的属性。所有实现接口的类必须实现接口的所有抽象方法。

        关于接口属性——这是在定义了接口里定义一个private int a时出现的报错。

       关于默认方法——默认方法的作用是,如果存在一个接口,此时以及有许多类实现它了,现在想在这个接口上再添加一个许多实现了它的类都需要的共同的具体方法,如果没有默认方法的话,那么就得添加一个抽象方法,并且在所有实现了这个接口的类都要去实现这个抽象方法,十分麻烦,但是如果有默认方法的话,那么直接在接口里实现这个默认方法,然后所有实现了该接口的类都不用实现这个方法并且可以直接使用。默认方法可以被重写,因此,默认方法的存在意义一般是用来兼容。默认方法冲突问题:①接口提供一个默认方法,实现该接口的类是实现了同名且相同参数类型的方法,类优先。②两个接口提供同名且相同参数的方法,一个类同时实现这两个接口,调用该方法就会发生冲突。解决方法是在该类中重写这个方法。③一个类既实现了某一接口且继承了另一个类A,类A和接口有同名且同参数的方法,那么还是类优先。

1.2.2例题1

1.2.3例题2

   

 

1.3子类型(subtype)(不是子类subclass)

如果类B的规约强于类A,那么就说B是A的子类型。

“B is a subtype of A” means “every B is an A.” In terms of specifications: “every B satisfies the specification for A.” 

1.4子类(subclass)

注:子类可以继承父类的私有属性,但不能使用父类的私有方法。

1.4.1严格继承

概念:子类只能添加新方法,不能重写父类中的方法。如果一个方法不能被重写,那么定义该方法时应该使用final修饰,如下。

 1.4.2一些注意点

1.4.3一些题

 

2.重写(override)和重载(overload)

2.1重写(发生在父与子之间)

①签名(signature):方法名以及参数类型(不是参数名)被称为签名,注意,返回类型不是方法签名的一部分。

②重写:重写在保持父类方法签名以及返回值类型不变的情况下,改变函数体的实现。一般重写最好不要改变原有方法的意思。 

2.1.1

        在子类中,一个方法进行重写之后,在编写子类时可以通过super可以调用父类方法,但是在使用子类时,无法直接通过子类对象来调用被重写过的原来的父类方法。

构造器内使用super必须放在第一条语句。

 2.1.3重写的异常和规约

重写后的方法不能抛出更宽的异常(这里的宽自己体会),规约不能变得更更弱(因为父类能做到的,子类必须也能做到)。

2.2重载

概念:(其实一个方法无非就由五部分构成,一是public/private/static等限制关键字,二是返回值类型,三是参数个数和类型,四是方法实现,五是方法名)重载只要要求第五部分相同、第三部分不同,其余任意即可,因此无法重载出两个名字相同、参数类型相同却有不同返回类型的方法。而重写是必须一、二、三、五相同。

2.3重写和重载的调用和输出

首先说一说调用方法时编译阶段编译器做的事情,假设有如下语句:

Animal A = new Dog();//Dog是Animal的子类

A.bark();

那么在静态检查阶段,编译器首先是根据A的变量类型(即Animal)来判断A中是否有bark这一个函数,有的话则通过编译。

接下来说一说在运行阶段做的事情,此时已经通过编译了,由于A在堆上实际存放的是Dog类的对象,因此在调用bark时实际上调用的是Dog中的bark。

2.3.1重写(在运行阶段才确定使用哪个方法)

        还是以上为例,若Animal中也有bark方法,Dog中也有bark方法,则A.bark调用的是Dog中的bark方法。如果想要调用Animal中的bark,那么只能Animal B = new Animal();否则无法直接调用。

2.3.2重载(在编译阶段就确定了使用哪个方法)

        如果是一个类内的重载,即Animal A =new Animal();A.bark();,没什么可说,根据参数类型在Animal内的方法进行选择即可。

        如果是子类对父类的重载,Animal A = new Dog();A.bark();那么选择的就是父类的方法,因为编译器只会根据变量类型来找方法。

        如果是子类对父类的重载,Dog A = new Dog();A.bark();那么就根据参数类型在子类和父类的所有bark方法中选择(因为父类的bark方法也被子类继承了)。

 注:如果类型没有完美匹配的话,编译器会选择一个在允许的前提下的最佳类型进行匹配,如若只有一个方法bark(double a),传入的是bark(1),那也会匹配,如果只有一个方法bark(String a),传入的是bark(1),那就没法匹配了。

2.4重写和重载对比图

3.泛型

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一_VieLei的博客-CSDN博客_java 泛型

4.造型

造型和类型强转很相似,但是类型强转是真正地把内存中的类型给改变了,而造型是将某一类型当作另一类型来看待,内存中存储不变。

4.1向上造型

假设Animal是Dog的父类,有以下语句:

Dog A = new Dog();

Animal AA = (Animal)A;

称为向上造型,向上造型总是安全的。

4.2向下造型

假设Animal是Dog的父类,有以下语句:

Animal A = new Animal();

Dog AA = (Dog)A;

称为向下造型,向下造型不安全不推荐。因为可能Dog中有的方法在Animal中有,然后将一个实际类型为Animal向下造型为Dog时,可能无意间想调用Dog的方法,然后在运行时发现没有,就会出错。

5.Object中一些重要的函数

Object中所有的函数如下:

5.1简介

5.1.1equals

存在空引用则返回false,否则,x.equals(y)返回ture当且仅当x和y引用同一对象。

5.1.1toString

即转为字符串表示。

5.1.2hashCode

一个哈希表。

5.2重写这些函数

因为有时我们编写的类想判断相等和object的相等不一样,比如编写一个MyString类,判断相等我们想的更希望它是只要字符串长得相等那就是相等,不一定是非得引用用一个字符串。因此我们需要重写equals这个方法。以下是误区。

应该是这样:

6.编一个良好的类(不赘述)

7.抽象类(简单)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值