0--------综述
java的源文件目录为.java,编译后的文件为.class。.class文件可以在JVM上运行,本质上来说,java是一个既需要编译器,有需要解释器(JVM)的语言。但是,java也有即时编译的功能,也就是产生和平台相关的机器语言。相比而言,后者的兼容性差,而效率更高。
另外要说明的是,java和JavaScript一点关系都没有,后者只是觉得加上java更时髦,所以就自动冠名了。
1-------一些关键字
final关键字
final定义类似常量。但是和const不完全一致,本质含义是不能被再次赋值或覆盖
super&&this关键字
this(),表示当前类的构造函数。
如果不是一个函数,则表示当前对象。注意,本类中方法引用的类成员变量都是默认的。
super(),表示父类的构造函数。
super.xxxx(),表示调用父类的相关方法,注意,这是一种特殊用法,因为实际上super也一定指向当前对象,这必然和我们所期望的完全不同。
2--------swing界面设计技术
JFrame是Frame的子类,属于顶层容器。组件在容器中的位置和大小是由布局管理器决定的。
Java提供了5个布局管理机制,下面三个较为常用
(1)FlowLayout:流式布局,按添加顺序,可以选择左对齐,右对齐,或者居中对齐,放不下的组件将放置在下一行中(默认居中对齐)
(2)borderlayout:边界布局,将容器划分为上下左右中五个部分。是JFrame和Jdialog的默认布局方式
(3)GridLayout:网格布局。依次占用对应网格,相对位置不随缩放而发生变化
一个界面上只能有一个Jframe却可以有多个Jpanel,jpanel上也可以应用布局管理器,jpanel是jcoponent的子类,默认的布局管理器是流式,jpanel属于容器类组件,可以加入别的组件。
事实上java.awt.container------java.awt.window------java.awt.frame------javax.swing.jframe
java.awt.container------javax.swing.jcoponent-------jpanel,jlabel....
一般有两种写法,第一种如下:
(1)声明一个JFrame的对象,然后对这个对象进行若干进一步调整
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class DemoGui { public static void main(String agrs[]){ JFrame nw= new JFrame("登录"); nw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel nn=new JPanel(); JLabel a1=new JLabel("用户名"); JLabel a2=new JLabel("密码 "); JTextField b1=new JTextField("name "); JTextField b2=new JTextField("password"); JButton n1=new JButton("确定"); nn.add(a1); nn.add(b1); nn.add(a2); nn.add(b2); nn.add(n1); nw.add(nn); nw.setSize(300, 300); nw.setVisible(true); n1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("hello,you touch me"); } }); } }
(2)适用于较大程序,声明一个类继承Jframe
public class DemoGui extends JFrame{ private int X=50; private int Y=50; private int R=20; public DemoGui(){ this.setLocation(300,100); this.setSize(500,400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DrawArea drawArea = new DrawArea(); this.add(drawArea); this.setVisible(true); } private void drawCircle(Graphics g){ g.setColor(Color.BLUE); g.fillOval(X, Y, R, R); } public static void main(String args[]){ DemoGui frame =new DemoGui(); } public class DrawArea extends JLabel{ public DrawArea(){ } public void paint(Graphics g){ Image image=createImage(getWidth(),getHeight()); drawCircle(image.getGraphics()); g.drawImage(image,0,0,null); } } }
coponent类提供了两个最重要的方法 paint,repaint。在组件第一次被显示,或窗口大小进行变化,或进行了最小化后最大化的操作,都会调用paint的方法。(就是系统的回调函数)repaint用于手动调用,实际上系统repaint先调用update方法在调用paint方法。update的默认功能以背景色填充。paint和update均可以进行重载。上例中,对jlabel的重载挖成了画图。
再上一个例子中,我们使用了java内部类,下面做简单介绍。
3-------java的类结构
在操作系统执行java命令的时候,会首先寻找jre的目录,寻找jvm.dll,初始化jvm,然后产生一个启动类加载器(bootstrap loader),最终加载java后面的类。
一个package(包)对应一个存放源代码的目录。包中可以包含子包。
对于public类,在源文件中,每次只能定义一个公共类,而且文件名必须和类名保持一致,该类被同目录下的其他文件自动import
4.--------内部类
内部类,或称为嵌入类,是指定义在其他类内部的类。下面的代码编译后,在bin目录下会产生如下几个文件,
DemoGui.class DemoGui$DrawArea.class DemoGui$1.class DemoGui$2.class
第一个使我们的类,第二个是内部类,三四两个是所谓的匿名内部类,由如下代码产生
btErase.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){flag = 0;drawArea.repaint();}});
简单而言,这是声明一个类,然后声明一个对象,该对象作为函数的一参数。ActionListener是父类名,子类继承其产生,actionPerformed为子类覆盖父类的相应方法。
内部类分为成员内部类,局部内部类,嵌套内部类,匿名内部类几种。
内部类可以访问外部类的任何数据和方法,一般默认即是表示外部类,也可以通过this.指定内部类或outer.this.指定为内部类中属性和方法。要记住一点,必须先存在外部类的对象才能声明内部类的对象。
常见的不在外部类中的对外部类中的内部类生命如下:
Out.In in = new Out().new In();
下面的代码就是成员内部类的简单例子.
另外值得一提的是,如果内部类被标记为static,其只能访问为static的外部类属性或方法,原因和被标记为static的方法一致。
5.Java的事件处理机制
<pre name="code" class="java">public class DemoGui extends JFrame{ private int X=50; private int Y=50; private int R=20; private int flag=0; JButton btPaint = new JButton("绘图"); JButton btErase = new JButton("清除"); DrawArea drawArea = new DrawArea(); JPanel panel = new JPanel(); public DemoGui(){ this.setLocation(300,100); this.setSize(500,400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.add(btPaint); panel.add(btErase); panel.setLayout(new FlowLayout()); this.setVisible(true); add(drawArea,BorderLayout.CENTER); add(panel,BorderLayout.NORTH); btPaint.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ flag = 1; drawArea.repaint(); } }); btErase.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ flag = 0; drawArea.repaint(); } }); } private void drawCircle(Graphics g){ g.setColor(Color.BLUE); g.fillOval(X, Y, R, R); } public static void main(String args[]){ DemoGui frame =new DemoGui(); } public class DrawArea extends JLabel{ public DrawArea(){ } public void paint(Graphics g){ if(flag==1){ Image image=createImage(getWidth(),getHeight()); drawCircle(image.getGraphics()); g.drawImage(image,0,0,null); } } } }
java的事件处理机制中有三个相关方。事件状态对象(event),事件源(比如说上例中的button),还有一个明确的方法(event listener)
6.java 指针?引用?
java和c#一样,完全没有指针的概念。但是和任何变成软件一样,java中的内存分配,也是存在在堆栈中分配,和在堆中分配两种可能性。实际上,java中所有的基本数据类型,都是存在堆栈中,而对象存在于堆中,对象的引用,存在于堆栈中。这就解释了为什么说java中不存在地址传递,只存在值传递。换句话说,只有基本数据类型传递的是拷贝,一切对象传递,传递的是的是本身。