博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java面向对象
阅读量:2242 次
发布时间:2019-05-09

本文共 5111 字,大约阅读时间需要 17 分钟。

一、Java类和对象

    是JDK里自带的Java类或程序员自己创建的类,如java.lang.String类 、java.lang.System类或java.uitl.Scanner类......Java语言中,除了package和import,变量、表达式、程序控制、数组、函数包括main函数等,一切都在类中。

二、构造方法

三、this和super

    在C++中,this指当前实例本身的指针,this->属性名用以代表某个属性,Java中this指的就是当前实例本身。实际开发中,此关键字都是在类的定义过程中,用在构造函数或者成员函数的函数体中。this.属性名用以代表当前类的某个属性;this.方法名(参数列表)用以代表当前类的某个方法;构造函数中super(参数列表)用以调用当前类的其他构造函数。

    在C++中,没有super这个关键字;Java中super指的就是当前类的父类。实际开发中,此关键字都是在类的定义过程中,用在构造函数或者成员函数的函数体中。super.属性名用以代表当前类的父类中的某个属性;super.方法名(参数列表)用以代表当前类的父类中的某个方法。构造函数中super(参数列表)用以调用父类的构造函数。

四、方法重载

   在一个类的内部,只要方法名相同,形参列表(类型、顺序和个数)不同,就可以形成重载关系(和返回类型、函数属性和形参名末关系),在方法被调用时根据参数列表自动进行重载匹配选择合适的某个方法。方法重载适用在多个构造方法之间或多个成员方法之间。

   在继承关系中,子类经常会从父类中继承一部分方法到本身中,此时如果方法名相同、参数列表不同、返回类型可同可异,从父类继承的和子类提供的这一批方法也会在子类中形成重载关系。

   方法重载的好处就是使用者调用此方法:比如System.out.println()方法可以处理各种类型且个数随意的内容,说明在java/lang/System类中此方法肯定有多个重载版本,开发者只需要知道这个方法的名字就可以了。

   方法重载从功能上是多态的一种。

 

五、Java的访问权限控制

  Java中的访问权限共有四个级别,分别是public、protected和默认、private,public防控最弱,private防控最强,用以控制属性、构造方法和成员方法、类,JAVA允许声明类中类但使用极少就不分析了。其中main方法固定用public属性,基本不会改变。

   和C++比较最重要的两点不同:

   1、C++里没有包的概念,没有默认的权限

   2、C++里protected属性用于区分子类和非子类,Java里用以区分同包和非同包。

1、修饰类

2、修饰属性、构造方法和成员方法

六、封装

    封装是面向对象编程的三大思想之一,也是最基础的思想,就是把属性和方法封装在一个类中,再把此类实例化为对象。具体在java编程中,就是除了package和import语句外,项目代码中的一切,比如变量、表达式、程序控制、数组、函数包括main函数等,一切都在类中,类和对象的细节具体请看《一、Java类和对象》。和C++相比,Java是完完全去的面向对象,因为C++允许定义全局变量、全局函数等,在类的外部也有可执行的代码。

    封装可以提高安全性,使用方便。比如把属性用private控制,方法用public控制,外部无法直接访问私有属性,只能通过这个公有的接口访问私有属性。

七、JavaBean类

     JavaBean是项目开发中,设计类的一种约定俗称的习惯,主要目的就是保护数据的安全,但同时也提供外部访问数据的公有接口。对类的设计有三点要求:

    1、属性私有(使用private修饰属性)

    2、必须要有一个空参的构造方法

    3、必须有public修饰的get/set方法来访问私有属性

八、继承

    继承也是面向对象编程的三大思想之一,被继承的类是父类,继承的被称为子类,子类可以继承父类的方法和属性(但是某些权限的属性和方法子类中访问时编译报错)而不用单独再写一套代码,如此便实现了代码复用的目的。

1、能继承哪些类和成员

