57.【Java 接口】
接口
- 1.finnal关键字的作用:
- 2.高内聚低耦合
- 3.抽象类(abstract):
- 5.接口:
- 1.定义:
- 2.声明:
- 3.实现接口:
- 6.事件处理机制
- (一)、键盘事件(KeyListener)
- 7.键盘移动小球
- 8.《贪吃的宝马》
- 9.八方向的操作
- (二)、鼠标操作(MouseLister)
- 1.MouseListener单击操作
- 2.MouseMotinListener(移动操作)
- (三)、窗体事件(WindowListener)
- (四)、综合测试:打字幕游戏
1.finnal关键字的作用:
finnal: 表示最终的不可变的,
继承可以提高代码的复用性和灵活性。但有时我们并不希望类中的方法被重写和修改,这时我们就需要用到final关键字。
final、abstract关键字修饰类:加在class前,权限符后,这样此类就不能有子类。
(1).finnal 修饰的变量,是常量. (不能被修改)
final int a=5;
(2).finnal 修饰的方法是最终的方法,是不能够被覆盖的。
final public void show(){}
(3).由finnal 修饰的类是最终类,是不允许被继承的。
final class a{}
2.高内聚低耦合
高内聚含义:在类的内部的属性是紧密联合的
低耦合含义:在类与类之间是有很大区别的。
3.抽象类(abstract):
对共同的特征进行抽象。
abstract 加在权限符后,类型前。final加在权限符前。(有区别的)
abstract表示抽象的,可以修饰类和方法:
(1).由abstract修饰的方法,叫做抽象方法。只有方法声明,没有方法体。
public abstract void show();
(2).由abstract修饰的类,叫做抽象类。抽象类不能创建对象。
abstract class hello{}
(3).如类中有抽象方法,则该类必定是抽象类。
abstract class hello{
public abstract void show();
public abstract void show2();
public void show();}
(4).抽象类中,可以没由抽象方法;
(5)、一个抽象类中的方法全部是抽象方法,那么我们把这个抽象类叫做接口
abstract class hello{
public abstract void show();
public abstract void show2();
public abstract void show();
}
5.接口:
1.定义:
一个抽象类中的方法全部是抽象方法,并且这个中根本没有必要声明成员变量,我们称作这样的类叫做纯抽象类,在JAVA中纯抽象类叫做:接口.
2.声明:
interface 接口名
{
常量声明;
抽象方法声明:
}
3.实现接口:
实现的时候不必要是(抽象类)
class 类名 implements 接口名{
public 抽象方法声明
}
6.事件处理机制
(1)、事件源:产生事务的组件。(按钮、窗体。画布)谁是监听者,谁是事件源。
(2)、事件:用户在界面上的操作。
(3)、监听器:是一个专门用于处理事件的的类,它接收事件并且产生相应的动作。
(4)、如果希望某一个事件源能够产生反应,要事先为其注册相应的监听器。
(一)、键盘事件(KeyListener)
接口的实现:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class panel1 extends Panel implements KeyListener { //监听者 panel
public void paint(Graphics g){
g.fillOval(100,100,200,200);
}
@Override
public void keyTyped(KeyEvent e1) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("您按下了:"+e.getKeyChar()); //按下的字符
System.out.println("按下的是:"+e.getKeyCode()); //按下的ascll码
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("您松开了:"+e.getKeyChar());
System.out.println("您松开了:"+e.getKeyCode());
}
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
import java.lang.Math;
public class hello {
public static void main(String[] avgs) {
Frame f=new Frame("贪吃的宝马");
f.setSize(300,300);
panel1 p1=new panel1();
f.add(p1);
f.addKeyListener(p1); //注册监听器
// p1.addKeyListener(p1); //为画板注册监听器
//f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
7.键盘移动小球
类方法:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class panel extends Panel implements KeyListener { //实现接口
int x=200;
int y=200;
public void paint(Graphics g){
g.fillOval(x,y,40,40);
}
public void keyPressed(KeyEvent e){ //接口方法声明
if(e.getKeyCode()==37){ //左
x--;
}
if(e.getKeyCode()==38){ //上
y--;
}
if(e.getKeyCode()==39){ //右
x++;
}
if(e.getKeyCode()==40){ //下
y++;
}
repaint();
}
public void keyReleased(KeyEvent e){ //接口方法声明
}
public void keyTyped(KeyEvent e){ //接口方法声明
}
}
主方法:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
import java.lang.Math;
public class hello {
public static void main(String[] avgs) {
Frame f=new Frame("移动的小球");
f.setSize(500,500);
panel p=new panel();
f.add(p);
f.addKeyListener(p); //为frame注册监听器
p.addKeyListener(p); //为panel注册监听器
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
8.《贪吃的宝马》
基本是路:
首先我们要使用画板frame和画笔paint;首先第一步要绘画宝马车标。然后进行实列化。然后把画笔加入画板当中去。然后接入接口 KeyLister。利用键盘里面的接口方法,进行键盘控制。37=左,38=上,39=右,40=下。然后在画板中注册一个画板的监听器和画笔的监听器(主要是为了让鼠标能够动);
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
class panel extends Panel implements KeyListener { //插入接口
int x=200;
int y=200;
int wideth=40;
int height=40;
int m=10;
int n=10;
int r1=0;
int g1=0;
int b1=0;
public void paint(Graphics g){
//绘制食物
Color c5=new Color(r1,g1,b1);
g.setColor(c5);
g.fillOval(m,n,20,20);
//绘制宝马:
Color c=new Color(0,0,0);
g.setColor(c);
g.fillOval(x,y,wideth,height);
Color c1=new Color(255,255,255);
g.setColor(c1);
g.fillOval(x+25,y+25,wideth-50,height-50);
Color c2=new Color(0,0,255);
g.setColor(c2);
g.fillArc(x+25,y+25,wideth-50,height-50,90,90);
g.fillArc(x+25,y+25,wideth-50,height-50,270,90);
}
public void keyPressed(KeyEvent e){ //抽象方法
//键盘控制和移速
if(e.getKeyCode()==37){ //左
x=x-10;
}
if(e.getKeyCode()==38){ //上
y=y-10;
}
if(e.getKeyCode()==39){ //右
x=x+10;
}
if(e.getKeyCode()==40){ //下
y=y+10;
}
if(m>=x&&m<=x+wideth&&n>=y&&y<=y+height){ //假如吃到食物
//食物随机
Random r=new Random();
m=r.nextInt(1480)+1;
n=r.nextInt(900)+1;
r1=r.nextInt(255)+1;
g1=r.nextInt(255)+1;
b1=r.nextInt(255)+1;
//长大
wideth=wideth+20;
height=height+20;
}
repaint(); //动态
}
public void keyReleased(KeyEvent e){ //抽象方法
}
public void keyTyped(KeyEvent e){ //抽象方法
}
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
import java.lang.Math;
public class hello {
public static void main(String[] avgs) {
Frame f=new Frame("贪吃的宝马");
f.setSize(1880,1000);
panel p=new panel();
f.add(p);
f.addKeyListener(p); //注册监听器
p.addKeyListener(p); //为画板注册监听器
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
9.八方向的操作
基本思路:
我们要使用KeyLister的接口,然后分别使用按下的抽象方法和松开的方法。当我们松开的时候,我们把值赋值为false.
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class panel extends Panel implements KeyListener { //实现接听功能
int x=100;
int y=100;
boolean press_a;
boolean press_w;
boolean press_d;
boolean press_s;
public void paint(Graphics g){
Font f=new Font("黑体",Font.BOLD,50);
g.setFont(f);
Color c=new Color(0,0,0);
g.setColor(c);
g.drawString("*",x,y);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int i=e.getKeyCode(); //当按下操作
if(i==37){
x=x-10;
}
if(i==38){
y=y-10;
}
if(i==39){
x=x+10;
}
if(i==40){
y=y+10;
}
switch (i){
case 37: press_a=true;break;
case 38: press_w=true;break;
case 39:press_d=true;break;
case 40:press_s=true;break;
default:break;
}
if (press_a&&press_s){
x=x-10;
y=y+10;
}
if (press_a&&press_w){
x=x-10;
y=y-10;
}
if (press_w&&press_d){
x=x+10;
y=y-10;
}
if (press_d&&press_s){
x=x+10;
y=y+10;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
int i=e.getKeyCode(); //当松开操作
switch (i){
case 37: press_a=false;break;
case 38: press_w=false;break;
case 39:press_d=false;break;
case 40:press_s=false;break;
default:break;
}
}
}
import java.awt.*;
public class hello {
public static void main(String []avgs){
Frame f=new Frame("小球移动八个方向");
f.setSize(800,800);
f.setLocationRelativeTo(null);
panel p=new panel();
f.add(p);
f.addKeyListener(p);
p.addKeyListener(p);
f.setVisible(true);
}
}
(二)、鼠标操作(MouseLister)
1.MouseListener单击操作
基本知识点:调用MouseLister接口,然后使用构造方法mouseClicked(),然后通过 e.getX()获得,x的坐标。通过e.getY()获得y的坐标。即可
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
class panel extends Panel implements MouseListener {
int []x=new int[20];
int []y=new int[20];
String []s1=new String[]{"1","2","1","2","1","2","1","2","1","2",}; //利用数组进行储存
int j=0;
//画框架
public void paint(Graphics g){
//设置颜色
Color c=new Color(0,0,0);
g.setColor(c);
//矩形
g.drawRect(200,200,450,450);
//线
g.drawLine(200,350,650,350);
g.drawLine(200,500,650,500);
g.drawLine(350,200,350,650);
g.drawLine(500,200,500,650);
if(j%2==0) {
Color c1 = new Color(255, 0, 0);
g.setColor(c1);
}
Font f=new Font("黑",Font.BOLD,30);
g.setFont(f);
x[0]=100;
y[0]=100;
for(int i=0;i<j+1;i++) {
g.drawString(s1[i], x[i], y[i]);
}
//判断输赢
j++;
}
@Override
public void mouseClicked(MouseEvent e) {
x[j]=e.getX();
y[j]=e.getY();
if(x[j]>200&&x[j]<350&&y[j]>200&&y[j]<350){
x[j]=275;
y[j]=275;
}if(x[j]>200&&x[j]<350&&y[j]>350&&y[j]<500){
x[j]=275;
y[j]=425;
}if(x[j]>200&&x[j]<350&&y[j]>500&&y[j]<650){
x[j]=275;
y[j]=575;
}
if(x[j]>350&&x[j]<500&&y[j]>350&&y[j]<500)
{
x[j]=425;
y[j]=425;
}if(x[j]>350&&x[j]<500&&y[j]>200&&y[j]<350)
{
x[j]=425;
y[j]=275;
}if(x[j]>350&&x[j]<500&&y[j]>500&&y[j]<650)
{
x[j]=425;
y[j]=575;
}
if(x[j]>500&&x[j]<650&&y[j]>500&&y[j]<650){
x[j]=575;
y[j]=575;
}if(x[j]>500&&x[j]<650&&y[j]>200&&y[j]<350){
x[j]=575;
y[j]=275;
}if(x[j]>500&&x[j]<650&&y[j]>350&&y[j]<500){
x[j]=575;
y[j]=425;
}
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标被按下:");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标被松开");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("----------鼠标进入框体--------");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("*********鼠标离开框体**********");
} //实现接听功能
import java.awt.*;
public class hello {
public static void main(String []avgs){
Frame f=new Frame("小球移动八个方向");
f.setSize(900,900);
f.setLocationRelativeTo(null);
panel p=new panel();
f.add(p);
f.addMouseListener(p);
p.addMouseListener(p);
f.setVisible(true);
}
}
2.MouseMotinListener(移动操作)
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
class panel extends Panel implements MouseMotionListener {
int x=100;
int y=100;
public void paint(Graphics g) {
g.fillOval(x,y,20,20);
}
@Override
public void mouseDragged(MouseEvent e) { //鼠标按下并拖动
// x=e.getX();
// y=e.getY();
// repaint();
}
@Override
public void mouseMoved(MouseEvent e) { //鼠标移动不用按下
x=e.getX();
y=e.getY();
repaint();
}
}
import java.awt.*;
public class hello {
public static void main(String []avgs){
Frame f=new Frame("小球移动八个方向");
f.setSize(900,900);
f.setLocationRelativeTo(null);
panel p=new panel();
f.add(p);
f.addMouseMotionListener(p);
p.addMouseMotionListener(p);
f.setVisible(true);
}
}
(三)、窗体事件(WindowListener)
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
class panel extends Panel implements WindowListener {
public void paint(Graphics g){
g.fillOval(10,10,100,100);
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println("窗口被打开");
}
@Override
public void windowClosing(WindowEvent e) { //右上角的按钮
System.out.println("窗口已经被关闭---------");
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) { //
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("窗口从正常状态转换为最小化");
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("窗口从最小化转换为正常状态");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("窗口设置为活动窗口");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("窗口已经不是活动窗口");
}
}
import java.awt.*;
public class hello {
public static void main(String []avgs){
Frame f=new Frame("小球移动八个方向");
f.setSize(900,900);
f.setLocationRelativeTo(null);
panel p=new panel();
f.add(p);
f.addWindowListener(p);
f.setVisible(true);
}
}
(四)、综合测试:打字幕游戏
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
class panel extends Panel implements Runnable, KeyListener {
int sum=0;
String []s=new String[]{"a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
int []x=new int[500];
int []y=new int[550];
//对数组进行自定义初始化
public panel(){//初始化数组
for(int i=0;i<10;i++){
Random r=new Random();
int m1=r.nextInt(461)+1;
x[i]=m1;
}
for(int i=0;i<10;i++){
Random r=new Random();
int m2=r.nextInt(483)+1;
y[i]=m2;
}
for(int i=0;i<10;i++){
Random r=new Random();
int idex=r.nextInt(25);
s[i]=s[idex];
}
}
//进行绘画的操作
public void paint(Graphics g){
int m=0;
Color c=new Color(255,0,0);
g.setColor(c);
Font f=new Font("黑体",1,30);
g.setFont(f);
while (m++<10){
g.drawString(s[m],x[m],y[m]);
}
g.fillRect(0,0,200,50);
g.setColor(Color.BLACK);
g.drawString("您得分为:"+sum,0,30);
}
//进行移动的操作
@Override
public void run() {
while (true){
for(int i=0;i<10;i++){
y[i]++;
if(y[i]>=483){
Random r=new Random();
int m1=r.nextInt(461)+1;
x[i]=m1;
y[i]=0;
int idex=r.nextInt(25);
s[i]=s[idex];
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println("错误");
break;
}repaint();
}
}
//进行删除的操作
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
char keyc=e.getKeyChar();
int NowHeight=-1;
int NoeIdex=-1;
Random r=new Random();
for (int i = 0; i <10; i++) {
if (keyc==s[i].charAt(0)){
if(y[i]>NowHeight){ //进行求最大值 y坐标记录运行
NowHeight=y[i];
NoeIdex=i;
}
}
}
if(NoeIdex!=-1){
y[NoeIdex]=0;
int m1=r.nextInt(461)+1;
int m2=r.nextInt(25);
x[NoeIdex]=m1;
s[NoeIdex]=s[m2];
sum=sum+10;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
import java.awt.*;
public class hello {
public static void main(String []avgs){
Frame f=new Frame("小球移动八个方向");
f.setSize(500,500);
f.setLocationRelativeTo(null);
panel p=new panel();
Thread t=new Thread(p);
t.start();
f.add(p);
f.addKeyListener(p);
p.addKeyListener(p);
f.setVisible(true);
}
}