static和final
[static]
可修饰:
类:静态内部类
方法:
成员变量:静态变量(类变量)
代码块:
接口:接口中默认变量为:public static final
[final] ---最终形态
修饰:
类:不可被继承
成员变量:常量,不可改变
方法:不能被重写
局部变量:一旦赋值就不可改变
方法参数:在方法内部不能改变
抽象类和接口
1.【抽象类】:
抽象类是 Java 中一种不能被直接实例化的特殊类,它可以拥有构造器、成员变量、静态代码块等完整的类特性,主要用于代码复用和建立类层次结构。
abstract class shape{//属性public String name=" ";//方法(包含构造方法,抽象方法【不实现没有方法体】和具体方法)//构造器public shape(String name){this.name=name;}//具体方法public void run(){System.out.println("aaa");}//抽象方法abstract public void a();
}
2.【接口】
接口是 Java 中一种完全抽象的引用类型,它定义了一组行为规范,要求实现该接口的类必须提供这些方法的具体实现。接口中的所有方法默认都是抽象的(Java 8 之前),从 Java 8 开始支持 default 和 static 方法,Java 9 进一步支持 private 方法。接口中的变量默认都是 public static final(常量)。主要用于定义行为契约和实现多重继承。
3.【区别】
抽象类:
·不能被实例化,但有构造器
·包含抽象方法,具体方法,构造方法
·单继承
·可包含 final、non-final、static、non-static 变量
·方法和变量可使用任意访问修饰符
接口:
·不能被实例化,无构造器
·Java 8+:可包含 default、static 方法
·多继承,实现类可继承多个接口
·变量默认都是 public static final(常量)
·方法和变量默认为 public,不能使用 protected / private 修饰符
`没有实例变量,纯行为定义
内部类
定义:定义在一个类内部的类
分类:
·成员内部类
·局部内部类(定义在方法里)
·静态内部类(static)
·匿名内部类
--用于继承一个类 Demo d=new Demo(){....};
--用于实现一个接口 new Myinterface(){....};
代码实现:
import java.util.*;class/interface Demo2 {void show() {System.out.println("在super类中");}
}class A {static Demo2 d = new Demo2() {void show() {super.show();System.out.println("在匿名内部类中");}};public static void main(String[] args) {d.show();}}
线程同步和异步
【线程同步】
1.是在Java中一种确保多线程同时访问共享资源时保持数据一致性的机制
2.实现机制:通过监视器(Monitors)来实现的,每个对象在java中都与一个监视器相关联,线程可以锁定或解锁监视器
3.synchronized关键字作为修饰符,可以锁定方法,确保同一时间只有一个线程可以使用资源
--实现原理:在调用同步方法时,会自动获取该方法对象的内在锁,在方法返回时释放该锁
【线程异步】
1.允许多线程并发执行,提高效率
2.应用场景:异步处理指的是将阻塞操作分配给新线程,并立即将与请求关联的线程返回给调用者
异常处理
try-catch
try{
action1;
action2;
}catch(ExceptionType e);
acrion3;
【注意!】
·try块按照顺序执行,如果action2前面没被捕获异常则正常执行
·如果catch块没捕获出异常,则该段代码被终止,action3也不会被执行(catch捕获到异常才会执行),直到异常被上层捕获
IO流 !!(会考程序填空)
1.几个名词:
FileInputSream:文件输入流
InputStreamReader:将字节流转成字符流
BufferedInputReader:带缓冲区的字符流
BufferedInputReader bufr=new BufferedInputReader(new InputStreamReader(System.in))
OutputStreamWriter
Charset cs=Charset.forName("UTF-8");
2.代码:
//将文件 a.txt中的字符数据复制到 b.txt,并且在复制过程中明确使用了 UTF-8 字符编码,可以有效避免乱码问题
import java.io.*;
import java.nio.charset.Charset;public class FileDemo1{public static void main(String[] args) throws IOException {//属性long size=0;Charset cs= Charset.forName("UTF-8");try(FileInputStream fis=new FileInputStream("a.txt");InputStreamReader isr=new InputStreamReader(fis,cs);FileOutputStream fos=new FileOutputStream("b.txt");OutputStreamWriter osw=new OutputStreamWriter(fos,cs);){int len=0;//用来存储每次读取的字符数量char[] buf=new char[1024]; //缓冲区while((len=isr.read(buf))!=-1) //len=-1代表读到最后一个了{osw.write(buf,0,len);size+=len; //读取字符数}System.out.println("读取到的总长度为:"+size);}catch(FileNotFoundException e1){System.out.println("文件找不到");}catch(IOException e2){System.out.println("文件找不到");}}
}
//读取文件数据
import java.io.*;public class FileReadExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("example.txt"), "UTF-8"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line); // 按行打印文件内容}} catch (IOException e) {e.printStackTrace();}}
}
【程序题】
1)集合 Arraylist数组问题
2)GUI图形编程(包含事件监听) !!必考
3)多线程 synchronized
1.<事件监听>(SWing事件处理)
//既是事件源又是监听器
class MouseFrame extends JFrame implements MouseListener, MouseMotionListener {private JLabel statusbar;public MouseFrame() {super("鼠标事件示例");statusbar = new JLabel("这是状态栏");add(statusbar, BorderLayout.SOUTH);addMouseListener(this);addMouseMotionListener(this);setSize(300,200);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setVisible(true);}//以下是 MouseListener 接口方法public void mouseClicked(MouseEvent e) { statusbar.setText("您点击了窗口!"); }public void mouseExited(MouseEvent e) { statusbar.setText("鼠标离开了窗口!"); }public void mousePressed(MouseEvent e) { statusbar.setText("您按下了鼠标键!"); }public void mouseReleased(MouseEvent e) { }public void mouseEntered(MouseEvent e) { }//以下是 MouseMotionListener 接口方法public void mouseDragged(MouseEvent e) {String s = "鼠标拖拉: x=" + e.getX() + ", y=" + e.getY();statusbar.setText(s);}public void mouseMoved(MouseEvent e) {String s = "鼠标移动: x=" + e.getX() + ", y=" + e.getY();statusbar.setText(s);}
}public class MouseEventDemo {public static void main(String[] args) {MouseFrame frame = new MouseFrame();SwingUtilities.invokeLater(() -> {frame.setVisible(true); // 显示窗口});}
}
2.GUI综合编程题 !!!
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class GCDLCDCalculator extends JFrame {private final JTextField num1Field;private final JTextField num2Field;private final JTextField gcdField;private final JTextField lcmField;public GCDLCDCalculator() {// 设置窗口标题setTitle("最大公约数和最小公倍数计算器");// 设置窗口关闭操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置 FlowLayout 布局setLayout(new FlowLayout(FlowLayout.CENTER, 50, 50));// 创建标签和输入框JLabel num1Label = new JLabel("数 1:");num1Field = new JTextField(10);JLabel num2Label = new JLabel("数 2:");num2Field = new JTextField(10);JLabel gcdLabel = new JLabel("最大公约数:");gcdField = new JTextField(10);gcdField.setEditable(false); // 结果框不可编辑JLabel lcmLabel = new JLabel("最小公倍数:");lcmField = new JTextField(10);lcmField.setEditable(false); // 结果框不可编辑// 创建按钮JButton calculateButton = new JButton("计算");JButton exitButton = new JButton("退出");// 添加组件到窗口add(num1Label);add(num1Field);add(num2Label);add(num2Field);add(gcdLabel);add(gcdField);add(lcmLabel);add(lcmField);add(calculateButton);add(exitButton);// 为计算按钮添加事件监听器calculateButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {calculator();}});// 为退出按钮添加事件监听器exitButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});// 设置窗口大小和位置setSize(300, 500);setLocationRelativeTo(null); // 居中显示setResizable(false); // 禁止调整大小}public static void main(String[] args) {// 在事件调度线程中创建和显示GUISwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {new GCDLCDCalculator().setVisible(true);}});}// 计算最大公约数(欧几里得算法)private int calculateGCD(int a, int b) {a = Math.abs(a);b = Math.abs(b);while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}// 计算最小公倍数private int calculateLCM(int a, int b, int gcd) {return Math.abs(a * b) / gcd;}// 执行计算private void calculator() {try {// 获取输入值int num1 = Integer.parseInt(num1Field.getText().trim());int num2 = Integer.parseInt(num2Field.getText().trim());// 检查是否为0if (num1 == 0 || num2 == 0) {JOptionPane.showMessageDialog(this,"输入的数字不能为零!","输入错误",JOptionPane.ERROR_MESSAGE);return;}// 计算最大公约数int gcd = calculateGCD(num1, num2);// 计算最小公倍数int lcm = calculateLCM(num1, num2, gcd);// 显示结果gcdField.setText(String.valueOf(gcd));lcmField.setText(String.valueOf(lcm));} catch (NumberFormatException ex) {JOptionPane.showMessageDialog(this,"请输入有效的整数!","输入错误",JOptionPane.ERROR_MESSAGE);// 清空输入框num1Field.setText("");num2Field.setText("");gcdField.setText("");lcmField.setText("");// 重新聚焦到第一个输入框num1Field.requestFocus();}}
}