您的位置:首页 > 编程语言 > Java开发

关于张老师java视频的学习(十一)

2010-12-28 22:23 141 查看
第四讲:面向对象下

一、知识点:

(1)、类的继承性:P209
· 只支持单继承,不允许多重继承,但是可以多层继承。 多重与多层是不同的概念:多重,即从多个对象继承而来,是一个横向的概念。多层,是指可以
派生一个对象之后,子类继续派生对象,这样一层一层的继承,这是一个纵向的概念。
· 子类继承父类所有的成员变量和方法,但不继承父类的构造方法。在子类的构造方法中可以通过使用语句super(参数表列)来显示调用父类的构造方法。
· 若子类的构造方法中没有显示地调用父类的构造方法,也没有使用this关键字调用重载的其他构造方法,则在产生子类的实例对象时,系统默认子类的
无参构造函数,并在该无参构造函数中调用父类的无参的构造函数,如果在父类中定义了有参的构造方法而没有定义无参的构造方法,则此时会报错,
告之说找不到构造函数。 因而,为了让类具有良好的继承性,我们往往在父类中 构造一个 什么也不做的无参构造函数。

(2)、子类对象的实例化过程:(在"new 子类" 的代码中)
· new一个对象后,分配成员变量的存储空间并进行默认的初始化。
· 绑定构造方法参数(即,将调用构造函数语句中的实参传递给构造函数的形参)
· 如有this调用,则调用相应的重载构造方法,回到第二步。回到当前构造方法,直接跳转第六步(因为在其他重载的构造方法体中语句执行之前必须
对当前构造方法的类的实例变量进行显示初始化操作,而该类正好是同一个类)
· 显示(super)或隐式追溯调用父类的构造方法(一直到Object类为止),父类的构造方法又从上述第二步开始执行,跳转第五步。
· 进行实例变量的显示初始化操作,即执行在定义成员变量时就对其进行赋值的语句。
· 执行当前构造方法的方法体中的程序代码。

(3)、override重写:子类中重写父类的方法,将覆盖掉父类的方法,如果需要调用父类的方法,那么需要使用 super.方法名(),子类中的方法必须和父类的
方法具有相同的名字、参数表列和兼容的返回类型。而且,子类的方法的限制不能比父类还多。即子类的访问权限不能比父类低
当父类中的某个方法的访问权限设置为private,那么该方法便不能被其他类访问,包括其子类,即不存在继承该方法。
overload重载:在一个类中,对同一个方法名,通过参数表列的不同来构造多个不同的方法,但是他们的名字相同,调用时编译器根据实参表列对应形参
表列来 具体调用。
(4)、final关键字:
· 用final关键字可以声明类、变量和方法。
· final标记的类不能被继承
· final标记的方法不能被重写覆盖,只能继承。
· final标记的变量即为常量,只能赋值一次。并且,声明了final的变量,必须在声明时进行初始化,或者在类的构造函数中进行初始化。不同的构造
函数中,可以进行不同的初始化,因为当我们new产生对象时调用不同的构造方法时,产生的是不同的对象,这final变量是不同的对象中的变量。而
对于同一个对象中的final变量,在初始化了一个之后不能再次修改。 特别的,当我们再在该变量的前加上修饰static后,则该变量在内存中只能存
在一次,此时,只能在类中声明该变量时就对它赋值,而不能在构造函数中多次初始化。
· 在方法中定义的局部类只能访问该方法内的final类型局部变量,将形参声明为final,则在方法中不能修改该变量。
· 当用public static final 三个关键词同时声明变量时,这个变量就成了全局变量。

(5)、抽象类(abstract class):在java中可以定义一些不含有方法体的方法,它的方法体的实现交给子类根据自己的实际情况来实现。包含抽象方法的类叫做抽象类
· 抽象类和抽象方法必须用abstract来修饰。抽象类不能被实例化,即不能用new来产生对象。
· 抽象方法只需声明,而不需要实现,在抽象类中声明方法时候,需要以“;”结尾,而不想普通方法一样不用以分号结尾。
· 抽象类中含有抽象方法,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是抽象子类。
· 抽象类中的方法不一定全是抽象方法,但是,如果一个类中有一个抽象方法,那么这个类必须是抽象方法。
· 如果一个类中所有的方法都是抽象的,那么我们可以用接口来定义该类。接口是抽象方法和常量的集合~!

(6)、接口(interface):从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。
· 接口中的成员都是默认为public访问类型的,接口的变量默认为是public static final的
· 可以定义一个新的接口用extends来继承已有的接口,定义的方法的访问修饰也遵守类的继承原则。
· 可以定义一个类,使用implements关键字去实现一个接口中所有的方法,还可以定义一个抽象类使用implements关键字去实现一个接口定义的部分方法。
· 一个类继承一个父类的同时,实现一个或多个接口,extends关键字必须 在关键字implements之前。定义的方法的访问修饰也遵守类的继承原则。
· 定义接口的格式为:interface 接口名{...} ,接口中的方法必为抽象方法,方法的前面便不再需要声明为abstract,接口中的变量,也为常量,即使
不声明为public static final ,该变量也为常量。

