
Java学习笔记(四)——面向对象(下)
软件构造
一、方法的重载与重写
1.方法重载是指在一个类中定义多个同名方法,但这些方法都具有不同的参数类型和个数。
方法重载一般用于创建一组任务相似但是参数不同的方法。
2.方法重载的规则:
- 方法中的参数列表必须不同。如个数或类型不同。
- 方法的访问修饰符和返回类型可以不同。
- 方法的检查异常可以更新或更广。
3.方法重写是指子类对父类的允许访问的方法的实现过程进行重新编写,但是不能改变返回值和参数列表。
4.方法重写的规则:
- 参数列表和返回类型必须完全相同。
- 访问权限必须高于父类方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反正则可以。
- 构造方法不能重写。
二、多态
多态是指允许不同类的对象对同一消息作出响应。即同一消息可以根据发送对象对不同而采用多种不同的行为方式。多态也称动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
也就是说,只通过父类就能够引用不同的子类,我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
1.使用多态时,往往我们会用父类引用子类,在这个过程中,发生的是向上转型。如果子类向上转型成了父类,我们对这个对象引用的属性和方法,既可能是来自父类的,也可能是来自子类的,判断方法为:
- 如果该属性或方法在父类和子类中都有且相同,则使用父类的方法。
- 如果该属性或方法在父类和子类中都有,但子类对其进行了重写,则使用子类重写过的方法。 (如果想使用父类方法,使用super关键字)。
- 如果该属性或方法方法仅在子类中有,则不可调用(编译会 错)。
2.多态的实现条件:
- 继承。如果没有继承便无子类父类,也就不能完成多态。
- 重写。如果子类不对父类中的方法进行重写,那用父类引用子类产生的动作和父类引用父类自身没有区别,多态名存实亡。
- 向上转型。如果不用父类引用子类,那么无法利用子类继承和重写的差异,失去了多态的意义。
3.Java中多态的实现方式:
- 继承,重写。刚刚写过这是多态实现的必要条件。
- 抽象类和抽象方法。后面会写到。
- 接口实现。后面会写到。
三、抽象类
在定义类时,前面加上关键字修饰的类叫做抽象类。抽象类中的方法叫抽象方法,声明方法时在前面加上修饰,这种方法是不完整的,仅有声明而没有方法体,因此抽象类实际上是给类制作的一种模版。
1.使用抽象类的场景: 当我们只想规定子类应该包含何种方法,而不关心具体实现时,我们可以使用抽象类去规定,然后在子类中实现。事实上,我们可以使用抽象类来衍生出一系列具有相同或相似方法的一类“类”。
2.使用抽象类必须注意注意:
- 抽象类不能实例化对象,只能被继承。
- 抽象类中的方法可以是抽象方法,也可以是普通方法,抽象方法被继承后必须重写。
- 只有抽象类中才可以定义抽象方法。
- 构造方法、类方法不能声明为抽象方法。
四、接口
接口用于描述类所具有的功能,而不提供功能的实现,功能的实现需要写在实现接口的类中,并且该类必须实现接口中所有的未实现的方法。
接口的声明语法格式如下:
接口之间也可以像类之间的继承一样继承,同时,虽然Java中没有多继承,但是我们可以通过接口来实现多继承。
通过继承接口来声明一个类:
五、内部类
将一个类的定义放在另一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类。
内部类的作用:
- 内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其它类访问该类。
- 内部类的方法可以直接访问外部类的所有数据,包括私有数据。
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
- 内部类允许继承多个非接口类型,具体后面写。
内部类是一个编译时概念,一旦编译成功,会成为两个完全不同的类,因此内部类的成员变量和方法名可以和外部类相同。
内部类有4种,每一种不尽相同:
1.成员内部类
- 内部类相当于外部类的一个成员变量,所以内部类可以使用任意访问修饰符。
- 内部类可以访问外部类的所有属性和方法,反之则不可以。
- 定义内部类之后,只能用外部类对象来创建内部类对象,即
如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用this关键字。
成员内部类不能含有static的变量和方法,因为成员内部类需要先创建了外部类,才能创建他自己的。
2.静态内部类(嵌套类)
- 静态内部类不能直接访问外部类的非静态成员,但可以通过的方式访问。
- 如果外部类的静态成员与内部类的成员名称相同,可通过访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可以通过直接调用外部类的静态成员。
- 创建静态内部类的对象时,不需要外部类的对象,可以直接创建。
3.局部内部类:定义在方法或作用域的内部类 局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用。
4.匿名内部类 这种类没有名字,通常是用来简化代码编写的。使用这种类有一个条件:必须继承父类或者实现一个接口。
- 匿名内部类不能加访问修饰符。
- 必须先使用定义匿名类。
- 内部类幸参必须为。 关于匿名内部类的初始化,我也不是很懂,等待你的指导,或者我后面再学到吧
六、包package
为了更好的组织类,Java提供包机制来区别类名的命名空间。
1.包的作用
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 包采用了树形目录的存储方式。同一个包中类的名字是不同的,不同的包中的类的名字可以是不同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别,
- 包限定类访问权限,拥有包访问权限的类才能访问某个包中的类
2.定义包的语法
必须放在程序的第一行,包名可用”.”隔开。
3.如果要在不同包中使用另一个包中的类,则可以使用关键字。
如果要引入一个包中所有的类,则可以使用
相关资源:若为自由故:自由软件之父理查德·斯托曼传-讲义文档类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!