类与对象
类是一个模板:抽象,对象是一个具体的实例
类是一个抽象的概念 狗
对象是一个具体的狗 小明家的旺财
方法
定义、调用
对应的引用
属性:字段Field 成员变量
默认初始化
修饰符 属性类型 属性名 = 属性值
对象的创建和使用
类:
封装、继承、多态
属性私有:set/get
对比 | 代表的对象不同 | 前提 | 构造方法 |
---|---|---|---|
this | 本身调用这个对象 | 没用继承也可以使用 | 本类的构造 |
super | 代表父类对象的应用 | 只能在继承条件下才可以使用 | 父类的构造 |
重写都是方法的重写的,和属性无关
需要有继承关系,子类重写父类的方法!
重写,子类的方法必须跟父类必要一致:方法体不同
为什么需要重写:
父类的功能,子类不一定需要,或者不一定满足!
Alt+Insert :override
多态是方法的多态,属性没有多态
父类和子类,有联系 类型转换异常! ClassCastException !
存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new Son();
无法被重写的
抽象类不可以单继承,只能用接口
作用
implements 类可以实现接口 implements 接口
实现了接口中的类,就需要重写接口中的方法
利用接口实现多继承
try
catch
finally
工厂模式
简易工厂模式
该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:
下面我们使用手机生产来讲解该模式:
public interface Phone { void make(); }public class MiPhone implements Phone { public MiPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make xiaomi phone!"); } }public class IPhone implements Phone { public IPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make iphone!"); } }public class PhoneFactory { public Phone makePhone(String phoneType) { if(phoneType.equalsIgnoreCase("MiPhone")){ return new MiPhone(); } else if(phoneType.equalsIgnoreCase("iPhone")) { return new IPhone(); } return null; } }public class Demo { public static void main(String[] arg) { PhoneFactory factory = new PhoneFactory(); Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone! IPhone iPhone = (IPhone)factory.makePhone("iPhone"); // make iphone! } }工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
接下来继续使用生产手机的例子来讲解该模式。
其中和产品相关的Phone类、MiPhone类和IPhone类的定义不变。
AbstractFactory类:生产不同产品的工厂的抽象类
public interface AbstractFactory { Phone makePhone(); }XiaoMiFactory类:生产小米手机的工厂(ConcreteFactory1)
public class XiaoMiFactory implements AbstractFactory{ @Override public Phone makePhone() { return new MiPhone(); } }AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)
public class AppleFactory implements AbstractFactory { @Override public Phone makePhone() { return new IPhone(); } }演示:
public class Demo { public static void main(String[] arg) { AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! appleFactory.makePhone(); // make iphone! }}
边界布局(BorderLayout)
边界布局管理器把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH。依次对应为:上北(NORTH)、下南(SOUTH)、左西(WEST)、右东(EAST),中(CENTER),如下图所示。
特征:
l 可以把组件放在这五个位置的任意一个,如果未指定位置,则缺省的位置是CENTER。
l 南、北位置控件各占据一行,控件宽度将自动布满整行。东、西和中间位置占据一行;若东、西、南、北位置无控件,则中间控件将自动布满整个屏幕。若东、西、南、北位置中无论哪个位置没有控件,则中间位置控件将自动占据没有控件的位置。
l 它是窗口、框架的内容窗格和对话框等的缺省布局。
1、 常见的构建函数和方法
构造方法摘要
BorderLayout(): 构造一个组件之间没有间距(默认间距为0像素)的新边框布局。
BorderLayout(int hgap, int vgap) : 构造一个具有指定组件(hgap为横向间距,vgap为纵向间距)间距的边框布局。
方法摘要
int
getHgap() : 返回组件之间的水平间距。
int
getVgap() : 返回组件之间的垂直间距。
void
removeLayoutComponent(Component comp): 从此边框布局中移除指定组件。
void
setHgap(int hgap): 设置组件之间的水平间距。
void
setVgap(int vgap) : 设置组件之间的垂直间距。
网格布局
网格布局特点:
l 使容器中的各组件呈M行×N列的网格状分布。
l 网格每列宽度相同,等于容器的宽度除以网格的列数。
l 网格每行高度相同,等于容器的高度除以网格的行数。
l 各组件的排列方式为:从上到下,从左到右。
l 组件放入容器的次序决定了它在容器中的位置。
l 容器大小改变时,组件的相对位置不变,大小会改变。
l 设置网格布局行数和列数时,行数或者列数可以有一个为零。若rows为0,cols为3,则列数固定为3,行数不限,每行只能放3个控件或容器。若cols为0,rows为3,则行数固定为3,列数不限,且每行必定有控件,若组件个数不能整除行数,则除去最后一行外的所有行组件个数为:Math.ceil(组件个数/rows)。
Math.ceil(double x):传回不小于x的最小整数值。比如行数为3,组件数为13个,则Math.ceil(13/3)=5,即第一行,第二行组件数各为5个,剩下的组件放在最后一行。
l 若组件数超过网格设定的个数,则布局管理器会自动增加网格个数,原则是保持行数不变。
构造方法摘要 GridLayout(): 创建具有默认值的网格布局,即每个组件占据一行一列。 GridLayout(int rows, int cols) :创建具有指定行数和列数的网格布局。Rows为行数,cols为列数。 GridLayout(int rows, int cols, int hgap, int vgap) :创建具有指定行数、列数以及组件水平、纵向一定间距的网格布局。