2、继承中的构造方法

    创建子类对象时,子类的构造方法必须要调用父类的构造方法,可以是隐式得调用父类的空参构造也可以是显示得调用父类的带参构造,反正就是要调用一个,因为先有父才能有子。

2.1、父类有空参构造方法

   这种情况下,子类可以任意设计自己的构造方法,因为创建子类对象时,子类的构造方法被调用时如果没有显示得调用父类的某个带参构造就会隐式得调用父类的空参构造。

2.2、父类没有空参构造方法

   这种情况下,子类的某个构造方法必须要在第一行显示得调用父类的某个构造方法,调用方法就是super(匹配父类的某个构造方法的实参列表)。

3、变量的隐藏和方法重写

   变量隐藏:在继承关系中,子类经常会从父类中继承一部分属性到本身中,此时如果子类提供了和这些属性重名的属性,那么子类中的就会覆盖/隐藏从父类中继承的。所以在子类中以默认方式或者通过子类对象使用这些属性时,实际使用的是子类中的版本,但是可以在子类中通过super.属性名使用父类中的版本。

   方法重写:在继承关系中,子类经常会从父类中继承一部分方法到本身中,此时如果

1、子类提供了和这些方法返回类型、方法名和参数列表都一致且

2、子类权限不小于父类权限且

3、子类throws的异常类型包含在父类(可以是多个子异常)中的方法(补充一:仅限于可控式异常和自定义异常,运行时异常无此限制;补充二:仅仅是俩方法后的throws语句对覆盖关系有影响,方法内部产生的异常及thorw的异常也不会影响覆盖关系)。

那么子类中的就会重写/覆盖从父类中继承的。所以在子类中以默认方式或者通过子类对象使用这些方法时,实际使用的是子类中的版本,但是可以在子类中通过super. 方法名使用父类中的版本。

4、子类对象

九、static关键字

1、静态属性和静态方法

    static关键字用于在类中声明静态属性和静态方法,这种成员属于类本身而不属于对象,因此往往是通过类访问静态成员。而实体属性和实体方法属于对象不属于类,在创建对象时才真正产生,也只能通过对象访问。

    补充一:static不能修饰构造/成员函数里的变量和方法,如main函数里的。

    补充二:构造方法不可以为静态,否则编译报错。

    说明三:静态成员也可以被继承。

2、静态代码块

  Java支持在类中定义一段代码块,每次创建对象的时候,都会在调用构造函数之前先执行这段代码块。static可用于定义静态代码块,不管创建多少个对象,都只执行第一次。企业开发中,通常使用静态代码块来执行一些初始化操作。

十、设计模式

1、单例模式

    是软件工程中23种设计模式最常见的一种,此模式要求单例对象的类必须保证只能创建一个实例,其中会提供一个全局的访问接口。

     使用场景:许多时候,整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。1、比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式就简化了在复杂环境下的配置管理。2、再比如数据库连接池的设计一般也采用单例模式,银行系统中对数据库的访往往是通过一个对象进行的,不会有多余对象有权限访问数据库,这种方式就保证了数据库的安全性。3、还比如在BBS、SNS等网站中,一般会有“当前在线人数”这项需求,按照面向对象的设计思想,就可以把它设计为“在线计数器”这样一个单例类,因为只需要一个计数器对象就可以供网站任何用到计数器的地方使用了,有用户登录就把类中的static计数属性加一,有用户退出就把类中的static计数属性减一。

1.1、饿汉式单例

    该单例类非常饿,迫切需要吃东西,所以不会判断是否已有对象,在类加载的时候就立即创建对象。从用户体验的角度来说,我们应该首选饿汉模式,因为用户愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉。

1.2、懒汉式单例

    该单例类非常懒,只有在自身需要对象的时候,才判断是否已有对象,如果没有就创建一个对象,然后返回此对象,如果已有对象就不再创建,直接返回已有对象。

 

