java中的接口与监听器
一、继承的定义
在了解接口之前,我想我们得先来弄清楚继承这一个概念,java是一个面向对象编程的软件,所以在java中我们需要去定义类,众所周知,类具有方法和属性,由此,当我们遇到一些类他们之间的一些属性与方法是相同的时候,为了不在这些类中重复地去定义这些属性和方法,这时我们就需要定义一个父类,让这些类从获得(继承)这些属性和方法,就像老师和学生,他们是两个不同的类,但是他们之间具有相同的属性和方法,比如说姓名、性别和年龄。继承的定义就是子类从一个父类中继承其保护类型为public和protected这两种类型的属性和方法
继承的语法格式为:
数据保护类型+class+类名+extends+父类名+{程序主体}
比如我们可以看程序
//定义第一个父类Fatherstyle
public class Fatherstyle{
int age; //定义年龄
String name; //定义姓名
int number; //定义学号
public void show(){
System.out.println("姓名: "+name+" 年龄: "+age+" 学号: "+number);
}
}
然后我们在定义一个子类,从父类中继承属性和方法,继承之后,我们就可以直接子类中调用父类中的方法了
//定义一个子类Sonstyle
public class Sonstyle extends Fatherstyle{
public static void main(String[] args)
{
Sonstyle ui=new Sonstyle();
ui.name="张三";
ui.age=14;
ui.number=12367;
ui.show();
}
}
这时我们运行程序在控制台(Console)就可以看到输出的内容为
姓名: 张三 年龄: 14 学号: 12367
总的来说(个人理解):
继承能给我们带来的优势是,他能省去许多相似的代码,对于那些具有相同属性的类别,通过继承,我们就不需要去为每一个类单独去编写他们的属性与方法,省去了许多繁杂步骤,同时也能使得我们的代码简便易理解, 但是我们需要注意的是,继承不能是多继承的,java中的类除了继承了java本身的类之外,他只能再继承一个父类,(可以理解为亲生父亲就只有一个,不会有第二个一样就是public class 子类名 extends 父类名1 父类名2…… )这样继承的话java会报错,再java的API文档中,就有许多类别除了自己特有的属性与方法之外,还会介绍其他的从其他父类中继承的方法。
二、接口
说完了继承之后,下面我们可以来看看接口,**在我们的生活中有些事情是固定的一项特征,比如像我们说的每一个人都有一个特定名字,每一座城市都有一个固定的邮政编码,每一个大学都会有一个特定的名字,每一个快递都会寄到一个特定的地址……**这些事物都相当与一些固定的东西,短时间内无法改变,我们都会一直用,他不能随意更改,这时我们就想到了接口
百度百科对接口的定义是:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)
从中我们可以知道:
在Java中,接口是一个储存特定属性,和一些抽象方法的定义方法。关于接口的格式是这样的
1、接口的定义方式
public interface 接口名{程序体}
2、接口属性的定义方式为:
public static 数值类型 属性名=值;
public final 数值类型 属性名=值;
static和final 的意思与静态的,最终的,不易改变的这类意思相似,即接口中的属性是一个定值
3、接口中方法的定义方式:
public abstract 返回值类型 方法名(参数1,参数2,参数3);
4、在类中添加接口的格式为:
public class 类名 implements 接口名1,接口名2{程序体}
特别需要注意的是
在接口中,我们可以添加多个接口,跟前面说的继承有些区别,接口中的属性可以由此类直接引用,但是由于接口中定义的方法是抽象的,我们在引用接口的类中必须对接口中所有的方法进行重写,这一项我们可以在下面的程序里面看到接口因为是抽象的,所以他不能去定义一个对象!
还是上面的程序我们接着用做例子
public interface Fatherhomeland {
public static int postcode=410000;
public final String address ="湖南省长沙市";
}
public interface Fatherschool {
public static String Schoolname="中南大学";
public static String Englishname="Center South University";
public static String Adderss="长沙市岳麓区";
//定义了接口中的方法 abstract 是抽象的的意思
public abstract void show1(int a);
}
下面我们在当前类中引用接口
public class Sonstyle extends Fatherstyle implements Fatherhomeland,Fatherschool{
//对接口中的方法进行重写时,需要把abstract去掉
public void show1(int a) {
System.out.println("学校名称:"+Sonstyle.Schoolname);
System.out.println("英文名称:"+Sonstyle.Englishname);
System.out.println("学校地址:"+Sonstyle.Adderss);
}
public static void main(String[] args)
{
Sonstyle ui=new Sonstyle();
ui.name="张三";
ui.age=14;
ui.number=12367;
ui.show();
//从这个语句中我们可以看到,接口中可以直接用 类.属性名 引用接口中的属性
System.out.println("邮政编码:"+Sonstyle.postcode);
System.out.println("地址:"+Sonstyle.address);
ui.show1(3);
}
}
最后在控制台(Console)中输出的结果为
姓名 张三年龄14学号12367
邮政编码:410000
地址:湖南省长沙市
学校名称:中南大学
英文名称:Center South University
学校地址:长沙市岳麓区
对于接口
我们可以知道,它的属性是一个特定的值,接口中的方法是抽象的方法,他需要在接口中的类中被重写,这样与我们下面要讲的监听器有着密切相关的关系,我们可以看到,当我们的鼠标点击或者键盘按下时,会有不同的反应,我们不可能为每个反应去写一个监听器,这时接口的作用就发挥到了极致,其实我们下面要讲的监听器就是接口,通过对监听器里面的方法进行不同的重写,这样就形成了不同的反应下面我们来看看监听器
java中的事件监听器
监听器通俗来理解的话,是一个响应机制,即当我们有什么操作的时候,监听器会接受一些信息,然后传递给另外的类,执行特定的方法。在java中为每种类型的事件都设定了监听器,常用的是鼠标监听器 (MouseListener)、动作监听器(ActionListener)、键盘事件监听器(KeyListener)
事件监听的实现步骤为:
第一步:确定事件源。
第二步:确定事件类型
第三步:创建一个类,实现对应类型的接口。
第四步:创建监听器的对象,给事件源组件添加事件监听器
对于监听器的话:我们可以以制作一个类似于QQ的登陆界面一样,当我们输入账号和密码,通过监听器判断账号和密码是否正确,进而弹出另外一个界面。
写在前面
在这个登陆界面的程序代码中,我们还需要用到包的知识,因为我们要编写一个登录界面的话,需要一些在java的API文档中的一些类,顶级容器界面类(JFrame)、按钮类(JButton)、文本输入框类(JTextField)……,我们要使用这些类别时,我们需要在类的开头用import来声明我们需要使用的这些类,我现在最常用的两个包是Java的API文档里面的javax.swing包和java.awt包,这些我们需要的界面组件大致都在这里面,而且所有的组件都必须放到顶级容器组件(JFrame)里面,下面我们来看程序:
import javax.swing.JPasswordField;//这个是允许输入单行多字文本的密码框
import java.awt.Color;//这个是用于设置颜色的类
import java.awt.Dimension;
import java.awt.FlowLayout;//布局方式类,顶级容中的默认布局为绝对布局
import javax.swing.JFrame; //顶级容器组件类
import javax.swing.JLabel; //标签类
import javax.swing.JTextField; //允许输入单行文本的输入框
import javax.swing.ImageIcon; //一个 Icon 接口的实现,它根据 Image 绘制 Icon。用于添加图片
import javax.swing.JButton; //按钮
public class loginbegain {
//显示界面的方法
public void showUI() {
//创建窗体对象
JFrame loginFrame = new JFrame();
//设置窗体的属性
//设置窗体的大小
loginFrame.setSize(600, 450);
//设置窗体居中显示
loginFrame.setLocationRelativeTo(null);
//设置窗体的布局
//Flowlayout为流式布局类。
FlowLayout layout = new FlowLayout();
loginFrame.setLayout(layout);
//创建图片对象标签的大小
Dimension Size=new Dimension(600,270);
//创建一个图片对象
ImageIcon icon = new ImageIcon("C:\\Users\\zr的帅气honor\\Pictures\\92.jpg");
//添加图片对象时要注意把文件格式改成 文件名.jpg的形式
JLabel iconLabel = new JLabel(icon);
iconLabel.setPreferredSize(Size);
//添加到窗体上
loginFrame.add(iconLabel);
//创建账号标签
JLabel Login = new JLabel(" 账号");
Login.setForeground(Color.BLUE);
loginFrame.add(Login);
//创建输入框对象
JTextField nameIn = new JTextField();
//设置输入框的大小
Dimension inputSize = new Dimension(400, 30);
nameIn.setPreferredSize(inputSize);
//添加到窗体上
loginFrame.add(nameIn);
//创建注册账号的标签
JLabel registerLabel = new JLabel("加入我们 ");
registerLabel.setForeground(Color.BLUE);
//添加到窗体上
loginFrame.add(registerLabel);
//创建密码标签
JLabel mm=new JLabel("密码");
mm.setForeground(Color.BLUE);
loginFrame.add(mm);
//创建密码框
JPasswordField mmk=new JPasswordField();
mmk.setPreferredSize(inputSize);
loginFrame.add(mmk);
JLabel ccgb=new JLabel("忘记密码");
ccgb.setForeground(Color.BLUE);
loginFrame.add(ccgb);
//设置按钮框的大小
Dimension andx=new Dimension(100,30);
//创建一个登录按钮
JButton an=new JButton("登录");
an.setForeground(Color.BLACK);
an.setPreferredSize(andx);
loginFrame.add(an);
//设置窗体可见
loginFrame.setVisible(true);
loginFrame.setVisible(true);
response1 judge=new response1();
judge.k1=nameIn;
nameIn.addActionListener(judge);
judge.k2=mmk;
mmk.addActionListener(judge);
an.addActionListener(judge);
}
//主方法
public static void main(String[] fdsfds) {
//创建界面对象
loginbegain ui = new loginbegain();
//调用显示界面的方法
ui.showUI();
}
}
下面我们来看这其中使用到的监听器:
监听器在代码中如下:
response1 judge=new response1();
//文本框对象与界面文本框对象相等,这样才能获取文本
judge.k1=nameIn;
//文本框添加动作监听器
nameIn.addActionListener(judge);
judge.k2=mmk;
//密码框对象添加动作监听器
mmk.addActionListener(judge);
//按钮框添加动作监听器
an.addActionListener(judge);
//这一片代码区,我们写的是监听器的具体反应
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class response1 implements ActionListener
{
JTextField k1;
JPasswordField k2;
//输入框
String account;
//密码框
String code;
//这是对动作监听器(接口)的所有方法进行重写
public void actionPerformed(ActionEvent e)
{
//获取账号输入框的文本
account=k1.getText();
//用System来测试这种用法是否正确,因为java中方法有很多,有时我们不知道到底用哪个所以可以用System来测试
System.out.println(account);
//获取密码框的文本
code=k2.getText();
System.out.println(code);
//用if语句判断
if("22416".contentEquals(account))
{
System.out.println("用户名正确");
if("123456".contentEquals(code))
{
System.out.println("登陆成功!");
newJFrame pi=new newJFrame();
pi.show();
}
else
{
System.out.println("密码错误!请重新输入!");
}
}
else
{
System.out.println("用户名不正确,请重新输入");
}
}
}
补充一个第三个程序片中的newJFrame类的代码
import javax.swing.JFrame;
public class newJFrame {
public void show()
{
//创建一个新的窗体对象
JFrame Topface= new JFrame();
//设置顶级容器的大小
Topface.setSize(200,200);
//设置居中显示
Topface.setLocationRelativeTo(null);
//设置程序关闭时,窗体关闭
Topface.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//设置窗体可见
Topface.setVisible(true);
}
}
下面我们就可以看到程序运行时的效果,打开程序,输入定义的帐号和密码
如图所示:
在新的界面中,我们也就可以去发挥想象创建更多的东西啦!(时间有限,弹出的界面中什么都没有,求谅解)
让我们理解理解一下监听器
在登陆界面中,大家也可以看到,代码中只使用到了动作监听器,大致意思是,当我们按下登录按钮时,java会获取账号信息和密码信息,并判断他们是否正确,进而达到登录的目的。监听器相当于一个动作响应者,即当我们有了某一操作时,被监听器捕捉到,然后监听器会进行进一步的操作(个人理解)。
最后的话:
博客中有什么错误的地方,大佬们有空的话,可以帮小编指出来,我会根据问题好好修改的,以上对于监听器和接口的看法,许多都是个人的理解,俗话说“一千个读者中有一千个哈姆雷特”希望这些东西能帮到大家。编写不易,有空的话留下你们珍贵的评论和点赞吧,你们的点赞就是我最大的动力!