今天给大家分享下面几点内容。
【1】在Eclipse中,如何优雅地做「Show in Finder」操作。
【2】如何优雅地把自己写的Class,share给别人。//打Jar包 rar压缩包
【3】如何优雅地添加其他工程的Jar包。
【4】抽象类 abstract。
【5】接口 interface。
【6】在MySql中如何优雅地查询多个匹配项。
【7】写Sql语句时的一个注意事项。
【8】如何在Java中优雅的设定想要的日期Calendar。
下面我们来一个一个说。
【1】在Eclipse中,如何优雅地做「Show in Finder」操作。
在MacOS中,有一个操作叫「Show in Finder」,比如,在Xcode中,选中一个XXX.swift文件,右键选择「Show in Finder」,此时MacOS会自动打开Finder同时进入该swift文件的所在目录。
那么在Eclipse中,是否也有同样的「Show in Finder」操作呢?
答案是,没有。
因为如果你在找「Show in Finder」这个操作名称的话,你会发现,在Eclipse
中是怎么找也找不到的。
那么难道在MacOS下的Eclipse中真的就没有「Show in Finder」操作了吗?那岂不是会很麻烦。
答案是,并不是。
因为这个操作是存在于Eclipse中的,不过被它调皮的换了个名字。😂
在Eclipse中的「Show in Finder」操作,叫「show in System Explorer」。
操作方法同样是:
选中一个XXX.java文件,右键选择「Show in」——> 「System Explorer」。
【2】如何优雅地把自己写的Class,share给别人。
把自己写的Class,share给别人,有两种方法:
方法一:(比较直接,但比较原始)
复制黏贴,需要share给别人的Class代码段。😂
方法二:(建议使用)
把需要share给别人的Class,打包成一个Jar包后,再把这个Jar包发过去。
具体打Jar包方法:
(1)选中一个XXX.java文件,也可以是一个package。
(2)右键选择「Export」。
(3)在弹出的设置框中,选择 ——>「Java」——>「JAR file」,点击「Next」。
(4)一般情况下,后面几页的选项可以都按照,系统已经帮你选好的默认选项来走,即,一直点击「Next」。
(5)直到可以点击「Finish」时点击「Finish」完成Jar包的导出。
ps.Jar包,可以理解为一个包含你工程class文件的压缩包,是可以用解压工具来打开查看包里面的文件的。
【3】如何优雅地添加其他工程的Jar包。
上一点讲了,自己写的Class,如何让share给别人。那么这一点,我们来讲讲如何把别人Shrae给我们的Jar包,添加到我们自己的工程项目里。
Step1:
在Jar文件所在目录,选择「复制」。
Step2:
在Eclipse中的目录结构「Package Explorer」,选择你想放置该Jar包地方,选择「粘贴」。
ps.建议在Eclipse中建立类似「libs」的文件夹目录,专门用于存放这类第三方Jar包。以使得文件管理更清晰明了
Step3:
在Step2之后,该Jar包就已经被添加进工程目录中了,此时还需要一个步骤,该Jar包就可以在工程中使用了(该Jar包封装好的public接口,就可以在工程中调用了)。这个步骤是,把该Jar包添加进工程的编译路径:
在「Package Explorer」中选择该Jar包后,点击右键,选择:
「Build Path」—> 「Add to Build Path」,即可。
【4】抽象类 abstract
首先,什么是「抽象类 abstract」
「抽象类 abstract」,是用于描述一类事物类(笼统的,抽象的描述,类似于总括。
所有抽象方法的定义,在子类里实现(不在他自己本身里实现。)
同时抽象类,本身不可实例化(不可创建对象),也是用子类在实现。
比如:「食物」就是一个抽象类,而牛排,鸡胸肉,番茄,土豆,等等,就是一个一个具体的食物。
可以说是「食物」这一个抽象类派生出来的子类。
那么为什么抽象类不可被示例化(不可创建对象)呢,你想啊,你想出东西的时候,你会说,我想出一块牛排,我想吃一个番茄,等等,但你不会说,我想吃一个食物,对吧。
那么对比来说,
「食物」是抽象类,
「牛排」是「食物」这一抽象类的子类,
而「一块牛排」则是「牛排」这一子类,创建的一个「实例化对象」了。
那么现在,你是否可以更好的理解「抽象类/子类/实例化对象」之间的关系了呢?
下面我们来说一下「抽象类」在「Java」中的具体写法:
创建一个abstract抽象类「Xxx」:
public abstract class Xxx {
public abstract void yyy(); //无方法体
}
抽象类用法:
由于抽象类本身不可被实例化,所以可以派生出一个它的子类,来使用该抽象类(该子类的父类)的抽象方法时,写法如下:
「抽象类的子类」
public class Abcd extends Xxx {
public Abcd() {
......
}
@Override
public void yyy() {
……
}
}
「抽象类子类的调用」
public class test {
Abcd abcd = new Abcd();
abcd.yyy();
//写法一:利用抽象类派生出来的子类,来调用抽象类的抽象方法。
Xxx abcd2 = new Abcd();
abcd2.yyy();
//写法二:定义了一个父类的引用,指向的对象是子类的类型。
}
即,用抽象类的子类,来实例化其抽象方法(创建一个对象。)
【5】接口 interface
下面我们来说一下「接口 interface」
写「接口 interface」的要求:
1>不能写方法体
2>必须是public
3>派生子类用的关键字为 implements(区别于子类继承父类时使用的 extends)
4>Java不支持多继承,即一个子类只能继承与一个父类。
5>但是Java可以 implements 多个接口,
6>而只要 implements 了该接口,那么该接口声明的方法必须在该类全部实现(以 @Override 方式来实现,可以空实现,但必须实现)
接口 interface 写法示例:
public interfase A {
public void a();
public void aa();
}
public interfase B {
public void b();
public void bb();
}
public class X implements A,B {
@Override
public void a() {}
@Override
public void aa() {}
@Override
public void b() {}
@Override
public void bb() {}
}
「接口」和「继承」是两个不一样的设计概念。(implements接口,extends父类)
接口的作用:
类似于电脑的用于接音箱/耳机的3.5mm音频接口,不管接入的是什么音频设备,只要符合「3.5mm音频接口的协议」,那么接入了这个接口之后就能用(比如:听音乐)。
所以,接口的作用,简单的说,定义一套通用的,大家调用这个接口时,需要同时遵守的协议,以使得大家可以对接上。
(2套系统之间对接,对接点,就是接口interface。
如上例:电脑系统和音箱系统的对接,接口就是那个3.5mm的音频接口。
所以,接口的作用,就是是两套独立的系统能够连接上,同时正常通信。
那么在Java开发里,类比一下,就是:
2个独立的封装好的类Class之间,通过双方协商好的/都同意认可的接口Interface协议,能够连接/对接上,同时正常通信)。
完整写法:
public interface A {
public void aa();
}
public class B {
A a;
public B() {
……
}
public void x() {
a.aa()
}
}
public class C implements A {
public C() {
……
}
@Override
public void aa() {
……
}
}
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
【6】在MySql中如何优雅地查询多个匹配项。
当我们在写sql查询MySql数据库数据时,可能会遇到一种情况:需要查询「适配多个匹配项的数据」,假如,我们要筛选5个id的数据出来(id不连续)。通常的写法:
select
*
from
a
where
id = x
and
id = xx
and
id = xxx
and
id = xxxx
and
id = xxxxx
这样写,可以说是,冗长麻烦易出错。
那么下面跟大家分享一种更简洁的写法:
select
*
from
a
where
id in(x,xx,xxx,xxxx,xxxxx)
是的,把 「id=X and…」,用「id in(X,……)」来替代。
这种写法,对于同时筛选,「多个、id不连续」的匹配项,特别地适用。
【7】写Sql语句时的一个注意事项。
当我们同时需要锁筛选的数据行中的,多个数据项时,写的sql有一个细节会比较容易写错。
下面来对比一下:
“select id, name "; //正确写法。
//vs
“select id,name "; //错误写法。
是的,没错,在第二行中,第二个被筛选的数据项「name」前面,没有加「空格」,直接和「,」逗号粘在了一起。
这么写的话,sql执行会报错的。所以要注意这个小细节,按照第一行的写法来写。
【8】如何在Java中优雅的设定想要的日期Calendar。
当我们需要在Java中设定每个具体时间,比如每个月月初的第一天,通常写法是:
Calendar calendar = Calendar.getInstance();
final int year = calendar.get(Calendar.YEAR);
final int month = calendar.get(Calendar.MONTH);
calendar.set(year, month, 1, 0,0,0);
当你运行项目,使用这一时间,筛选数据库中的数据时,你会发现,日期在该月第一天,时间为「00:00:00」的数据会被剔除在外,不在筛选结果之内。即使你写的是「>=」也没有用。
这是为什么呢?
当你仔细查看sql执行log时,你会发现,即使你把时间设定为了:
“selct ….. XXtime >= xxxx-xx-1 00:00:00”
但实际的执行log里却显示:
selct ….. XXtime >= xxxx-xx-1 00:00:00.abc
这里的「abc」是大于0的,它是比秒还小的单位:
「millisecond毫秒」
所以,现在你知道为什么:
「当你运行项目,使用这一时间,筛选数据库中的数据时,你会发现,日期在该月第一天,时间为「00:00:00」的数据会被剔除在外,不在筛选结果之内。即使你写的是「>=」也没有用。」
了吧。
那么咋么解决呢?
有一种办法,把:
calendar.set(year, month, 1, 0,0,0);
写成:
calendar.set(year, month, 31, 23,59,59);
但是每个月最后一天的日期,是不一样的。这里不能固定写「31」,那么沿着这个思路,再往下处理,(比如:识别月份,check最后一天的日期是几号,等等)。
就有点把「简单问题复杂化」,没有必要了。
那么下面要更大家分享的,就是另一个简单的办法(简洁的写法):
Calendar calendar = Calendar.getInstance();
final int year = calendar.get(Calendar.YEAR);
final int month = calendar.get(Calendar.MONTH);
calendar.set(year, month, 1, 0,0,0);
calendar.set(Calendar.MILLISECOND,0); //***
是的没错,就是在「//***」这一行处,追加了这一语句:
calendar.set(Calendar.MILLISECOND,0);
就解决啦。
这一句的主要做作用,就是把:
「millisecond毫秒」
的值,也设定为零
这么一来,你会发现,但实际的sql执行log里,会显示显示:
selct ….. XXtime >= xxxx-xx-1 00:00:00.000
//(原来的.abc变为了0)
那么,当你运行项目,筛选,日期「>=」该月第一天,时间为「00:00:00」的数据时,他就不会被剔除在筛选结果之外,会被筛选出来了。
~ ^_^ ~
—— zeroOS 复盘于 2018/05/26
「zeroOS·简书号」
© 著作权归作者所有
网友评论