类的继承、接口、抽象类与事件机制基础总结_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 类的继承、接口、抽象类与事件机制基础总结

类的继承、接口、抽象类与事件机制基础总结

 2013/7/16 3:48:23  michaelzjy  程序员俱乐部  我要评论(0)
  • 摘要:上回书说到,类和对象(谁的?)大战三百回合。。。二人平分秋色,所以类找来了他的儿子子类来帮忙,子类又找来了他的兄弟接口、抽象类和事件机制帮忙,最后对象(谁的??管他是谁的对象呢~)不敌众人,投入了类的帐下,成为类的两大猛将之一(另一个我不说你们也知道),终于类将各国统一,并自立国家,国号Java,自封JamesGosling。。。好扯的一段故事,还真是既没有逻辑有没有常识呐~~上一篇的类和对象的内容可以说是Java最基本的,在我看来像是一棵树的树干,而本篇的这四个点则是类这个树干上分出去的树枝
  • 标签:事件 总结 继承 接口 抽象

上回书说到,类和对象(谁的?)大战三百回合。。。二人平分秋色,所以类找来了他的儿子子类来帮忙,子类又找来了他的兄弟接口、抽象类和事件机制帮忙,最后对象(谁的??管他是谁的对象呢~)不敌众人,投入了类的帐下,成为类的两大猛将之一(另一个我不说你们也知道),终于类将各国统一,并自立国家,国号Java,自封James Gosling。。。好扯的一段故事,还真是既没有逻辑有没有常识呐~~

?

上一篇的类和对象的内容可以说是Java最基本的,在我看来像是一棵树的树干,而本篇的这四个点则是类这个树干上分出去的树枝。

?

1、关于类的继承的自己的理解

(1)类之间如果有继承关系的话,那么被继承的类叫做父类,继承的类叫做子类。所以从这个名字上我们也能生动形象想到他们在现实中的类比。

继承的格式

?关键字:extends?
? 格式:public void 子类名 extends 父类名{?
?? }?
?? 其中子类又叫派生类、超类,父类又叫基类。

例如做图形界面时的例子

?

class="java">public class Draw extends JFrame {
}

?

?

?

(2)在课上老师也这样举过例子,子类就像是父类的儿子,继承了父亲的基因,因为有了父亲的所有的特征,所以也有与父亲相同的行为。来,这位小萝莉看样子是不明白子承父亲的基因这件事呢,不明白的话我来给你指导一下吧,你是想要理论课呢还是实践课呢??(大误!!纯属YY)

?

? ?子类继承了父类的所有属性和方法?

? 【1】访问修饰符关键字(大小关系按顺序从小到大)?
? private 只能在类中使用?
? 默认的? 只能在同包中使用?
? protected 只能在同包中使用?
? public? 在所有情况下均可使用?

? 【2】同包中能使用的有:?
??? 默认的、protected、public均可在子类的{}和子类的对象中调用;?

? 【3】不同包中能使用的有:?
??? public在子类的{}和子类的对象中均可调用;?
??? protected只能在子类的对象中调用。?

?

import java.awt.Dimension;

import javax.swing.JFrame;


public class Calculator extends JFrame{
		public static void main(String[] args){
			Calculator cal=new Calculator();
			cal.initUI();
		}

		private CalculatorListener cl;
		public void initUI(){
			//窗体基本设置
			JFrame jf=new JFrame();
			jf.setSize(220,315);
			jf.setLocationRelativeTo(null);
			jf.setTitle("计算器");
			jf.setDefaultCloseOperation(3);
			jf.setResizable(false);
			jf.setJMenuBar(JMB());
                        jf.setVisibale(true);
}
}

?

?

(3)但是儿子肯定不能和父亲一模一样,所以他可以有自己独有的特征,有自己独有的行为。所以在子类中也可以定义属性和方法或是进行方法的重写。

? ?方法重写?
? 条件:【1】.有继承关系;?
? ? ? ? ? ? 【2】.方法在子类和父类中的返回值类型、类名、参数的个数、顺序和类型完全相同;?
? ? ? ? ? ? 【3】.其中方法的访问修饰符可以不相同,但是子类的访问修饰符一定大于等于父类的访???
? ? ? ? ? ? ? ? ? ? ? 问修饰符。?
?? 调用:?
? ? ? ? ? ? 【1】.先确定new的对象是谁的,那么就会优先执行谁的方法;?
? ? ? ? ? ? 【2】.子类没有则调用父类的方法。?

?

import javax.swing.JFrame;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Calculator extends JFrame{
//方法重写	
private JMenuBar JMB(){
		JMenuBar jmb=new JMenuBar();
		JMenu jm1=new JMenu("查看");
		JMenu jm2=new JMenu("编辑");
		JMenu jm3=new JMenu("帮助");
		
		JMenuItem jmi1=new JMenuItem("1");
		JMenuItem jmi2=new JMenuItem("2");
		JMenuItem jmi3=new JMenuItem("3");

		jm1.add(jmi1);
		jm2.add(jmi2);
		jm3.add(jmi3);
	
		
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.add(jm3);
		
		return jmb;
		
		
		}
}

