java面向对象知识(下)

类和子类

类定义了类型,子类定义了子类型。子类的对象可以被当作父类的对象使用:子类对象可赋值给父类的变量,传递给需要父类变量的函数,放进存放父类对象的函数里。

多态变量

Java中保存对象类型的变量是多态变量。“多态”这个术语(字面意思是许多形态)是指一个变量可以保存不同类型(即其声明的类型或任何子类型)的对象。

变量的声明类型就是静态类型,变量的动态类型指的是程序运行在某一时刻时,变量中存放的类型,两者可能不一致。

造型Cast

指的是把一个类型的对象赋给另一个类型的变量,即让静态类型为某个类型的变量去管理另一种类型的变量,此时动态类型与静态类型不符。子类的对象可以赋值给父类的变量,称为向上造型,但是不能够反过来。

类型转换与造型不同,类型转换是真的改变了变量的值,比如说int num = (int) 10.2,数字转换成了10。而造型只是把一个类当成另一种类,其本身没有改变。可以把CD当作item类型看待,但是CD并没有转变为item类型。

在java中,不能通过赋值运算让一个对象去修改另一个对象变量。

覆盖

如果子类的方法覆盖了父类的方法,我们也说父类的那个方法在子类有了新的版本或者新的实现。覆盖的新版本具有与老版本相同的方法签名:相同的方法名称和参数表。因此,对于外界来说,子类并没有增加新的方法,仍然是在父类中定义过的那个方法。不同的是,这是一个新版本,所以通过子类的对象调用这个方法,执行的是子类自己的方法。

覆盖关系并不说明父类中的方法已经不存在了,而是当通过一个子类的对象调用这个方法时,子类中的方法取代了父类的方法,父类的这个方法被“覆盖”起来而看不见了。而当通过父类的对象调用这个方法时,实际上执行的仍然是父类中的这个方法。注意我们这里说的是对象而不是变量,因为一个类型为父类的变量有可能实际指向的是一个子类的对象。

绑定

当调用一个方法时,究竟应该调用哪个方法,这件事情叫做绑定。绑定表明了调用一个方法的时候,我们使用的是哪个方法。绑定有两种:一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java缺省使用动态绑定。在成员函数中调用其他成员函数可以通过this对象这个变量调用。

java的类型系统是一种单根结构,所有类最终都属于Object类

Object类的函数:toString(),equals()

系统会自动调用toString()方法,将对象转换为字符串形式。

当比较两个变量是否管理同一个对象时,使用“==”是不行的。例如,当进行字符串比较时,得用s.equals("hello")。

可以自定义equals()方法,来覆盖父类的方法。

面向对象程序设计原则:

1,消除代码重复 -> 通过函数和父类消除

2,增加可扩展性 -> 用封装来降低耦合(类与类之间的关系称作耦合,耦合越低越好)

                                用框架+数据提高可扩展性,通过handler来调用不同函数

3,数据与表现分离 -> 程序的业务逻辑与表现无关

抽象

我们用abstract关键字来定义抽象类,它不能产生对象但是可以定义变量。抽象类的作用仅仅是表达接口,而不是具体的实现细节。抽象类中可以存在抽象方法。抽象方法也是使用abstract关键字来修饰。抽象的方法是不完全的,它只是一个方法签名而完全没有方法体。

如果一个类有了一个抽象的方法,这个类就必须声明为抽象类。如果父类是抽象类,那么子类必须覆盖所有在父类中的抽象方法,否则子类也成为一个抽象类。一个抽象类可以没有任何抽象方法,所有的方法都有方法体,但是整个类是抽象的。设计这样的抽象类主要是为了防止制造它的对象出来。

抽象函数:表达概念而无法实现具体代码的函数。抽象类:表达概念而无法构造出实体的类。抽象函数只能定义在抽象类里。

继承自抽象类的子类必须覆盖所有抽象函数。

接口

Java把抽象的概念又更推进了一步。这就是接口(Interface)。接口其实就是完全抽象的类,因此接口和类的地位是一样的,此前所有针对类的所有法则同样适用于接口。

