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