?2、接口

?

写到这里,由实现接口和继承父类的区别的突然想到了一个很现实的比喻,啊怎么办,写不写上来呢,感觉这个比喻有点,额,怎么说,不着边际,而且要表达起来也很麻烦,写起来还浪费时间现在也够晚了。。。算了吧,还是写上来吧~

所以他们的区别在我看来很像开明的爸爸和保守的爸爸的区别,你猜那个是开明的爸爸呢?猜对有奖~~奖励就是告诉你父类像是开明的爸爸,而接口则是保守的爸爸~~蠢话

何谓三观?即世界观,人生观和价值观。三者为递进关系,前一个决定着下一个,所以才说,视野决定一切,视野即世界观,有了好的世界观才有好的人生观,进而才能有好的价值观。对于一个人,有了好的三观(请严肃对待这个词= = ||),才能有可能在当下立足。(天呐,我这是怎么了,越写越跑是要闹哪样。。。)反过来推,多数事业有成的人会有一个相对好的三观,而多数卢瑟则可能不会有。啊,终于要回正题来了。所以一个事业有成的爸爸会较开明,卢瑟老爸则是较保守。同理,父类相较接口也是显得较开明和事业有成,首先,父类里的方法相较接口里的抽象方法是具体的有内容的,所以我们可以把它比喻成事业有成,而同时,子类里可以选择性的实现父类的方法,而不用像接口一样必须实现所有的抽象方法,这个我们可以把他比喻成开明,所以有没有很形象捏~~我怎么这么啰嗦叫喊。。。

(1) 定义接口的格式

定义接口的关键字是:interface

格式:

public interface 接口名 extends 接口名,... ?{

//常量

public static final 数据类型 常量名 ?= 值;

//抽象方法

public 返回值数据类型 ?方法名(数据类型 参数名,...);

}

以MouseListener这个接口为例:

?

public interface MouseListener extends EventListener {

    public void mouseClicked(MouseEvent e);

    public void mousePressed(MouseEvent e);

    public void mouseReleased(MouseEvent e);

    public void mouseEntered(MouseEvent e);

    public void mouseExited(MouseEvent e);
}

?

(2) 实现接口的格式

实现接口的关键字是:implements

格式:

public class 类名 extens 类或者抽象类 implements 接口名,... {

?

//当类实现接口后,那么类必须要实现接口中所有的抽象方法

?

}

以实现键盘监听器接口为例:

?

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyClick implements KeyListener{
	
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent e) {

}
}

?

(3) 使用接口的注意事项

【1】.定义接口的关键字的关键字

【2】.接口只能定义常量和抽象方法

【3】.接口可以继承多个接口

【4】.接口中默认的访问修饰符是public

【5】.实现接口的关键字

【6】.实现接口后必须要实现接口中所有的抽象方法

【7】.接口也是一种类

【8】.接口不能用来实例化对象

?

(4)接口的优点:类的继承是单继承,那么有了接口,就可以丰富类的继承。

? ? ? ? ?类可以先继承类,然后再去实现接口

3、抽象类

(1)定义

定义抽象类的关键字是:abstract class

public abstract class 抽象类名 {

//定义类中所有的属性和方法

?

//定义接口中的常量和抽象方法

public abstract 返回值数据类型 方法名(数据类型 参数名,...);

}

(2)实现

public class 类名或者抽象类 extends 抽象类名{

//实现抽象类中所有的抽象方法。

}

注意:如果是类去继承抽象类,那么类必须要实现所有的抽象方法。

? ? ? ? 关于抽象类的这个我还没有很了解到底要怎么用,只能之后继续学习了解了

4、事件机制

? ? ? ? (1)事件源

只有Java的图形界面类才能成为事件源.

只要你点击的动作发生在图形界面对象上,那么该图形界面对象

就是事件源。

?

(2)事件监听器方法

让事件源可以随时监听对应的操作.

事件源对象.add**Listener(**Listener l);

?

(3)事件处理类对象

事件处理类,事件要执行的最终代码。

public class 类名 implements **Listener {

//重写事件接口中的抽象方法

}

最后整体以QQ界面以例,嫌长的可以不往下看了,因为代码之后就没有了~

写到这里正好发现自动保存的时间很有意思,129长跑诶~贴上来自娱一下~

?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;