2、工厂模式

    所谓工厂就是对象的工厂,项目中常利用工厂模式对同一模块的对象进行集中管理。工厂模式可以细分为三种,简单/静态工厂模式,工厂方法模式和抽象工厂模式。工厂方法模式和抽象工厂模式都是把工厂类定义为抽象类或者接口,依赖子类或者实现类去管理对象,比较复杂,这里只介绍简单/静态模式:

     做法:定义一个非抽类,在类中进行判断创建需要的功能类,并提供被外部访问的静态接口。

    优点:不必使用具体的子类或者实现类去创建所需功能类的实例。

         缺点:新增一个功能类就需要在工厂类中增加一个判断。

   12.3中利用的就是简单工厂类管理每种数据库的对象。

十一、final关键字

1、修饰普通变量或成员变量

2、修饰成员方法

3、修饰类

十二、Java多态

    多态就是指程序中声明的对象变量所指向的具体类型和通过该对象变量发出的方法调用在开发时并不确定,而是在程序运行期间才确定,即一个对象变量倒底会指向哪个类的实例对象,该对象变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。这种动态绑定技术,就能够不用修改源程序代码,便让对象变量绑定到各种不同的类上,从而导致该对象调用的具体方法随之改变,让程序可以选择多个运行状态,这就是多态性。

 

Java实现多态的条件和效果

   Java实现多态有三个必要条件:继承、重写、向上转型。

    1、继承/实现:就是有继承关系的子类和父类,或者存在有实现关系的普通类和接口。

    2、重写:子类覆盖父类中的方法,或者实现类对接口中的方法全部覆盖。

    3、向上转型:就是子类定义指向父类声明,或者实现类的定义指向接口声明。

1、利用抽象类实现多态

    在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的,如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象(abstract)类。比如class Animal{},这用于产生一个Animal对象,但是这个Animal具体有什么属性和什么行为我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物如狗、猫来对它进行特定的描述。所以抽象类体现了数据抽象的思想,是实现多态的一种机制。

    1、抽象类中必须提供抽象方法,这组抽象方法没有方法体,具体功能有派生类来实现。所以抽象类是无法定义对象的,一定是用来被继承的。

    2、抽象类中也可以有具体方法,但是抽象方法和具体方法不能重名否则编译报错。子类在继承抽象类时必须覆盖父类中的全部抽象方法否则编译报错。

    3、抽象类中也会提供构造函数,子类在定义抽象类对象的时候一定要调用父类的某个构造函数,此时任仍然有8.2中的要求。

    4、抽象类可以是public的也可以是默认权限的,但不能被final修饰否则编译报错;抽象方法可以用public或protected修饰,但不能使用private、static、final或native等修饰否则编译报错。

    总结:抽象类除了因为有抽象方法而不能被自己定义外,其他的使用情况和普通类都是一样的。实际开发中,抽象类一般为实现多态专用,所以只提供抽象方法。

 

2、利用接口实现多态

         首先接口不是类(但是也会被编译成class文件),类与接口之间的实现关系是是Java中实现多态的另一种机制。同时一个类可以同时实现多个接口,这就弥补了Java中类只能单继承的缺陷。

    1、接口定义的关键字是interface。和类一样,只有public和默认权限,public接口可以被其他包下的类import然后实现,但默认接口只能被本包里的类实现。

    2、接口中没有构造函数、所有属性会自动识别为public static final,所有的成员方法会自动识别为public abstract,给private或protected权限就会编译报错。

    3、接口比抽象类更加抽象,因为抽象类中是可以提供普通属性、非抽方法和构造方法的,而接口中只有公开的常量和抽象方法,是彻底得依赖实现类。

    总结:实际开发中,接口必须要被类实现,自身没有任何意义,实现的关键字是implemen ts。事实上接口就是为了多态而生的。

你可能感兴趣的文章
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>
【LEETCODE】102-Binary Tree Level Order Traversal
查看>>
【LEETCODE】106-Construct Binary Tree from Inorder and Postorder Traversal
查看>>
【LEETCODE】202-Happy Number
查看>>