(7)、对象的类型转换:
· 子类对象可以自动转换为父类类型,父类转换成子类必须使用强制转换。
· instanceof 操作符可以用它来判断一个实例对象是否属于一个类,Object类及其equals方法。
· 在多态调用时:如类A引用变量a存储的是B类型,B是A的子类,A中定义了几个方法,B继承了这几个方法并且还定义了额外的方法,那么,在利用引用
变量a调用方法时,只能调用A类和B类中都有定义的具有相同方法名和相同参数表列,返回值具有相变的,而且访问限制遵守继承原则的方法。
· 对象a instanceof 类名A,如何对象a是类A的实例,那么该判断语句返回true,否则返回false

(8)、面向对象的多态性:
· 在多态调用时,类A中有方法1方法2,方法2调用方法1,类A的子类类B重写了类1方法,并额外写了方法3,虽然方法2没有重写,但是从其父类A中继承了
方法,那么,该方法也将调用方法1,但是调用的是类2中的方法1。
· 多态性的优点:
1、应用程序不必要为每一个子类编写功能调用,只需要对抽象基类进行处理即可,可以大大的提高程序的可复用性。
2、子类的功能可以被基类的引用变量引用,这叫做向后兼容,可以提高程序的可维护性和可扩充性。 (现在写的程序能被 以后的程序调用,
不足为奇,但是,现在写的程序能调用以后写的程序,这便是一个飞跃。)
· 接口在多态间的应用(比较多):
· 匿名内部类的应用: 测试的时候,常用匿名类来执行,如果有个形参需要传递对象参数,我们可以在形参中直接传递一个匿名类:
new 父类() { 该匿名内部类的代码 },即一个匿名的类对象。这样做的前提是该类是某个类的子类,这样,代码就相当于:new {} 这样的一
类,如果我知道它是某个类的子类,那么可以 new 父类名() {匿名类} ,这样来产生一个匿名的类之类。

二、问题与收获:

(1)、为什么super()和this()语句不能同时出现在一个构造函数中:
不能同时调用两个构造函数,只能层层递进的调用。
(2)、为什么super()和this()语句只能出现在构造函数的第一个句:
若不是第一句出现,那么编译器报错。因为,构造方法执行完毕之后才执行方法体中的代码。
(3)、继承与未被继承:
在父类中声明为private的成员变量和方法不能被子类继承,因为他们不能被子类访问。 但是,子类同样具有父类的这些声明为private的变量和方法。
(4)、为何一个声明了public static final的变量,在构造方法中不能再次初始化:
因为,这个变量在对象不存在的时候,也可以被外部引用,调用时,可能还没调用构造方法产生过对象,那么,如果不在声明时初始化,那么该变量在
调用时可能还没初始化,这样是不允许的。
(5)、PCI:(Peripheral Component Interconnect)是 一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准。
(6)、同一个包中,一个源文件中可以有多个类,但是只能有一个public类,源文件名必须与该public类相同。那么,是否源文件中必须有一个public类呢 ?
答案是,不是必须的,如果有public类,那么源文件名必须与该类名相同。如果没有呢 ? 那么此时的源文件又该如何选择?可以任意命名,但是
在Eclipse中确不可以,因为这样做的话无法运行,只能编译。

(8)、为何java源文件名必须与public类名相同:
Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。对于一
个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟
机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大

(9)、在Eclipse中,java源文件名必须与文件中的某一个类名相同,否则无法执行。
· 但是,在普通文本编辑的源文件中,当文件中不含有public类的时候,文件名可以任意取,此时,在命令行中,可以编译出源文件,然后使用java命令
来执行相应的字节码。
· 在Eclipse中,经过多次试验,源文件名必须与文件中的某个类名相同,而且这个类必须是有main函数入口的,否则点击运行按钮键之后,运行的结果
是上一次非本源文件运行所得的结果。但是,这又是为何呢?? 不知道……

(10)、Eclipse中,当一个源文件有多个main()入口的时候,我们可以在界面里:
1、右击 --> Run As --> 然后选择要运行的程序1 java Application --> 在出现的对话框中选择要执行的main()入口
2、或者在Run按钮下,选择下拉菜单,然后再Run As 里边选择运行环境配置,在这里可以选择执行的main入口。
又问:如果把工程文件夹中bin文件夹中的字节码文件.class删除了,再运行程序的时候,会怎样呢 ?
试验:在一次编译运行成功之后,将.class文件删除,用MyEclipse运行键再次运行,报错Could not found main class,即无法找到主要字节码
文件,为何在bin文件夹中找不到运行所需要的.class文件的时候,Eclipse不再运行??
析: 因为MyEclipse运行程序时会检查源文件有没有改动,没有改动的话,他就会去bin目录下查找这个class文件,但你把删了 ,类又没有改动,
所以他找不到那个Class文件 ,就会抛出类未找到的异常。至于为什么改动之后就能重新编译,是因为,Eclipse中在点保存的同时编译源文件
并把class文件存放在bin下的对应的工程目录文件中的,以后只要不改动这个文件,那么就不会重新编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: