枚举的简易介绍:
1. 枚举是JDK1.5版本新增的特性(泛型、For-each等如今被广泛应用的特性也是由JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型.
简易实例:public enum ColorclothesEnum{
green,red,
}
2.枚举常用方法:
1.values()获取存储枚举中所有常量实例的数组。常配合foreach完成遍历。
2.构造方法,枚举的构造方法只能用private修饰符修饰,如果被别的调用那他便不在私有,他是不可以修改的、不可继承的。
3.valueOf()通过常量名获取对应的枚举实例。
3.枚举的好处以及与常量类的区别(借鉴)
1)枚举型可以直接与数据库打交道,我通常使用varchar类型存储,对应的是枚举的常量名。(数据库中好像也有枚举类型,不过也没用过)
2) switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况
3) 当你使用常量类时,往往得通过equals去判断两者是否相等,使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高
4) 常量类编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。
5)枚举类编译后默认为final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,容易导致父类的不兼容。
设计模式的课外补充:
借鉴{:java的设计模式大体上分为三大类:
创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
六个模式设计原则:
1、开闭原则(Open Close Principle)
对扩展开放,对修改关闭。
2、里氏代换原则(Liskov Substitution Principle)
只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
使用多个隔离的借口来降低耦合度。
5、迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。继承实际上破坏了类的封装性,超类的方法可能会被子类修改。}
- 工厂模式(Factory Method)
常用的工厂模式是静态工厂,利用static方法,作为一种类似于常见的工具类Utils等辅助效果,一般情况下工厂类不需要实例化。
interface food{}
class A implements food{}
class B implements food{}
class C implements food{}
public class StaticFactory {
private StaticFactory(){}
public static food getA(){ return new A(); }
public static food getB(){ return new B(); }
public static food getC(){ return new C(); }
}
class Client{
//客户端代码只需要将相应的参数传入即可得到对象
//用户不需要了解工厂类内部的逻辑。
public void get(String name){
food x = null ;
if ( name.equals(“A”)) {
x = StaticFactory.getA();
}else if ( name.equals(“B”)){
x = StaticFactory.getB();
}else {
x = StaticFactory.getC();
}
}
}
2. 抽象工厂模式(Abstract Factory)
一个基础接口定义了功能,每个实现接口的子类就是产品,然后定义一个工厂接口,实现了工厂接口的就是工厂,这时候,接口编程的优点就出现了,我们可以新增产品类(只需要实现产品接口),只需要同时新增一个工厂类,客户端就可以轻松调用新产品的代码。
抽象工厂的灵活性就体现在这里,无需改动原有的代码,毕竟对于客户端来说,静态工厂模式在不改动StaticFactory类的代码时无法新增产品,如果采用了抽象工厂模式,就可以轻松的新增拓展类。
interface food{}
class A implements food{}
class B implements food{}
interface produce{ food get();}
class FactoryForA implements produce{
@Override
public food get() {
return new A();
}
}
class FactoryForB implements produce{
@Override
public food get() {
return new B();
}
}
public class AbstractFactory {
public void ClientCode(String name){
food x= new FactoryForA().get();
x = new FactoryForB().get();
}
}
3.外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。这句话是百度百科的解释,有点难懂,但是没事,看下面的例子,我们在启动停止所有子系统的时候,为它们设计一个外观类,这样就可以实现统一的接口,这样即使有新增的子系统subSystem4,也可以在不修改客户端代码的情况下轻松完成。
public class Facade {
private subSystem1 subSystem1 = new subSystem1();
private subSystem2 subSystem2 = new subSystem2();
private subSystem3 subSystem3 = new subSystem3();
public void startSystem(){
subSystem1.start();
subSystem2.start();
subSystem3.start();
}
public void stopSystem(){
subSystem1.stop();
subSystem2.stop();
subSystem3.stop();
}
}
4.桥接模式(Bridge)
这里引用下http://www.runoob.com/design-pattern/bridge-pattern.html的例子。Circle类将DrwaApi与Shape类进行了桥接,代码:
interface DrawAPI {
public void drawCircle(int radius, int x, int y);
}
class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println(“Drawing Circle[ color: red, radius: "
+ radius +”, x: " +x+", “+ y +”]");
}
}
class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println(“Drawing Circle[ color: green, radius: "
+ radius +”, x: " +x+", “+ y +”]");
}
}
abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
public abstract void draw();
}
class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
drawAPI.drawCircle(radius,x,y);
}
}
//客户端使用代码
Shape redCircle = new Circle(100,100, 10, new RedCircle());
Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
redCircle.draw();
greenCircle.draw();
5.代理模式(Proxy)
客户端通过代理类访问,代理类实现具体的实现细节,客户只需要使用代理类即可实现操作。
这种模式可以对旧功能进行代理,用一个代理类调用原有的方法,且对产生的结果进行控制。
interface Source{ void method();}
class OldClass implements Source{
@Override
public void method() {
}
}
class Proxy implements Source{
private Source source = new OldClass();
void doSomething(){}
@Override
public void method() {
new Class1().Func1();
source.method();
new Class2().Func2();
doSomething();
}
}
举例过来,除去这些和上课的内容还有14种设计模式,其实设计模式只是一种理念而不是一成不变的,更多的还是需要我们自身去设计和制造。
GIT的使用:
一:Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
二:windows下安装:
在官网下载好应用程序后:
第一步:进入项目目录,初始化(只需要执行一次)
git init
···
第二步:添加要管理的文件
git add . // 添加所有文件
git add Test.java // 只添加Test.java文件
查看git的状态:git status
第三步:让修改被记录下来
git commit -m '初次提交'
如果要回退到某个版本
首先列出提交的日志: git log
使用 git reset --hard 版本号 来回退到某个版本
add 要忽略某些文件或文件夹
.gitignore 在其中添加需要忽略的文件或文件夹的名字
(在IDEA中还需要添加.idea文件夹)
out
src
IDEA中的git使用
在github上添加一个远程仓库
远程仓库名 远程仓库地址
git remote add origin +自己的远程仓库地址
git remote -v 查看关联的远程仓库
git push origin master // 将本地代码推送到远程仓库origin的master分支上
TCP/IP协议:
tcp 传输控制协议
ip 网络地址协议
应用层常见协议
http 超文本传输协议(访问网页)
telnet 远程登录
打包和确定目的应用程序
TCP(保障数据的可靠有序), UDP 不保证
互联网层使用的是:ip协议
而我们一般的JAVA-web开发大多使用的google和firefox浏览器,因为可以直接查询底层源码,而IE浏览器更新较慢兼容性不够好。
阻塞IO:BIO Blocking
基础的服务器使用:
ServerSocket服务器的端点:
new ServerSocket(端口号); // 每个程序只能占用一个端口, 自己的程序用4位以上的端口
.accept(); // 等待, 直到客户端连接为止
new Thread(new Runnable(){
public void run() {
// 把io相关的操作放在线程内执行,让每个线程处理一个io操作,避免io阻塞
}
}).start();
阻塞io的特点,一个socket执行io读写操作会阻塞其它io的读写
一个线程内io的读写是串行的,可以用多线程的方法来解决, 建议使用线程池而不是自己手动创建线程
并发量高的时候需要使用线程池。
compraterto接口的简化:
new Thread(new Runnable(){
public void run(){}
}).start();
new Thread(()->{}).start();
参数部分 特殊符号 代码体
( 形参 ) -> { 执行的代码 }
针对单方法的接口,才能使用lambda表达式简化
()->{} 参数部分可以省略类型, 如果代码体部分只有一条语句,{} 也可以省略,且不能加;号
如果代码体部分 只有一条语句,那么它还可以充当返回值,从而省略return(并不建议过多省略)。