上回书说到,类和对象(谁的?)大战三百回合。。。二人平分秋色,所以类找来了他的儿子子类来帮忙,子类又找来了他的兄弟接口、抽象类和事件机制帮忙,最后对象(谁的??管他是谁的对象呢~)不敌众人,投入了类的帐下,成为类的两大猛将之一(另一个我不说你们也知道),终于类将各国统一,并自立国家,国号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, "你输入的账号错误,请重新输入!"); } } }
?