java基础教程(1)

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中不存在地址传递,只存在值传递。换句话说,只有基本数据类型传递的是拷贝,一切对象传递,传递的是的是本身。

你可能感兴趣的:(java基础教程(1))