面向对象

Posted zwcnblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。

一、类

  同一类事物的统称,就是一个模板。

  1.1、设计类

  语法格式:class 类名{

                        成员变量;

                        构造方法(){};

           普通方法(){}

         }

  注意:外部类,仅能使用public的和默认不写的这两种访问权限修饰符。

  1.2、构造方法 

  语法格式:访问权限修饰符 类名(形参列表){

                         方法体

                  }

  

  作用:1、通过构造方法创建对象

     2、在创建对象的同时给对象的字段赋值

 

  注意: 1、 名字和类名完全一致,不能有返回值类型,可以有访问限制修饰符(public、protected、默认不写、private)

              2、 必须方法体

      3、每一个类中都至少有一个构造方法,如果没有看到(显示的),那么存在一个隐式的无参数构造方法;如果一个类中有显示的构造方法,那么隐式的无参构造方法就不存在了。

 

  1.3、static关键字

  有时在处理问题时会需要两个类在同一个内存区域共享一个数据。静态成员属于类所以。

  可以修饰:成员变量、方法、内部类

  不可以修饰:外部类、局部变量、构造方法

  使用场景:工具类(修饰方法)、全局常量(修饰属性)

二、对象

  类的实例,就是一个具体的东西。

  2.1、创建与使用

  数据类型 变量名 = new 类名();(要注意:java就近原则,同包(文件夹)下)

  赋值:1、对象.属性=值;

     2、通过构造器赋值

     3、setter方法赋值

  取值:1、对象.属性

     2、getter方法取值

 

  2.2、匿名对象

  就是没有名字的对象(创建了一个对象而没有使用变量接收),游离在堆中:new 类名();

  匿名对象适用场景:

    ①只使用一次,如只用一次对象的属性或者方法,比如 new Student().studyt();

       ②可以作为一个方法的实际参数 test(new Student());

 

三、包

  3.1、package

  作用:java通过类包,管理类文件,防止类名冲突

  使用:package 公司域名反写.项目名.模块名.子模块名(全部使用小写);

  注意:定义包位置要在所有代码的最前面

 

  3.2、import

   1、使用impor关键字导入包,如:import java.util.Arrays;

   2、使用import关键字导入静态成员:如:

import static java.lang.Math.max;//导入静态成员方法
import static java.lang.System.out;//导入静态成员变量

 

  注意: 1. import要在声明包下面,在声明类上面。

            2. 在导入类名相同的不同包下的类的时候,使用全限定路径。

            3. 大量导入某个包下的类的时候,用 import 全限定包路径.*;

            4、java核心包不需要手动导入。

四、封装

思想:为了保证内部数据的完整性,应用该类的用户不能轻易的直接操作数据结构,这样避免了外部操作对内部数据的影响,提高了程序的可维护性。

  4.1、如何封装

    1、使用private,修改属性可见性

         2、提供setter/getter方法,用于属性读写

         3、提供无参构造器

         4、使用pubic修饰类

 

  4.2、this关键字

  用来代表本类对象的引用,this当前被谁调用就指代谁。

  用途:1、解决成员变量和局部变量的二义性。(常用)

             2、在本类中,构造方法间的调用,必须要在构造方法中的第一行。(常用)

             3、作为参数传递(不常用)

           4、作为返回值(不常用)

五、继承

思想:开发中复用一些完整的类不仅可以减少开发周期,还可以提高维护性和可扩展性。

  5.1、如何继承

  语法:子类名 extends 父类

  注意:1、final修饰的类不能被继承

     2、能继承的元素:非私有属性、非私有方法、

     3、不能继承的元素:私有属性、使用方法、构造器

     4、单继承、多重继承(多层级的继承)

 

  5.2、Object类

  每个类都有一个直接父类,如果没有看到显示的继承,那么就会隐式继承Object类(顶级父类)

  Object的常用方法:

         1、int hashCode()  返回该对象的哈希码值,是一个int值,对象地址就是该值的16 进制形式。

         2、String toString()  返回该对象的字符串表示。当通过System.out.println();打印对象时,实质上就是调用了它的toString方法,根据需求可以在自定义类中重写该方法。

         3、boolean equals(Object obj)  指示其他某个对象是否与此对象“相等”。在Object的源码中是使用==进行比较的,根据需求可以在自定义类中重写该方法。

  重写注意事项:

    1、子类方法和父类方法的方法签名完全一致。

    2、static 方法不能够被重写 (java语法)

    3、访问权限 : 子类方法的访问权限不能够比父类方法的访问权限低(大于等于)。

    4、返回值类型 : 子类方法的返回值类型可以是父类方法的返回值类型的子类或者相等。

    5、子类抛出的异常(Exception)下不能超过父类相应方法抛出的异常。

    6、方法体 : 子类方法和父类方法主体可以一样, 但是没有任何意义!

 

  5.3、== 和 equals区别

    1、==,如果比较基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果比较引用类型的变量,则比较的是变量所指向的对象的地址。

    2、equals方法,equals方法不能用于基本数据类型的变量,equals方法继承Object类而来,如果没有对equals方法进行重写,比较的是引用类型的变量所指向的对象的地址,Object类源码使用的就是“==”。但是String、Date等类已经对equals方法进行了重写,比较的是所指向的对象的内容,所以我们可以根据需求在自定义类中重写该方法。

六、多态

以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

Scala的面向对象与函数编程

Python面向对象学习之八,装饰器