第三讲 面向对象(上)
面向过程和面向对象
面向过程:事物和属性(动作)之间的关系是动宾关系
面向对象:事物和属性(动作)之间的关系是主谓关系
面向对象的思想:将客观事物看做具有状态和行为的对象,通过抽象找出同一类对象的共同状态和行为,构成类。
面向对象的三大特征:封装、继承、多态
类是对某一类事物的描述,是抽象、概念上的定义;对象是实在的该类事物的每个个体,因此也称实例。
类成员函数可以访问同一个类中的成员变量。
Java程序启动时,先寻找main函数,main函数放在哪个类中都无所谓,都不属于类的函数。
对象的比较:“==”运算符与equeal()方法的区别,equal方法是比较对象的内容是否相等,“==”是比较对象的首地址是否相等。
类的成员声明为私有成员以后,在别的类中就不能直接进行访问了,只能通过该类的public或protect方法来对该私有成员进行访问(变量/方法)。
构造方法
构造函数可以为成员变量进行初始化工作
重载构造方法可以完成不同初始化的操作。
写了一个新的构造函数以后,编译器不会再调用不带参数的构造函数了。
因此写带参数的构造函数,还需要多写一个不带参数的构造函数。
构造方法不同于一般方法的特征有3点:
1.它具有与类名一样的名称
2.它不含有返回值
3.它不能用return语句返回一个值
还有一点要注意的就是:它没有返回值但也没有void;如果有void那它就不再是构造方法了。
当一个对象变成垃圾是指:引用这个对象的句柄不存在了,或它已经指向了别的对象.没有对应的句柄是对象变成垃圾的本质原因。
this关键字
每个成员方法内部,都有一个tiis引用变量,指向调用这个方法的对象;在形参和成员变量名字不一样的时候,this可以省略;如果形参和成员变量名字一样的时候,则可以利用this关键字来区分成员变量和形参。在实际运用中,经常让类的成员变量名和对其进行赋值的成员方法的形参变量同名,同时使用this关键字,这样可以增强程序的可读性和可理解性。
当一个构造方法(较长)调用另外一个构造方法,可以使用this关键字。
注意:在java的类中,类(A)可内嵌类(B),内嵌类B编译时会产生文件A$B.class;命令执行语句(不含声明这些语句)只能在main函数中,不能在main函数以外,否则编译时会提示出错;system方法只能在public方法中调用。
在任何类中,都会有finalize()方法
静态方法、静态类、静态变量
在一个类中定义一个静态方法(如static main),不需创建该类的对象即可调用该静态方法。
静态变量有点类似于C语言中的全局变量,但静态变量优于其他非静态变量,而且会先初始化。如果把静态类看作一个事先(执行main函数之前)生成好的设计图纸,那么静态变量可看作一个事先生成好的零件,当然这个零件是属于某个类的。
静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能访问类中的非静态成员。这是因为,对于非静态的方法和类,需要先创建的实例对象后才可使用,而静态方法在使用前不许创建任何对象。
不能把非静态方法内部的成员声明为静态的。
静态方法不能以任何方式引用this和super关键字,因为静态方法被调用时,this所引用的对象根本就没有产生。
main方法是静态的,因此在main方法中不能在创建该类的对象后才能访问该类生成对象中的非静态成员(变量或方法)。
静态块,static+{}可以对块内的静态成员进行初始化。
类在启动(使用时)才加载。
类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。实现方法:首先将类的构造方法的访问权限设置为private,同时在类内部产生一个该类的静态final对象,再利用该类的某个静态方法返回类内部创建的对象。
静态成员类特性:
静态内部类没有了指向外部的引用。
静态内部类中可以定义任何静态和非静态的成员
静态内部类里的静态方法中:可以直接访问该类和外部类中的静态成员,访问该类和外部类中成员通过创建对象访问
静态内部类里的非静态方法中:可以直接访问该类中的所有的非静态、静态成员和直接访问外部类中的静态成员;访问外部类中成员通过创建类对象访问
像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符
静态成员类约束:
静态成员类不能与外部类重名
像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
匿名类:
使用匿名类有两种情况:
1.对一个对象只需一次方法调用,这种情况可以使用匿名类,这样比较简单.
2.将匿名对象作为一个实参传递给一个方法,比如:abc(new Person());
l 内部类和外部类
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。static的内部类行为上象一个独立的类,非static在行为上类似类的属性或方法且禁止声明static的方法。内部类可以访问外部类的所有方法与属性,但static的内部类只能访问外部类的静态属性与方法。但外部类不能直接访问内部类的成员。
要访问内部类中的成员函数,必须先创建一个外部类实例,通过外部类实例来生成一个内部类对象,因为内部类可以调用外部类的非静态的成员(函数、变量),因此外部类必须先生成一个实例。
Q:System.out.println(InnerClass.this.name);
单态设计模式:就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得气对象实例的方法。(构造函数采用private权限+静态的实例对象+公共的静态的返回实例对象的函数,然后在类外部就可以访问类的“公共的…函数”获得事先创建的唯一的实例对象的栈地址)。
关于args
在编译类文件时,后面加的字符将args[]这个字符串数组初始化。
类中声明的变量在编译时是会被初始化的,但方法中的变量不会被初始化。
在变量前加上final关键字,相当于把变量声明为全局变量。
第四讲 面向对象(下)
类的继承
父类也称超类、基类
Java只支持单继承,即子类只能有一个父类,但是支持多层继承,即子类继承父类以后,子类可以被其他类继承,以此类推。
子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法,在子类的构造方法中可使用super()语句来调用父类的继承方法。
如果子类没有显式调用父类的构造方法,也没有使用this关键字调用重载的其它构造方法,在产生子类的对象实例时,系统会调用父类的无参数的构造方法即使用“super();”。
this()和super()不能同时出现在一个构造方法中,而且这两个方法只能出现在第一句。
覆盖父类的方法:如果子类和父类的函数名一样,则子类的函数覆盖父类的函数;如果想调用父类的函数,则可以使用“super.函数名”的形式来调用父类的函数方法。
子类在覆盖父类方法时,访问权限不能降低。
如果父类的成员声明为private权限,则子类无法对其进行继承。
final关键字
final标记过的类不能被继承;final标记过的方法不能被子类重写; final标记过的成员变量相当于常量,而且只能赋值一次,要么在声明时赋值,要么在所有构造函数中都对其进行赋值。如果final定义的成员变量同时被static关键字修饰,则该变量不能在构造函数中初始化(必有类的实例产生),只能在声明时初始化。
抽象类
抽象方法就是不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现;包含抽象方法的类就叫抽象类。
抽象类必须用abstract关键字来修饰,抽象方法也必须用abstract来修饰;抽象类不能被实例化,也就是不能用new关键字去产生实例对象;抽象方法只需声明,不需实现(即方法后面加“;”而不是“{}”);含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法以后才能被实例化,否则这个子类仍然是个抽象类。
接口(interface)
如果一个抽象类的所有方法都是抽象的,可以将这个类用接口进行定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口就是一种特殊的抽象类,这种抽象类只含有常量和方法的定义,而没有变量和方法的实现。
接口中的成员变量都是用public staticfinal访问类型的,因此不必在前面加上public等修饰符;接口可以被继承;可以定义一个抽象类用implements方法实现一个接口中的部分方法,也可以定义一个类用implements方法实现一个接口中的所有方法;一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implements关键字之前。
l 对象的类型转换
子类对象可以自动转换为父类,父类转换成子类必须使用强制转换;instanceof操作符可以用来判断一个实例对象是否隶属于某个类。
l 异常
异常定义了程序中遇到的非致命错误,如程序要打开一个不存在的文件、网络连接中断、操作数越界、装载一个不存在的类等;try,catch,throws关键字;可以在一个方法中使用这些关键字来实现程序的跳转;一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类;子类扔出的异常不能比父类扔出的异常还多。
编译时出现找不到某个类的错误时,应该通过以下三个途径去排除:1)类名是否写错,不一致;2)包名是否写错了;3)类的路径是否错了,可通过“set classpath”来查看。
package包名设置时,文件路径不能以数字开头;不用自行添加文件夹,编译器会自动根据包名来新建;运行命令为“javac –d . java文件名”
访问控制
| private | default | protected | public |
同一类 | Y | Y | Y | Y |
同一包中的类 | N | Y | Y | Y |
子类 | N | N | Y | Y |
其他包中的类 | N | N | N | Y |
父类不能是private和protected,否则子类无法继承,public修饰的类能被所有的类访问,默认修饰的类,只能被同一包中的所有类访问。
java命名习惯:
包中的字母一律小写;类名、接口名应当使用名词;方法名和变量名,第一个单词小写,后面每个单词的首字母大写;常量名的每个字母一律大写。