Java之学习笔记——面向对象编程_笔记4

时间:2022-09-20 10:09:41

个人理解,编程中所谓的 类¨ 与现实世界中对物体的分门别类中的类是同一个概念,只是在编程中将其借用进来。类代表有一系列共性和相同操作或动作的事物,在编程中即为抽象的数据类型。具体的每个个体(现实世界中)、实例变量(对于在编程中来说)就是对象。

  类是现实世界某些对象的共同特征(属性和操作)的表示,对象是类的实例。

    类的属性:就是类的静态属性的简称,指类内包含的各项数据,如变量或其他类的对象;
   类的服务:  则被称为成员函数或方法。


¨ 


Java中类的定义形式如下:

[修饰符]  class  类名  [extends  父类]  [implements  接口名]
{
   类成员变量声明
   类方法声明

}


我们再来仔细说说这中间的每一个部分:

在class关键字前,也即类的修饰符有大体分三种类型——访问修饰符public公共类、final修饰符(最终类说明符)和abstract修饰符(抽象类说明符)

          而其中,权限修饰符只能为public或默认(即为空,什么都没有,表示定义为友好的),public表示该类可被任何地方使用和访问(只要程序能找到该类位置),无论是在同一包内,还是在不同包。注意,这与C++中不同,C++中没有还对类的访问权限用修饰符来限制的,而是对类之间的继承关系有访问权限的说明,除此之外,它们倒是都对类的属性和方法有访问权限有限制。          默认的访问权限(即定义为友好的),即是指只能被同一包内的类引用和访问,而不能被其它包中的类访问和引用,即使import进去。

后面还会提到:以类的属性和方法缺省修饰符时,也表示为只能被同一包中的类引用和访问。

Java中不允许多重继承,这与C++中不同,也算是为了弥补这个不足,Java中引进了接口的概念。

上述类的定义中,类体中主要是类的具体内容,包括类的属性和类的方法。类的属性可以是简单变量,也可以是某些类的实例,如果是类的实例,可以如下定义:

[修饰符]   类名 对象名=new类名(参数列表);

在声明对象和复杂变量时,可以不在声明时用创建,可以在以后的构造函数中创建。

类中定义的方法通常起到两种作用:一是围绕着类的属性进行各种操作;二是与其他的类或对象进行数据交流、消息传递等操作。

Java中声明方法的语法如下:

    [修饰符]  返回值类型  方法名(参数列表)

throws  例外名1,例外名2,…

{ 方法体:

  局部变量声明;

    语句序列;

}

类的方法,又称为成员函数,用来规定类属性上的操作,实现类的内部功能的机制,同时也是类与外界进行交互的重要窗口。