public class window extends JFrame{
	public static void main(String[] args){	
	window win=new window();
		win.initUI();
	}
		public void initUI(){
			JFrame jf=new JFrame();
			jf.setSize(390,320);//界面大小
			jf.setTitle("QQ");//界面名字
			jf.setDefaultCloseOperation(3);//关闭方式
			jf.setLocationRelativeTo(null);//居中
			jf.setResizable(false);			//大小不可调
			
			JPanel jpn=new JPanel();//初始化北面面板对象
			jpn.setOpaque(false);//北面面板透明
			jpn.setPreferredSize(new Dimension(0,142));//北板大小
			jf.add(jpn,BorderLayout.NORTH);//放置北面的面板
			JLabel jl2=new JLabel(" 三宝");//初始化带字的标签页
			jl2.setFont(new Font("迷你简硬笔行书",Font.ROMAN_BASELINE,45));//字体
			jl2.setForeground(Color.black);//字体颜色
			jpn.setLayout(new BorderLayout());//北板边框布局
			jpn.add(jl2,BorderLayout.WEST);//将字放置到北板上
			
			ImageIcon im1=new ImageIcon("Image/QQIM11.jpg");//初始化图片对象
			JLabel  jl1= new JLabel(im1);//初始化标签对象,将图片放置在标签上
			//设置标签的起始位置和标签的大小
			jl1.setBounds(0, 0, im1.getIconWidth(), im1.getIconHeight());
			
			//添加到窗体的LayeredPanel面板的最底层(第二层面板)
			jf.getLayeredPane().add(jl1,new Integer(Integer.MIN_VALUE));
			
			//获取窗体的第一层面板
			JPanel contentPanel = (JPanel)jf.getContentPane();
			//设置第一层面板为透明
			contentPanel.setOpaque(false);

		//初始化东南西中的面板并设为透明	
			JPanel jpc=new JPanel();
			jpc.setOpaque(false);
			JPanel jps=new JPanel();
			jps.setOpaque(false);
			JPanel jpw=new JPanel();
			jpw.setOpaque(false);
			JPanel jpe=new JPanel();
			jpe.setOpaque(false);
			
			jpw.setLayout(new BorderLayout());//设置西边面板布局为边框布局
			
			jpe.setPreferredSize(new Dimension(79,50));//设置东边面板大小
			jpw.setPreferredSize(new Dimension(100,50));//西边
			
			
			//三个按钮
			JButton bn=new JButton("登          录");
			JButton bn1=new JButton("注册账号");
			JButton bn2=new JButton("找回密码");
			//中间面板的下拉框
			JComboBox cb=new JComboBox();
			cb.setEditable(true);//可编写
			//中间面板的密码输入
			JPasswordField pf=new JPasswordField();
			//两个复选框
			JCheckBox cb1=new JCheckBox("记住密码");
			JCheckBox cb2=new JCheckBox("自动登录");
			//两个复选框隐藏
			cb1.setOpaque(false);
			cb2.setOpaque(false);
			//西面的头像
			ImageIcon im=new ImageIcon("Image/QQIM6.jpg");
			JLabel jl=new JLabel(im);
			jpw.add(jl,BorderLayout.NORTH);
			//上述组件设置大小及字体
			cb.setPreferredSize(new Dimension(185,26));
			pf.setPreferredSize(new Dimension(185,26));
			bn.setPreferredSize(new Dimension(145,30));
			bn1.setPreferredSize(new Dimension(80,26));
			bn2.setPreferredSize(new Dimension(80,26));
			bn.setFont(new Font("微软雅黑",Font.BOLD,12));
			bn1.setFont(new Font("微软雅黑",Font.BOLD,11));
			bn2.setFont(new Font("微软雅黑",Font.BOLD,11));
			
			//上述组件添加到相应位置
			jpc.add(cb);
			jpc.add(pf);
			jpc.add(cb1);
			jpc.add(cb2);
			jps.add(bn);
			jpe.add(bn1);
			jpe.add(bn2);
			
			//将各面板添加到窗体各位置
			jf.add(jpc,BorderLayout.CENTER);
			jf.add(jps,BorderLayout.SOUTH);
			jf.add(jpw,BorderLayout.WEST);
			jf.add(jpe,BorderLayout.EAST);
			
			
			LoginListener l=new LoginListener(pf);
			bn.addActionListener(l);
			//设置可见
		    jf.setVisible(true);
		}
		}
		

?

实现监听器

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

public class LoginListener implements ActionListener{
	private JPasswordField pf;	
	
	public LoginListener(JPasswordField pf){
		
		this.pf=pf;	
		}
	

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		char[] s=pf.getPassword();		 
		if (s.equals("gemma")){
			 JFrame jf=new JFrame();
			 jf.setTitle("Gemma");
			 jf.setSize(200,700);
			 jf.setDefaultCloseOperation(3);
			 
			 jf.setVisible(true);
	}
		 else{JOptionPane.showMessageDialog(null,
					"你输入的账号错误,请重新输入!");
			 
		 }
	}
}

?

  • 大小: 3.2 KB
  • 查看图片附件
发表评论
用户名: 匿名