• java基础总结——java面向对象


    面向对象

    程序的三种基本结构:顺序结构、选择结构、循环结构。

    面向对象程序设计方法的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。

    成员变量(状态数据)+方法(行为)= 类定义

    面向对象的基本特征

    面向对象方法具有三个基本特征:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

    封装:指将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;

    继承:是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为特殊的父类,将直接获得父类的属性和方法;

    多态:指子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

    除此之外,抽象也是面向对象的重要部分,抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

    面向对象

    类可以当成一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量。

    类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体。

    Java语言是面向对象的程序设计语言,类和对象是面向对象的核心。Java语言提供了对创建类和创建对象简单的语法支持。

    Java语言里定义类的简单语法如下:

     

    在上面的语法格式中,修饰符可以是public、final、abstract,或者完全省略这三个修饰符,类名只要是一个合法的标识符即可,

    建议Java类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符。

    对一个类定义而言,可以包含三种最常见的成员:构造器、成员变量和方法,static修饰的成员不能访问没有static修饰的成员

    成员变量用于定义该类或该类的实例所包含的状态数据,方法则用于定义该类或该类的实例的行为特征或者功能实现。

    构造器用于构造该类的实例,Java语言通过new关键字来调用构造器,从而返回该类的实例。

    构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。

    因此,Java语言提供了一个功能:如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认的构造器。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器

    定义成员变量的语法格式如下:

     

    ➢ 修饰符:修饰符可以省略,也可以是public、protected、private、static、final,其中public、protected、private三个最多只能出现其中之一,可以与static、final组合起来修饰成员变量。

    ➢ 类型:类型可以是Java语言允许的任何数据类型,包括基本类型和现在介绍的引用类型。

    ➢ 成员变量名:成员变量名只要是一个合法的标识符即可,建议成员变量名应该由一个或多个有意义的单词连缀而成,第一个单词首字母小写,后面每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符。

    ➢ 默认值:定义成员变量还可以指定一个可选的默认值。

    定义方法的语法格式如下:

     

    ➢ 修饰符:修饰符可以省略,也可以是public、protected、private、static、final、abstract,其中public、protected、private三个最多只能出现其中之一;abstract和final最多只能出现其中之一,它们可以与static组合起来修饰方法。

    ➢ 方法返回值类型:返回值类型可以是Java语言允许的任何数据类型,包括基本类型和引用类型;如果声明了方法返回值类型,则方法体内必须有一个有效的return语句,该语句返回一个变量或一个表达式,这个变量或者表达式的类型必                                    须与此处声明的类型匹配。除此之外,如果一个方法没有返回值,则必须使用void来声明没有返回值。

    ➢ 方法名:方法名的命名规则与成员变量的命名规则基本相同,但由于方法用于描述该类或该类的实例的行为特征或功能实现,因此通常建议方法名以英文动词开头。

    ➢ 形参列表:形参列表用于定义该方法可以接受的参数,形参列表由零组到多组“参数类型 形参名”组合而成,多组参数之间以英文逗号(,)隔开,形参类型和形参名之间以英文空格隔开。一旦在定义方法时指定了形参列表,则调用该方                         法时必须传入对应的参数值——谁调用方法,谁负责为形参赋值。

    定义构造器的语法格式如下:

     

    ➢ 修饰符:修饰符可以省略,也可以是public、protected、private其中之一。

    ➢ 构造器名:构造器名必须和类名相同。

    ➢ 形参列表:和定义方法形参列表的格式完全相同

    创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。

    创建对象之后,接下来即可使用该对象了,Java的对象大致有如下作用:

    ➢ 访问对象的实例变量

    ➢ 调用对象的方法。

    有这样一行代码:Person p=new Person(); 这行代码创建了一个Person实例,也被称为Person对象,这个Person对象被赋给p变量。在这行代码中实际产生了两个东西:一个是p变量,一个是Person对象。

    Java提供了一个this关键字,this关键字总是指向调用该方法的对象

    根据this出现位置的不同,this作为对象的默认引用有两种情形:

    ➢ 构造器中引用该构造器正在初始化的对象。

    ➢ 在方法中引用调用该方法的对象。

    this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。

    方法详解

    Java语言里,方法不能独立存在,方法必须属于类或对象。

    一旦将一个方法定义在某个类的类体内,如果这个方法使用了static修饰,则这个方法属于这个类,否则这个方法属于这个类的实例。

    Java里方法的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。

    从JDK 1.5之后,Java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参。如果在定义方法时,在最后一个形参的类型后增加三点(...),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。

    注意:个数可变的形参只能处于形参列表的最后。一个方法中最多只能包含一个个数可变的形参。

               个数可变的形参本质就是一个数组类型的形参,因此调用包含个数可变形参的方法时,该个数可变的形参既可以传入多个参数,也可以传入一个数组。

    一个方法体内调用它自身,被称为方法递归。只要一个方法的方法体实现中再次调用了方法本身,就是递归方法。递归一定要向已知方向递归。

    如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载

    方法重载的要求就是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。

    成员变量和局部变量

     成员变量指的是在类里定义的变量,也就是前面所介绍的field;

    局部变量指的是在方法里定义的变量。

    变量名称建议第一个单词首字母小写,后面每个单词首字母大写。Java程序中的变量划分如图5.9所示。

     

    成员变量无须显式初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。

    局部变量除形参之外,都必须显式初始化。也就是说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。

    当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。

    局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。

    这意味着定义局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将初始值保存到这块内存中。

    与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。

    如果局部变量是基本类型的变量,则直接把这个变量的值保存在该变量对应的内存中;

    如果局部变量是一个引用类型的变量,则这个变量里存放的是地址,通过该地址引用到该变量实际引用的对象或数组。栈内存中的变量无须系统垃圾回收,往往随方法或代码块的运行结束而结束。

     

    package语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,即只能包含一条package语句,该源文件中可以定义多个类,则这些类将全部位于该包下。如果没有显式指定package语句,则处于默认包下。

    import可以向某个Java文件中导入指定包层次下某个类或全部类,import语句应该出现在package语句(如果有的话)之后、类定义之前。

    JDK 1.5以后更是增加了一种静态导入的语法,它用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。静态导入使用import static语句,静态导入也有两种语法,分别用于导入指定类的单个静态成员变量、方法和全部静态成员变量、方法

    深入构造器


    构造器最大的用处就是在创建对象时执行初始化。

    同一个类里具有多个构造器,多个构造器的形参列表不同,即被称为构造器重载。

    使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。使用this调用重载的构造器时,系统会根据this后括号里的实参来调用形参列表与之对应的构造器。

    类的继承

    Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有的也称其为基类、超类。父类和子类的关系,是一种一般和特殊的关系。

    注意:子类只能从被扩展的父类获得成员变量、方法和内部类(包括内部接口、枚举),不能获得构造器和初始化块。

    如果定义一个Java类时并未显式指定这个类的直接父类,则这个类默认扩展java.lang.Object类。

    因此,java.lang.Object类是所有类的父类,要么是其直接父类,要么是其间接父类。因此所有的Java对象都可调用java.lang.Object类所定义的实例方法。

    子类包含与父类同名方法的现象被称为方法重写(Override),也被称为方法覆盖。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。

    方法的重写要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同;

    “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;

    “一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

    当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。

    如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

    如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。

    如果子类中定义了一个与父类private方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法。

    重载主要发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间。

    super是Java提供的一个关键字,super用于限定该对象调用它从父类继承得到的实例变量或方法。

    多态

    Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。

    编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)。

    相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。与方法不同的是,对象的实例变量则不具备多态性。

    instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。

    在使用instanceof运算符时需要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。

    初始化块

    一个类里可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。

    在 Java 语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建象。

    初始化一般遵循3个原则:

    静态对象(变量)优先于非静态对象(变量)初始化,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;

    父类优先于子类进行初始化;

    按照成员变量的定义顺序进行初始化。 即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化;

    加载顺序

    父类(静态变量、静态语句块)
    子类(静态变量、静态语句块)
    父类(实例变量、普通语句块)
    父类(构造函数)
    子类(实例变量、普通语句块)
    子类(构造函数)

    类成员

    在Java类里只能包含成员变量、方法、构造器、初始化块、内部类(包括接口、枚举)5种成员。

    final修饰符

    对于final修饰的成员变量而言,一旦有了初始值,就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也没有在初始化块、构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的0、'\u0000'、false或null,这些成员变量也就完全失去了存在的意义。

    因此Java语法规定:final修饰的成员变量必须由程序员显式地指定初始值。

    归纳起来,final修饰的类变量、实例变量能指定初始值的地方如下:

    ➢ 类变量:必须在静态初始化块中指定初始值或声明该类变量时指定初始值,而且只能在两个地方的其中之一指定。

    ➢ 实例变量:必须在非静态初始化块、声明该实例变量或构造器中指定初始值,而且只能在三个地方的其中之一指定。

    系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。

    如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;

    如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。

    final修饰的形参因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。

    当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。

    但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

    对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足三个条件,这个final变量就不再是一个变量,而是相当于一个直接量。

    ➢ 使用final修饰符修饰。➢ 在定义该final变量时指定了初始值。➢ 该初始值可以在编译时就被确定下来。

    注意:final修饰符的一个重要用途就是定义“宏变量”。当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译时就确定下来,那么这个final变量本质上就是一个“宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。

    final修饰的方法不可被重写。

    final修饰的类不可以有子类,例如java.lang.Math类就是一个final类,它不可以有子类。

    不可变(immutable)类的意思是创建该类的实例后,该实例的实例变量是不可改变的。

    Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例的实例变量不可改变。

    如果需要创建自定义的不可变类,可遵守如下规则。

    ➢ 使用private和final修饰符来修饰该类的成员变量。

    ➢ 提供带参数的构造器(或返回该实例的类方法),用于根据传入参数来初始化类里的成员变量。

    ➢ 仅为该类成员变量提供getter方法,不要为该类的成员变量提供setter方法,因为普通方法无法修改final修饰的成员变量。

    ➢ 如果有必要,重写Object类的hashCode()和equals()方法(关于重写hashCode()的步骤可参考8.3.1节)。

         equals()方法根据关键成员变量来作为两个对象是否相等的标准,除此之外,还应该保证两个用equals()方法判断为相等的对象的hashCode()也相等。

  • 相关阅读:
    ASP.NET Web API模型验证以及异常处理方式
    Javascript基础恶补
    求一个集合的集合下所有集合元素求值
    C#创建唯一的订单号, 考虑时间因素
    git的几十个基本面
    报错:ASP.NET Web API中找不到与请求匹配的HTTP资源
    使用RAML描述API文档信息的一些用法整理
    Postman测试Web API
    Javascript中的Prototype到底是啥
    AngularJS和DataModel
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/16230228.html
Copyright © 2020-2023  润新知