Java程序员把注意力放在创建称为类的用户自定义类型(user-definedtype,类也称为程序员定义的类型(programmer-definedtype),每个类都含有数据和一组操作数据的方法,类中的数据部分称为实例变量。用户定义类型(即类)的实例称为对象。

对象是类的一个实例,类是同种对象的抽象,是创建对象的模板。在程序中创建—个对象将在内存中开辟一块空间,其中包括该对象的属性和方法。创建对象使用关键字运算符new。

构造函数(可以对比C++中,与C++几乎相同)

创建自己的构造函数
•构造函数的名字和类的名字是相同的。当构造Employee类的对象时,此构造函数被启动,实例字段赋初值,在Java中,定义和初始化是统一的——两者缺一不可。

  例如,用下面的代码创建Employee类的一个实例时,

newEmployee (“James Bond”,100000,1950,1,1);

构造函数的特点有:

(1)构造函数和类具有相同的名字。

(2)一个类可以有多个构造函数。

(3)构造函数可以有0个、1个或多个参数。

(4)构造函数没有返回值。

(5)构造函数总是和new运算符一起被调用。

构造函数的作用

 (1)对象初始化

(2)引入更多的灵活度(变量赋值或更复杂的操作)

(3)Java中可以不定义构造函数

 Java中可以不定义构造函数,此时系统会自动为该系统生成一个默认的构造函数。这个构造函数的名字与类名相同,它没有任何形式参数,也不完成任何操作。

 方法概述

Java程序是由一个个类定义组成的,类有两个部分:属性和方法。属性描述类是什么,方法描述类做什么。任何对象都有独立的内存存储它的属性。类的所有的对象共享存贮在内存的方法。

    换言之:方法是类的主要组成部分。在一个类中,程序的作用体现在方法中。

  方法即是JAVA创建一个有名字的子程序。一个主方法和若干个子方法构成。主方法调用其他方法,其他方法间也可互相调用,同一个方法可被一个或多个方法调用任意次。

在一个方法中定义另一个方法将产生语法错误。

(1)最好避免局部变量“屏蔽”实例变量,在一个类中不使用同名标识符就可以做到这一点;方法调用中参数用来传递数值、传递引用,同时方法还可以嵌套、递归调用。

(2)方法体中如果指定了void的返回值类型,方法中就必须包含一条return语句保证任何情况下都有返回数值,return语句后面不能跟任何表达式;


Java程序的基本结构如下:

引入Java类库;

定义用户类1

{

 

   定义类1的若干变量或对象:

   定义类1的方法1

   定义类1的方法2

    

   定义类1的方法M1

}

定义用户类2

{

   定义类2的若干变量或对象:

   定义类2的方法1

   定义类2的方法2

    

   定义类2的方法M2

}


Java推出了“访问控制修饰符”的概念,允许库创建者声明哪些东西是客户程序员可以使用的,哪些是不可使用的。

这种访问控制的级别在“最大访问”和“最小访问”的范围之间,分别包括:public,“默认”(无关键字),protected以及private。下面的列表说明访问控制修饰符含义:

Java之学习笔记——面向对象编程_笔记4

1、公共访问控制符 public

用于类:   

Java中类的访问控制符只有一个:public,即公共的。一个类被声明为公共类, 表明它可以被所有的其他类所访问和引用,这里的访问和引用是指这个类作为整体是可见和可使用的,程序的其他部分可以创建这个类的对象、访问这个类内部可见的成员变量和调用它的可见的方法。

一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件,类的属性和方法能否为所有其他类所访问,还要看这些属性和方法自己的访问控制符。

用于类内属性:     

public修饰的类内属性称为公共属性,若这个类是公共类则它可以被所有的其他类访问。

缺省访问控制符

用于类   

   假如一个类没有访问控制符,说明它具有缺省的访问控制特性。这种缺省的访问控制权规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性称为包访问性。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生类间干扰和错误。

用于类属性   

    类内的属性和方法如果没有访问控制符号来限定,也说明它们具有 包访问性。

3 私有访问控制符 private
private 修饰的属性或方法只能被该类自身所访问和修改,而不能被任何其他类,包括该类的子类,来获取和引用
1). 私有数据

例如有三个实例字段,它们含有在Employee类的实例内部被操作的数据。

private string name;

private double salary;

private Date hireDay;

       private(私有的)关键字用来确保可以访问这些实例字段的只能是Employee类本身的方法。

2).私有方法

在实现类时,我们使所有的数据字段都是私有的,因为公开的数据是危险的。对于方法又是什么情况呢 ?虽然大多数方法是公开的,但是私有方法也经常使用。这些方法只能被同一个分离的方法。

总起来说,在下面的情况下可以选择私有方法:

  (1)与类的使用者无关的那些方法。

(2)如果类的实现改变了,不容易维护的那些方法。

4  保护访问控制符 protected
protected 修饰的成员变量可以被三种类所引用: 该类自身、与它在同一个包中的其他类、在其他包中的该类的子类 。使用 protected 修饰符的主要作用是允许其他包中的它的子类来访问父类的特定属性。
         protected 关键字为我们引入了一种名为 继承 的概念,它以现有的类为基础,并在其中加入新的成员,同时不会对现有的类产生影响 —— 我们将这种现有的类称为 基础类 或者 基本类 Base Class )。 亦可改变那个类现有成员的行为。对于从一个现有类的继承,我们说自己的新类 扩展 extends 了那个现有的类