接口所有的方法都是没有方法体的,而且都是public abstract,即使你没有这样声明。而接口中的所有成员变量都是public static final的变量,并且必须有定义初始化,因为所有变量都必须在编译的时候有确定值。

接口和类的地位是一样的。因此我们可以看到其定义方式跟类也是基本上一样的。当然,其中的所有方法都没有方法体。而当类从接口得到继承的时候,Java用另外一个动词:实现(implements)。当然,实现接口的类必须覆盖接口中所有的方法,否则这个类就成为一个抽象类。

Java不允许多继承,但是允许一个类实现多个接口,也允许一个接口从多个接口得到继承,但是不允许接口从类继承。

接口是纯抽象的类,其所有成员都是抽象函数,所有成员变量都是public static final。

实现类用extends,实现接口用implements。

面向接口的编程方式:

设计程序时先定义接口,再实现类。任何在函数中传入传出的一定是接口而不是具体的类。

控制反转和MVC设计模式

GUI(图形用户界面)给应用程序提供界面,其中包括窗口、菜单、按钮和其他图形组件,这就是今天大多 数人所熟悉的“典型”应用程序界面。

图形用户界面所涉及的细节很多,我们的课程并不打算教授GUI,但是我们打算借助GUI来介绍两个设计思想:控制反转和MVC设计模式。

部件是创建GUI的独立部分,比如像按钮、菜单、菜单项、选择框、滑动条、文本框等。Java类库中有不少现成的部件。

布局是指如何在屏幕上放置组件。过去,大多数简单的GUI系统让程序员在二维坐标系上 指定每个组件的x和y坐标(以像素点为单位),这对于现代的GUI系统来说太简单了。因为现代的GUI系统还得考虑不同的屏幕分辨率、不同的字体、用户可改变的窗口尺寸,以及许多其他使得布局困难的因素。所以需要有一种能更通用地指定布局的方法,比如,要求“这个部件应该在那个部件的下面“或者”这个部件在窗口改变尺寸时能自动拉伸,但是其他部件保持尺寸不变”。这些可以通过布局管理器(layout manager)来实现。

事件处理是用来响应用户输入的技术。创建了部件并且放在屏幕上合适的位置以后,就得 要有办法来处理诸如用户点击按钮这样的事情。Java类库处理这类事情的模型是基于事件的。 如果用户激活了一个部件(比如,点击按钮或者选择菜单项),系统就会产生一个事件。应用 程序可以收到关于这个事件的通知(以程序的一个方法被调用的方式),然后就可以采取程序该做的动作了。

注入反转

由按钮公布一个守听者接口和一对注册/注销函数。

守听者对象注册在按钮上,接口可以自定义,一旦按钮被按下,就会反过来调用守听者对象的某个函数。

内部类

内部类就是指一个类定义在另一个类的内部,从而成为外部类的一个成员。因此一个类中可以有成员变量、方法,还可以有内部类。实际上Java的内部类可以被称为成员类,内部类实际上是它所在类的成员。所以内部类也就具有和成员变量、成员方法相同的性质。比如,成员方法可以访问私有变量,那么成员类也可以访问私有变量了。也就是说,成员类中的成员方法都可以访问成员类所在类的私有变量。内部类最重要的特点就是能够访问外部类的所有成员。

内部类可以直接访问外部的全部资源,包括任何私有的成员。当外部是函数时,只能访问那个函数里final的变量。

匿名类

在new对象的时候给出的类的定义构成了匿名类,匿名类可以继承某类,也可以实现某接口。

在Swing的消息机制中广泛使用匿名类。

MVC模式

用户自己创建Table Model Object覆盖Table Object原型中给出的方法,再将Table Data放入我们创建的模型中。

JTable table = new JTable(new Table());

JTable只管表现,不管数据。

control和view之间是没有直接联系的。

用户的输入影响到model中的数据,model得知数据改变之后再通知view更新表现。

猜你喜欢

转载自www.cnblogs.com/bl8ck/p/9467212.html
今日推荐