一、面向对象
![0458f6b8b1fe4e28b534793623f8c51f.jpg](https://i-blog.csdnimg.cn/blog_migrate/fe38e9e82ed1bbfff95553d01f9f4248.jpeg)
![a3a92edf74d2497c823e8d55ba5189ca.jpg](https://i-blog.csdnimg.cn/blog_migrate/b4519372e9b73b9051d6cd055189587a.jpeg)
![cda46c50d4f9437594ea1e5a71505eaa.jpg](https://i-blog.csdnimg.cn/blog_migrate/78239035932c963d712e2d3edc65aa26.jpeg)
类名 对象名称=new类名();
例如,创建Person类的实例对象代码如下:
Person p = new Person();
![74f1f4326f7d497cb30ead41f4026afe.jpg](https://i-blog.csdnimg.cn/blog_migrate/4eb9b102c7195bdeb16dee7302320f94.jpeg)
![232f1f9f71d5400cb488b27584113ecc.jpg](https://i-blog.csdnimg.cn/blog_migrate/28886b40c743ccc33c68cf2419e85ec5.jpeg)
![50263a7ce9084fb48ed2c0c0e6745aaf.jpg](https://i-blog.csdnimg.cn/blog_migrate/c1b1b3ebfeb53d9b26116c9821498f56.jpeg)
![664e2992977745ba96cf7374f9382ef1.jpg](https://i-blog.csdnimg.cn/blog_migrate/f802ed4baa179aed66f8d985c2760406.jpeg)
![106d8420ad8a44c393aa0413b005c113.jpg](https://i-blog.csdnimg.cn/blog_migrate/e490213cc816b66f4d64af7fa5d5ad5f.jpeg)
![f49b0cef40674536bc68b7d7e271d45a.jpg](https://i-blog.csdnimg.cn/blog_migrate/37dd8591b703a76f9dc625eda61c067e.jpeg)
构造方法的重载
![3fdd7cd94fff4d24b4ae082122681e52.jpg](https://i-blog.csdnimg.cn/blog_migrate/0c3404b66817170085e37bd5dae1989e.jpeg)
![b7f4b942249b4c1fa90ae1fca90c5089.jpg](https://i-blog.csdnimg.cn/blog_migrate/3c430e7585f46543950543c59f9d0f37.jpeg)
![672e7299a4fe4d4281f57f43196c16ba.jpg](https://i-blog.csdnimg.cn/blog_migrate/07a70fa91b6e956647a4b055fc7e8f65.jpeg)
3.6 static关键字
静态方法
在实际开发时,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,换句话说也就是使该方法不必和对象绑在一起。要实现这样的效果,只需要在类中定义的方法前加上static关键字即可,通常称这种方法为静态方法。同静态变量一样,静态方法可以使用“类名.方法名”的方式来访问,也可以通过类的实例对象来访问。
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
静态代码块
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
3.7成员内部类
成员内部类
在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为:成员内部类、静态内部类、方法内部类。本小节将针对成员内部类进行讲解。
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。在成员内部类中,可以访问外部类的所有成员。
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下:
外部类名.内部类名变里名= new 外部类名().new 内部类名();
[任务3-2]银行新用户现金业务办理
第4面向对象(下)
4.1 类的继承
继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。同理,波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗。这些动物之间会形成一个继承体系。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
在类的继承中,需要注意一些问题,具体如下:
1.在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类。
2.多个类可以继承一个交类。
3.在Java中,多层继承是可以的,既一个类的父类可以再去继承另外的父类。
重写父类方法
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
文件4-1中,Dog类从Animal类继承了shout()方法,该方法在被调用时会打印“动物发出叫声”,这明显不能描述一种具体动物的叫声,Dog类对象表示犬类,发出的叫声应该是“汪汪汪”。
super关键字
当子类重写父类的方法后,于类对象将无法访问父类被重写的方法,为了解决这个问题,在Java中专门提供了一个super关键字用于访问父类的成员。例如访问父类的成员变量、成员方法和构造方法。接下来分两种情况来学习一下super关键字的具体用法。
1.使用super关键字访问父类的成员变量和成员方法。具体格式如下:
super.成员变量
super-成员方法([参数1,参数2……])
2.使用super关键字访问父类的构造方法。具体格式如下:
super([参数 1,参数 2……])
4.2 final关键字
final关键字修饰类
JAVA中的类被final关键字修饰后,该类将不可能被继承,也就是不能够派生子类。
final关键字可用于修饰类、变量和方法,它有“无法改变”或者“最终”的含义,因此被final修饰的类、变量和方法将具有以下特性:
• final修饰的类不能被继承。
• final修饰的方法不能被子类重写。
• final修饰的变量(成员变量和局部变量)是常量,只能赋值一次。
4.3抽象类和接口
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这方法的实现方式是无法确定的。例如前面在定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方中无法准确描述动物的叫声。
针对上面描述的情况,Java允许在定义方法时不写方法体,不包含方法体的力法为抽象方法,抽象方法必须使用abstract关键字来修饰,具体示例如下:
abotractvoid about [1] //定义独象方适abcut ();
当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用 abstract关键字修饰的类为抽象类。
在定义抽象类时需要注意,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需使用abstract关键字来修饰即可。另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用拍象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。接口是由常量和抽象方法组成的特殊类,是对抽象类的进一步抽象。在定义接口时,需要使用interface关键字来声明。
在上面的语法中,一个接口可以有多个父接口,他们之间用逗号隔开。Java使用接口的目的是为了克服单继承的限制,因为一个类只能有一个父类,而一个类可以实现多个接口。接口中的变量默认使用“public staticfinal”来修饰,即全局常量:接口中定义的方法默认使用“public abstract”来修饰,即抽象方法如果接口声明为public,则接口中的变量和方法全部为public由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口
中的方法。此时需要定义一个类,并使用implements关键字实现接口中所有的方法。一个类可以在继承的同时实现多个接口。
为了加深初学者对接口的认识,接下来对接口的特点进行归纳,具体如下:,接口中的方法都是抽象的,不能实例化对象。接口中的属性只能是常量。当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则需要实现换口中的所有方法。一个类通过implements关键字实现换口时,可以实现多个接口,被实现的多个接口之闹要用通号隔开。
个接口可以通过extends关键字维承多个接口,接口之间用道号隔开。一个类在继承另一个类的同时还可以实现接口。
4.4 多态
在设计一个方法时,通常希望该方法具备一定的通用性。例如要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声,在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态,继承是多态得以实现的基础。
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。
在多态的学习中,涉及到将子类对象当作父类类型使用的情况,此种情况在 lava的语言环境中称之为“向上转型”。
将子类对象当作父类使用时不需要任何显式地声明,需要注意的是,此时不能通过父类变量去调用子类中的特有方法。
在JDK中提供了一个Object类,它是类层次结构的根类,每个类都直接或间接继承自该类,所有对象(包括数组)都实现了这个类的方法。Object类中的常用方法如下表所示。
在Object类中定义了toString()方法,在该方法中输出了对象的基本信息。
在编写Java程序时,在类星面定义的类称之为内部类(InnerClass),内部类是外部类的一个成员。Java内部类可以分为:成员内部类、方法内部类和医名内部类等,在前国多志的讲解中,如果方法的参数被定义为一个接口类型,那么就需要定义一个类来实现接口,并根据该类进行对象实例化,除此之外,还可以使用匿名内部类来实现接口。所谓匿名内部类就是没有名字的内部类,表面上看起来它似乎有名字,实际那不是它的名字,当程序中使用医名内部类时,在定义类名内部类的地方往往直接创建该类的一个对象。