1.类和对象
第四章:面向对象
日历的作用是提供某个时间点的信息
查询设置信息:GregorianCalendar now = new GregorianCalendar()
int month = now.get(Calendar.MONTH);//得到当前月份
更改设置信息:GregorianCalendar deadline = new GregorianCalendar();
deadline.set(Calendar.YEAR,2001);//把时间设置为2001年
deadline.set(Calendar.MONTH,Calendar.APRIL);//将时间设为5月
deadline.set(Calendar.DAY_OF_MONTH,15);
设置年月的方法:deadline.set(2001,Calendar.APRIL,15);//把时间设置为5月15日
为给定的日期增加天数:deadline.add(Calendar.MONTH,3)//增加3个月
更改器方法:对实例域做出修改的方法
访问器方法:对实例域不能进行修改的方法
显示当月日历:
1.构造一个日历对象,并用当前日期和时间进行初始化。
2.将d设置为这个月的第一天,并得到这一天为星期几weekday,
如果这一天为星期日,就将weekday设置为Calendar.SUNDAY
3.getFirstDayOfWeek()的方法获得当地的星期的起始日期,如果weekday不等于firthweekday日期,往前缩进,weekday在赋值为这个月的week
4.得到星期的格式并打印,
自定义简单的类:
想要要创建一个完整的程序,应该将若干类组合在一起,其中只有一个有main()方法。(方法在前面,定义变量的域在后面,更加关注接口消除了对实现的的注意)。
两个类写在同一个文件里面时,编译后会产生两个class文件。编译器发现一个类使用另一个类时,会自动查找另一个类的class文件,如果没有,自动搜索Java文件,然后编译。
构造器(构造函数):构造器名与类名相同,总是伴随着new操作符的执行被调用,没有返回值,可以后0,1个以上的参数。
私有方法:如果改用其他方法实现相应的操作,则不比保留原有的方法,如果数据的表达方式发生了变化,这个方法就变得难以实现,或者不在需要。
静态方法:静态方法是一种不能向对象实施操作的方法,Math.opow(x,a);x的a次幂,静态方法是没有this参数的方法,不能操作对象,不能在静态方法中访问实例域。
一个方法不需要访问对象状态,其所需要参数都是通过显示参数提供
一个方法只需要访问类的静态域、
一个方法不能修改一个基本数据类型的参数
一个方法可以改变一个对象参数的状态
一个方法不能实现让对象参数引用一个新的对象
对象的构造:
重载:方法名相同,参数不同,编译器会根据参数类型和特定方法调用所使用的值类型进行匹配来挑选相对应的方法,如果编译器找不到对应的匹配参数,或者找出多个,会产生编译错误
默认构造器:默认构造函数,如果不写,程序会提供一个空的构造函数。
显示域初始化:类的构造器可以重载,所以可以采用多种形式设置的实例域的初始状态,确保不管怎样调用构造器,每个实例域都有一个有意义的初值。
调用构造器的具体处理步骤:
- 所以数据域均被初始化为默认值
- 按照在类中声明出现的次序,依次执行所有域初始化语句和初始化块
- 如果构造器第一行调用了第二个构造器,则执行第二构造器主体
- 执行这个构造器的主体
类的设计技巧:
- 一定将数据设为私有,绝对不要破坏封装性。
- 一定要对数据初始化,Java不会对局部变量进行初始化化,会对对象的实例域初始化。
- 不要再类中使用过多的基本类型,用其他的类代替多个相关的基本数据类型。
- 不是所有的域都需要独立的域访问器和域更改器。
- 使用标准的格式进行类的定义:类的顺序:
a) 公有访问特性部分
b) 包作用域访问特性
c) 私有域访问特性
类中每一部分:
实例方法
静态方法
实例域
静态域
- 将职责过多的类进行分解
- 类名和方法名要能体现他们的职责
继承:
Super:调用父类所需要的关键字,使用super调用构造器的语句必须是子类构造器的第一条语句。
多态:一个变量可以引用多种实际类型的现象,在运行时能够自动地选择调用哪个方法的现象叫动态绑定。特性:无需要对现存的代码进行修改,就可以对程序进行扩展呢
多态:
父类的对象可以引用子类的对象。
抽象类不能创建这个类的对象,但是可以创建一个具体子类的对象
Error: new Person(“Vincent vu ”);
Right:Person p = new Student(“vience vu”,“Economics”);
Equals方法:用于检测一个对象是否等于另外一个对象。判断是否具有相同的引用,如果具有相同的引用,他们一定是相等的,检测两个对象的状态相等。
完美教程:1.显式参数命名为otherobject,稍后会将他转换成一个叫other的变量
2.检测this与otherobject是否是引用同一个变量
3.检测otherobject是否为null,如果为null,返回false
4.比较this与otherobject是否属于同一个类,如果equals的语义在每个子类中有所改变,就用getclass,所有子类都拥有统一的语义,就使用instanceof检测。
5.将otherobject转换成相应的类类型变量
6.现在开始对所有需要比较的域进行比较,使用==比较基本类型域,使用equals比较对象域,如果所有的域都匹配,则返回true,否则返回false
对象包装器和自动打包:
接口:
Arrays类中的sort方法承诺可以对对象数组进行排序,但要求满足下列前提,对象所属的类必须实现了comparab接口,也就是说任何实现comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个object对象,返回一个整形数值。
回调:指出某个特定事件发生时应该采取的动作。
内部类:内部类是定义在一个类中的类,定义内部类的原因:内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
内部类可以对同一个包中的其他类隐藏起来
想要调一个回调函数并且不想编写大量代码时,使用匿名内部类比较便捷。
图形程序设计:
顶层窗口:Frame类(Swing版本为jframe)
默认关闭:frame.setDefaultCloseOperation(JFrame.Exit_on_close);
setLocation()和setBounds()设置框架的位置
setIconImage():用于告诉系统在标题栏,任务栏切换窗口位置显示的图标
setTitle()改变标题栏的文字
setResizable()是否显示
isVisible():
setVisible(Boolean b):设置窗口是否可见
setSize(int width,int height)设置窗口宽高
Dimension getSize()
Void setSize()获取或者设置当前组件的size属性
toFront将窗口显示到其他窗口前面
toBack()将窗口移到桌面窗口栈的后面
isLocationByPlatfrom()
setLocationByPlatfrom()设置或者获取LocationByPlatfrom的属性,属性在窗口显示之前被设置
Container getContentPane()返回这个JFrame的内容窗格对象
Component add(Componen c)将一个给定的组件添加到该框架的内容格
Void repaint()从新绘制组件
Void repaint(int x.int y,int width,int height)从新绘制组件的一部分
PaintComponent(Grphics g)覆盖这个方法来描述应该来如何绘制自己的组件
创建一个二维图形:
Graphics2D g2 = (Graphics2D) g;创建一个绘图方法的对象,
创建一个矩形对象:Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
通过绘图方法把矩形绘画出来,g2.draw(rect);
创建一个椭圆对象:Ellipse2D ellipse = new Ellipse2D.Double();
在矩形内部画一个椭圆:ellipse.setFrame(rect);
通过绘图的方法把图形画出来:g2.draw(ellipse);
把画图组件添加到窗体上面: DrawComponent component = new DrawComponent();
add(component);
jdbc:
我们可以将JDBC包看作一个用于将sql语句传递给数据库的应用编程的接口。
Jdbc语法的实例:jdbc:derby://localhost:1527/COREJAVA;creat=true
Jdbc:postgresql:COREJAVA
JDBC URL的一般语法:jdbc:subprotocol:other stuff
Subprotocol用于指明连接到数据库的特定驱动程序
Other stuff参数的格式随所用的subproyocol不同而不同