本文目录一览:
- 1、如何使用 visual studio code 编译和调试 java 代码
- 2、java框架学习方式有哪些?
- 3、怎么样使用visual studio code 配置java环境
- 4、如何写一个自己的Java框架
- 5、用JAVA写了一个计算机的框架,怎么加代码实现基本运算(加减乘除,等于,清零)import java.awt.*;
如何使用 visual studio code 编译和调试 java 代码
介绍
Visual Studio Code的宣传语是:
一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。
按说的,Visual Studio Code特别适合来作为前端开发编辑器。
内置html开发神器emmet(zencoding),对css及其相关编译型语言Less和Sass都有很好的支持。
当然,最nice的还是写js代码了,这也是接下来要着重介绍的功能。
智能提示
因为之前微软推出了typescript语言,结合tsd文件,用visual studio写typescript代码是相当爽的,智能提示的功能非常nb。
这个功能理所应当也被vsc继承了。
目前主流的前端类库/框架,包括node.js及其模块/框架都有相应的tsd文件,可以去DefinitelyTyped上找一下。
在项目中引入对应文件,就可以有智能提示了。
这里以angular为例,使用步骤如下:
全局安装tsd,通过tsd安装.d.ts文件。这样会在项目下面生成.typings目录,目录下面就是下载的.d.ts文件,再写代码的时候就会有智能提示了。具体用法参考tsd用法。
npm install -g tsd
tsd query angular --action install
如果不想自己手工引入,也可以在angular变量后面按ctrl+k,会有个灯泡图片,点击灯泡图片就会有对应提示,选择下载xx.d.ts文件就可以了,编辑器会下载对应文件放在.typings目录。
过程如下图:
说完智能提示,再说代码调试。
调试Node
之前写过文章介绍过node.js的调试方案(Node.js调试)。从vsc发布后,就一直用写代码,也是用来调试node.js代码。
使用方法也很简单,步骤如下:
打开要调试的文件,按f5,编辑器会生成一个launch.json
修改launch.json相关内容,主要是name和program字段,改成和项目对应的
点击编辑器左侧长得像蜘蛛的那个按钮
点击左上角DEBUG后面的按钮,启动调试
打断点,尽情调试
过程如下图:
最后,再赠送彩蛋一个。
Node API 查看
在写node.js代码的时候,有时会忘记某个模块中有哪些方法及其用法,经常要去官网翻一下api文档。
这里介绍下怎么使用vsc来搞定这一问题。
打开vsc控制台(Help Toggle Developer Tools Console)
在控制台写代码,查询模块方法。
过程如下图:
vsc是用atom-shell(现在叫electron)写的,这和node-webkit(现在叫nw.js)一样,都是把node.js和chrome结合起来的工具,所以可以这么使用。
不过vsc使用到的node.js模块并不多,比如引用util和vm等会报错,用node-webkit就不会这样。
java框架学习方式有哪些?
1、打好基础是重中之重
基础部分可能很枯燥,但是一定要耐心坚持下去。因为打基础好比是在造轮子造汽车,没有打好基础在后面的学习就好比走路,可以说后面遇到的百分之七八十的问题都是基础没学好造成的。
2、多看官方文档多读源码
一定要看JDK相关类库、常用框架各种功能的源码,去了解其底层实现的原理。总的来说这个也是在打基础的部分,Java基础非常扎实才能看懂,在我们学习一个类的源码时,肯定会衍生出其他各种各样的问题,供我们来了解和学习,这也就是我们下一步学习的目标和方向。慢慢的,我们就会学习更多的知识,并积累更多的经验。
3、系统性学习,循序渐进
不要急于求成,每个知识点都要看,并且每个知识点都要勤加练习。有的同学在学习过程中觉得这个知识点简单,就跳着学习,其实这是个很大的问题,知识点细节必须要了解。我们学习Java需要循序渐进,一步一步来,不能操之过急。
4、遇到问题
遇到不会做的问题,当然不能置之不理。先在网上查,目前网络上针对很多问题都有完美的解决方案,如果网上没有类似的问题,那可能是你犯了什么小错误。也不要在这个问题上花费太多时间,这需要一定的学习技巧。Java中的知识有很强的相关性,有不懂的地方,可以用其他周边相关知识再回过头来理解,这样既不会耽误学习进度,又能理解自己不懂的地方
1)jvm有很多种,其实jvm是一个标准,sun做的那个叫hotspot,作者就是后来v8的作者lars bak,其他公司也做过jvm,其中做得比较好的有bea的jrockit,其他的包括ibm的r9,apple的jvm等在内,都做得不行,所以jvm主要是整合淘汰掉这些做得不好的jvm(s),整合成一个统一的openjdk。
2)java是典型的oop语言,其执行效率的优化,最早就是lars bak等人从smalltalk等长期优化的经验中总结出来并apply到hotspot上去滴,而smalltalk在早期apple机上搞出了那种拖拖拽拽就开发出app的做法,后来vc,delphi之类的其实都是抄袭或者说借鉴apple的smalltalk的做法,jobs说微软从头到尾都在抄袭apple是空穴来风,这里空穴来风跟王垠使用的空穴来风是一个意思,有趣的是,java的gui并没有继承这种搞法,反而对这种拖拖拽拽就作出app的做法批判有加,到今天,其实java的gui都还不能真正做到拖拖拽拽就作出来,问题很多,个人建议对于纯java的gui开发,还是以写代码为主。
3)jee也是一个或者说是一堆标准,知乎上有些人把maven,jenkins都算做jee是不对滴,jee的标准核心是ejb,其实就是一个xml配置化的java文件,这个标准在4的时候,达到了顶峰状态,几乎所有的挨踢大厂都主动支持该标准,之后开始走下坡路,支持的厂越来越少。
4)java和javascript的关系比很多人认为的要密切,javascript里面的java这四个字母可不是白叫的,比如js的版权和商标都控制在oracle手里,oracle对于js的支持甚至超过其对java的支持,并且喜欢捆绑销售,比如jvm里面就有一个js引擎。
5)jvm里面除了js engine以外还有一个浏览器排版引擎webkit,就是apple safari和google chrome用的那个那个。
6)java支持绝大多数脚本语言,你能叫得上名字的脚本语言,几乎都可以在jvm上执行,比如常见的js,ruby,python,甚至php,lua,只不过除了js以外你需要找到相关的脚本引擎。
7)spring的版权被控制在vmware手里,其实spring的那一大堆东西,本质上是一个非标准的jee实现,比如在jee里面用的inject,在spring里面就是autowire,当然spring曾经深刻滴影响了jee,所以有些东西比如di标准,是spring影响下制定出来的,所以spring的做法会比较特例一点。
8)maven上的jars数量前两天突破800万,其他语言的类库,排名第二的是npm,大概数量是maven的十分之一,也就是几十万,不知道现在突破100万没有,然后是gem,也就是ruby那个,大概是十几万,下来是python的module,大概数量级是几万,没突破十万。
9)java的标准是由一个叫做jcp的组织制定的,所有标准需要经过jcp的执行委员会通过方可执行,jcp几乎包括了你所知道的绝大多数知名挨踢公司和组织,比如google,apple,ibm,intel,arm,red hat,twitter等,还有一些教育机构,比如我国的北京大学,阿里最近一次申请jcp执行委员会成员资格,似乎投票不通过,最近一次执行委员会新增两个成员是arm和jetbrains。
10)微软也曾经是jcp甚至是java的主要贡献者,但是利益驱使下,想扩展java,从而破坏java跨平台的特性,所以跟sun闹翻,其本质原因就是想让客户写的java代码跟windows绑定,sun坚决不同意,闹翻,今天回头看这个结果,只能说:双输,sun挂了,微软的ria也离挂不太远了,silverlight已经放弃了,比起当年ie自带有jvm的支持来说,那完全就是两回事。
11)除了微软以外,jcp还缺少一个重要组织apache,因为apache跟oracle也闹翻了,oracle似乎并不在乎开源组织,而更在意商业公司的支持。
12)java曾经有一个内置的数据库,9之后被剥离。
13)j2me是j2se的子集。
14)vert.x作者tim fox最早在vmware做spring时候看到了node.js,萌生出了制作支持多核的node.x的想法,并在离开vmware后加入red hat将其实现,vmware看到后开始耍无赖,claim node.x后来改叫vert.x的版权,不惜跟red hat打官司,后来各方妥协,将其交给eclipse foundation。
15)oracle在收购bea之前,一开始的目标并不是bea和bea的weblogic,而是jboss,但是jboss表现出了极为有种的一面,在oracle收购成功之前,投入了red hat的怀抱,因为都是开源组织,从此jboss成了red hat的一个子部门,oracle收购jboss失败之后,转向bea,庄思浩气死了,但是没用,最后还是被恶意收购。
16)sun在玩不下去之前最早尝试接触的目标是ibm,ibm嫌太贵,放弃之后,被转手给了oracle。(Java学习交流QQ群:589809992 我们一起学Java!)
17)vert.x的作者tim fox在离开red hat之前曾经发过twitter抱怨,外人比如我们,猜测是因为red hat内部已经有了一个jboss,所以跟vert.x在应用上有了重叠,所以导致tim fox的出走,但是出走之后,red hat答应对vert.x做持续性的战略投入,所以vert.x core的几个developers,其实拿的是red hat的工资,但是vert.x的版权并不在red hat手里,而在eclipse foundation手里。
18)vert.x的几个核心开发人员都是google summer of code的导师,每年年初时候会招收在校大学生搞项目。
19)教育机构相关:scala的作者马丁是德国人,eth的博导,groovy的主要领导人是法国人,jruby背后是东京大学,jboss的作者是法国大学校x的校友,x就是伽罗瓦考不进去的那所大学,伽罗瓦进不了x,所以改读巴黎高师,tim fox毕业于帝国理工,主席去的那个,netty作者trustin lee是acm银牌,现在line工作,毕业于sky里面的延世大学,kotlin是毛子公司jetbrains的作品,看linkedin,很多人毕业自圣彼得堡大学,spring作者rod johnson是悉尼大学的音乐博士,hibernate作者gavin king是澳洲莫那什大学的数学本科毕业生,james gosling这种cmu和calgory的估计烂大街了,sun是斯坦福大学网络的意思,夹带两个私货,aspectj有一个维护小组在mcgill,hbase跟waterloo关系密切。
20)java早期被人认为慢,跟java坚持不用硬件加速渲染有关,死活就是不肯接入directx和opengl,7之后总算开窍,搞了一个图形引擎接入了directx/opengl。
21)casssandra是facebook做失败的项目,被贡献给了apache之后老树开花。
22)groovy被贡献给了apache,现在叫做apache groovy,ceylon被贡献给了eclipse,现在叫做eclipse ceylon。
23)netflix现在是java shop,之前是用.net的。
先想到这么多,有空再写。
怎么样使用visual studio code 配置java环境
visual
studio
code仅仅是一个代码编辑器(相当于一个高级记事本),不是IDE。
要写java代码建议使用eclipse
如何写一个自己的Java框架
可以写一些能通用的类 ,封装好 然后可以用maven打包成jar ,这样就是一个简单的java框架了。在项目中导入这个jar 就能直接调用你写的类了。
用JAVA写了一个计算机的框架,怎么加代码实现基本运算(加减乘除,等于,清零)import java.awt.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
public class Counter extends Frame {
// 声明三个面板的布局
GridLayout gl1, gl2, gl3;
Panel p0, p1, p2, p3;
JTextField tf1;
TextField tf2;
Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14,
b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26;
StringBuffer str;// 显示屏所显示的字符串
double x, y;// x和y都是运算数
int z;// Z表示单击了那一个运算符.0表示"+",1表示"-",2表示"*",3表示"/"
static double m;// 记忆的数字
public Counter() {
gl1 = new GridLayout(1, 4, 10, 0);// 实例化三个面板的布局
gl2 = new GridLayout(4, 1, 0, 15);
gl3 = new GridLayout(4, 5, 10, 15);
tf1 = new JTextField(27);// 显示屏
tf1.setHorizontalAlignment(JTextField.RIGHT);
tf1.setEnabled(false);
tf1.setText("0");
tf2 = new TextField(10);// 显示记忆的索引值
tf2.setEditable(false);
// 实例化所有按钮、设置其前景色并注册监听器
b0 = new Button("Backspace");
b0.setForeground(Color.red);
b0.addActionListener(new Bt());
b1 = new Button("CE");
b1.setForeground(Color.red);
b1.addActionListener(new Bt());
b2 = new Button("C");
b2.setForeground(Color.red);
b2.addActionListener(new Bt());
b3 = new Button("MC");
b3.setForeground(Color.red);
b3.addActionListener(new Bt());
b4 = new Button("MR");
b4.setForeground(Color.red);
b4.addActionListener(new Bt());
b5 = new Button("MS");
b5.setForeground(Color.red);
b5.addActionListener(new Bt());
b6 = new Button("M+");
b6.setForeground(Color.red);
b6.addActionListener(new Bt());
b7 = new Button("7");
b7.setForeground(Color.blue);
b7.addActionListener(new Bt());
b8 = new Button("8");
b8.setForeground(Color.blue);
b8.addActionListener(new Bt());
b9 = new Button("9");
b9.setForeground(Color.blue);
b9.addActionListener(new Bt());
b10 = new Button("/");
b10.setForeground(Color.red);
b10.addActionListener(new Bt());
b11 = new Button("sqrt");
b11.setForeground(Color.blue);
b11.addActionListener(new Bt());
b12 = new Button("4");
b12.setForeground(Color.blue);
b12.addActionListener(new Bt());
b13 = new Button("5");
b13.setForeground(Color.blue);
b13.addActionListener(new Bt());
b14 = new Button("6");
b14.setForeground(Color.blue);
b14.addActionListener(new Bt());
b15 = new Button("*");
b15.setForeground(Color.red);
b15.addActionListener(new Bt());
b16 = new Button("%");
b16.setForeground(Color.blue);
b16.addActionListener(new Bt());
b17 = new Button("1");
b17.setForeground(Color.blue);
b17.addActionListener(new Bt());
b18 = new Button("2");
b18.setForeground(Color.blue);
b18.addActionListener(new Bt());
b19 = new Button("3");
b19.setForeground(Color.blue);
b19.addActionListener(new Bt());
b20 = new Button("-");
b20.setForeground(Color.red);
b20.addActionListener(new Bt());
b21 = new Button("1/X");
b21.setForeground(Color.blue);
b21.addActionListener(new Bt());
b22 = new Button("0");
b22.setForeground(Color.blue);
b22.addActionListener(new Bt());
b23 = new Button("+/-");
b23.setForeground(Color.blue);
b23.addActionListener(new Bt());
b24 = new Button(".");
b24.setForeground(Color.blue);
b24.addActionListener(new Bt());
b25 = new Button("+");
b25.setForeground(Color.red);
b25.addActionListener(new Bt());
b26 = new Button("=");
b26.setForeground(Color.red);
b26.addActionListener(new Bt());
// 实例化四个面板
p0 = new Panel();
p1 = new Panel();
p2 = new Panel();
p3 = new Panel();
// 创建一个空字符串缓冲区
str = new StringBuffer();
// 添加面板p0中的组件和设置其在框架中的位置和大小
p0.add(tf1);
p0.setBounds(10, 25, 300, 40);
// 添加面板p1中的组件和设置其在框架中的位置和大小
p1.setLayout(gl1);
p1.add(tf2);
p1.add(b0);
p1.add(b1);
p1.add(b2);
p1.setBounds(10, 65, 300, 25);
// 添加面板p2中的组件并设置其的框架中的位置和大小
p2.setLayout(gl2);
p2.add(b3);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.setBounds(10, 110, 40, 150);
// 添加面板p3中的组件并设置其在框架中的位置和大小
p3.setLayout(gl3);// 设置p3的布局
p3.add(b7);
p3.add(b8);
p3.add(b9);
p3.add(b10);
p3.add(b11);
p3.add(b12);
p3.add(b13);
p3.add(b14);
p3.add(b15);
p3.add(b16);
p3.add(b17);
p3.add(b18);
p3.add(b19);
p3.add(b20);
p3.add(b21);
p3.add(b22);
p3.add(b23);
p3.add(b24);
p3.add(b25);
p3.add(b26);
p3.setBounds(60, 110, 250, 150);
// 设置框架中的布局为空布局并添加4个面板
setLayout(null);
add(p0);
add(p1);
add(p2);
add(p3);
setResizable(false);// 禁止调整框架的大小
// 匿名类关闭窗口
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e1) {
System.exit(0);
}
});
setBackground(Color.lightGray);
setBounds(100, 100, 320, 280);
setVisible(true);
}
// 构造监听器
class Bt implements ActionListener {
public void actionPerformed(ActionEvent e2)
{
try{
if(e2.getSource()==b1)// 选择"CE"清零
{
tf1.setText("0");// 把显示屏清零
str.setLength(0);// 清空字符串缓冲区以准备接收新的输入运算数
}
else if(e2.getSource()==b2)// 选择"C"清零
{
tf1.setText("0");// 把显示屏清零
str.setLength(0);
}
else if(e2.getSource()==b23)// 单击"+/-"选择输入的运算数是正数还是负数
{
x=Double.parseDouble(tf1.getText().trim());
tf1.setText(""+(-x));
}
else if(e2.getSource()==b25)// 单击加号按钮获得x的值和z的值并清空y的值
{
x=Double.parseDouble(tf1.getText().trim());
str.setLength(0);// 清空缓冲区以便接收新的另一个运算数
y=0d;
z=0;
}
else if(e2.getSource()==b20)// 单击减号按钮获得x的值和z的值并清空y的值
{
x=Double.parseDouble(tf1.getText().trim());
str.setLength(0);
y=0d;
z=1;
}
else if(e2.getSource()==b15)// 单击乘号按钮获得x的值和z的值并清空y的值
{
x=Double.parseDouble(tf1.getText().trim());
str.setLength(0);
y=0d;
z=2;
}
else if(e2.getSource()==b10)// 单击除号按钮获得x的值和z的值并空y的值
{
x=Double.parseDouble(tf1.getText().trim());
str.setLength(0);
y=0d;
z=3;
}
else if(e2.getSource()==b26)// 单击等号按钮输出计算结果
{
str.setLength(0);
switch(z)
{
case 0 : tf1.setText(""+(x+y));break;
case 1 : tf1.setText(""+(x-y));break;
case 2 : tf1.setText(""+(x*y));break;
case 3 : tf1.setText(""+(x/y));break;
}
}
else if(e2.getSource()==b24)// 单击"."按钮输入小数
{
if(tf1.getText().trim().indexOf('.')!=-1)// 判断字符串中是否已经包含了小数点
{
}
else// 如果没数点有小
{
if(tf1.getText().trim().equals("0"))// 如果初时显示为0
{
str.setLength(0);
tf1.setText((str.append("0"+e2.getActionCommand())).toString());
}
else if(tf1.getText().trim().equals(""))// 如果初时显示为空则不做任何操作
{
}
else
{
tf1.setText(str.append(e2.getActionCommand()).toString());
}
}
y=0d;
}
else if(e2.getSource()==b11)// 求平方根
{
x=Double.parseDouble(tf1.getText().trim());
tf1.setText("数字格式异常");
if(x0)
tf1.setText("负数没有平方根");
else
tf1.setText(""+Math.sqrt(x));
str.setLength(0);
y=0d;
}
else if(e2.getSource()==b16)// 单击了"%"按钮
{
x=Double.parseDouble(tf1.getText().trim());
tf1.setText(""+(0.01*x));
str.setLength(0);
y=0d;
}
else if(e2.getSource()==b21)// 单击了"1/X"按钮
{
x=Double.parseDouble(tf1.getText().trim());
if(x==0)
{
tf1.setText("除数不能为零");
}
else
{
tf1.setText(""+(1/x));
}
str.setLength(0);
y=0d;
}
else if(e2.getSource()==b3)// MC为清除内存
{
m=0d;
tf2.setText("");
str.setLength(0);
}
else if(e2.getSource()==b4)// MR为重新调用存储的数据
{
if(tf2.getText().trim()!="")// 有记忆数字
{
tf1.setText(""+m);
}
}
else if(e2.getSource()==b5)// MS为存储显示的数据
{
m=Double.parseDouble(tf1.getText().trim());
tf2.setText("M");
tf1.setText("0");
str.setLength(0);
}
else if(e2.getSource()==b6)// M+为将显示的数字与已经存储的数据相加要查看新的数字单击MR
{
m=m+Double.parseDouble(tf1.getText().trim());
}
else// 选择的是其他的按钮
{
if(e2.getSource()==b22)// 如果选择的是"0"这个数字键
{
if(tf1.getText().trim().equals("0"))// 如果显示屏显示的为零不做操作
{
}
else
{
tf1.setText(str.append(e2.getActionCommand()).toString());
y=Double.parseDouble(tf1.getText().trim());
}
}
else if(e2.getSource()==b0)// 选择的是“BackSpace”按钮
{
if(!tf1.getText().trim().equals("0"))// 如果显示屏显示的不是零
{
if(str.length()!=1)
{
tf1.setText(str.delete(str.length()-1,str.length()).toString());// 可能抛出字符串越界异常
}
else
{
tf1.setText("0");
str.setLength(0);
}
}
y=Double.parseDouble(tf1.getText().trim());
}
else// 其他的数字键
{
tf1.setText(str.append(e2.getActionCommand()).toString());
y=Double.parseDouble(tf1.getText().trim());
}
}
}
catch(NumberFormatException e){
tf1.setText("数字格式异常");
}
catch(StringIndexOutOfBoundsException e){
tf1.setText("字符串索引越界");
}
} }
public static void main(String args[]) {
new Counter();
}
}