私有保护访问控制符 private protected

private和protected按顺序连用构成一个完整的访问控制符:私有保护访问控制符。用privateprotected修饰的成员变量可以被两种类访问和引用,一种是该类本身,一种是该类的所有子类,不论这些子类是与该类在同一个包里,还是处于其他的包中。

相对于protected,privateprotected修饰符把同一包内的非子类排除在可访问的范围之外,使得成员变量更专有于具有明确继承关系的类,而不是松散地组合在一起的包。

1 静态修饰符

static称为静态修饰符,它可以修饰类中的属性和方法。

使用static(静态)关键字,可满足两方面的要求:

(1) 一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象;被static修饰的属性称为静态属性,这类属性一个最本质的特点是:它们是类的属性,而不属于任何一个类的具体对象。换句话说,对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。

2)另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能用类直接调用的方法。

 static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。

静态常量

静态变量是很少见的。然而,静态常量却很普遍。例如,Math类中定义了一个静态常量:

public class Math

{

……

public static final double PI=3.1.4159265358979323846;

……

}

3  静态方法

      声明一个方法为static至少有三重含义:

(1)使用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;

(2)非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有;

3)由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量。

main 方法

    main方法并不对任何对象施加操作。实际上,当程序开始执行时,还不存在任何对象。静态方法被执行,并构造程序所需的对象。

   提示  每个类都可以有一个main方法。这是对类进行单元测试的一个很方便技巧。

abstract是抽象修饰符,可以用来修饰类或方法。
1  抽象类
当一个类被声明为 abstract 时,这个类被称为是抽象类。所谓抽象类就是没有具体实例对象的类。
针对这个问题, Java 专门提供了一种机制,名为 抽象方法 它属于一种不完整的方法,只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:
abstract void X();

2  抽象方法

     作为类方法修饰符,abstract则声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法。

     可见, abstract 方法只有方法头的声明,而用一个分号来代替方法体的定义: 至于方法体的具体实现,那是由当前类的不同子类在它们各自的类定义中完成的。

需要特别注意的是,所有的抽象方法,都必须存在于抽象类之

中。

    除了抽象方法,抽象类也可以有具体的数据和方法。

   Java 编程语言中抽象方法是非常重要的概念。在接口里你会大量的用到它

注意:这里要与接口进行对比、记忆,接口中的方法都属于抽象方法,当然,接口中也有属性,其具体性质将在后文详述。

最终类、最终属性、最终方法与终结器(C++中可没有final最终修饰符)

final是最终修饰符,它可以修饰类、属性和方法。另外终结器的关键字与final很相近,一并介绍

1 最终类

    如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。

被定义成final的类,通常是一些有特殊作用的、用来完成标准功能的类,将一个类定义为final则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能是准确无误的

2  最终属性

许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:

(1)编译期常数,它永远不会改变;

(2)在运行期初始化的一个值,我们不希望它发生变化。

     可以把一个实例字段定义为 final( 不能改变的 ) 在对象被构造时,这种字段必须被初始化。即,必须保证在每一个构造函数结束之前其值已被设定。以后字段的值不能改变

3  最终方法

          之所以要使用final方法,可能是出于对两方面理由的考虑。

        第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写就可以采取这种做法。

     采用final方法的第二个理由是程序执行的效率

4终结器
终结器的作用是回收对象时执行的方法。类似与构造函数是创建对象时执行的方法一样。
protected void finalize (){

            System.out.println(“   “);

      }

其它修饰符

volatile

  如果一个属性被volatile修饰,说明这个属性可以同时被几个线程所控制和修改。

synchronized

  主要用于线程同步

native

  表示该方法不是用java语言写成的,是用C,C++等语言写的)


网上查到的一点资料:——内部类

简单的说,内部类就是类中的类,举个例子:

class A {
private int i;
private void m() {

}
class B {
mm(int j) {
i = j;
m();
}
}
}

这里,B就是A的内部类
内部类的特点就是,可以方便的访问外部类里面的私有方法和属性,比如,这里B里面可以直接访问A里面的私有属性i,和私有方法m()