方法覆盖复习:修饰符(相同或更宽),返回值(相同或是父类返回类型的子类型),方法
名相同,参数列表相同,抛出的异常(不能抛出比父类方法更多的异常)
反射: java.lang.Class
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Constructor
java.lang.reflect.Array
// 1.得到类对象
Class c = Class.forName("Student");
// 2.通过类对象产生对象(调用无参的构造方法)
//Object obj = c.newInstance();
2.a 通过类对象找到相应的Constructor对象
//
Constructor cons =c.getConstructor(String.class,int.class);
2.b 通过Constructor对象得到对象
//
Object obj = cons.newInstance("zhangsan",20);
System.out.println(obj);
// 3.通过类对象找到相应的Method对象
Method m1 = c.getDeclaredMethod("getAge");
// 4.调用对象的方法。
Object age = m1.invoke(obj);
System.out.println(age);
Method m2 = c.getDeclaredMethod("study", String.class);
m2.invoke(obj, "corejava");
标注:
@Override 标注 给编译器看
@SuppressWarnings("unused")
@SuppressWarnings("unchecked")
@Deprecated过时,不推荐使用。。不删除是为了向后兼容
定义自己的标注:
public @interface 标注名称{
类型 属性() default 默认值;
}
元数据:数据的数据
元标注:标注的标注
@Author(@Name(first=”Tony”,last=”Tan”))
标注属性类型 只能是8种基本类型,String.枚举类型,Class,注释标注类型,对应的一维
数组
import java.lang.annotation.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
@Retention(value=RUNTIME)//这样设置才能使用反射方式探查出来
@Target(value=)
public @interface Test {
String value() default "No Parameter";
}
1定义注释:MyTest String author String date
import java.lang.annotation.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
@Retention(value=RUNTIME)
@Target(value=)
public @interface MyTest {
String author() default "itemMgr";
String date() default "2009-2-16";
}
2写一个类,使用MyTest注释 @MyTest(author="itemMgr",date="2009-2-10")
3通过反射调用某人写的方法;
Class c = Class.forName("Util");
Object obj = c.newInstance();
//得到所有方法
Method[] mm = c.getDeclaredMethods();
for(Method m:mm){
//判断方法是否有Test注释
boolean b = m.isAnnotationPresent(Test.class);
if(b){
//得到注释
Test t = m.getAnnotation(Test.class);
//通过注释得到注释中的属性
String param = t.value();
//调用方法
m.invoke(obj, param);
}
这里实现了类似Junit的测试框架。当标注为test before after 等等,会相应调用方法
来测试类
线程:宏观上并行,微观上串行
第一种方式:extends Thread 继承 覆盖run()方法 .start()启动一个线程
currentThread() 当前线程
优先级只是一个参考。不要使用优先级来控制线程
第二种 方法:implements Runnable接口。实现run()方法
Thread(Runnable)
eclipse常用快捷键:
syso main Alt+/ 主方法,打印语句
ctrl+1 错误提示操作
ctrl+/ 注释
ctrl+d删一行
ctrl+-> <- 切换编辑工作区
加载配置文件:java.util.Properties
.load(InputStream)
.getProperty(String key)
反射:
File[] fs = cz.getDeclaredFields();
for(Field f:fs){//得到属性名字 根据完全封装规范转换得到 get/set 方法名:
String attributeName = f.getName();
char c = attributeName.charAt(0);//获得属性第一个字母
c -= 32; //转成大写
String mn = “set”+c+attributeName.substring(1);//构造 get/set 方法名
}
线程三要素:cpu data ,code
产生线程的方式:a extends Thread 覆盖 run 方法调用 Thread 的 start()
b implements Runnable 接口,实现 run()方法
new Thread(runImpl) .start();
Thread.sleep()进入休眠
Thread.currentThread()当前执行线程
中断:work(){
while(true){
if(flag == false){
throw new InterruptedException()
}
run
}
}
try{
work()
}cathc(IterruptedException){}
同步代码块
public void run(){
while(tickets > 1){
synchronized(obj){
if(tickets<=1) break;
tickets --;
System.out.println(Thread.currentThread()+" : "+tickets);
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}}}}
synchronized 修饰方法 代码块
// synchronized 修饰静态方法,锁对象是类对象
会造成死锁
新特性:java.util.concurrent.locks
接口 Lock
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
java.util.concurrent.atomic 原子操作
volatile 只能修饰实例变量。同步范围仅仅是变量级的
volatile boolean flag = false;
while(true){
if(falg){
throws new InterruptedException()
}
work();
}
public void start(){
flag = false;
}
public void cancel(){
flag = true;
}
notify() notiyfAll() wait() 在 synchonized()代码中。
synchronized(this){
try {
notifyAll();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield();//?该方法不一定能调用成功暂停当前正在执行的线程对象,并执行其他线程。其
它线程可能是当前线程
高级特性
executor 接口执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行
的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。例
如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new
Thread(new(RunnableTask())).start():
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
接口回调: 调用接口中的方法实际上调用的是实现者的方法
线程池 ExecutorService
ExecutorService exec =Executors.newFixedThreadPool(2);
exec.submit(new ThreadA());
exec.submit(new ThreadB());
exec.shutdown();
Callable Future
1线程,三要素
2.如何产生线程
3synchronized
4wait.notify
Lock ReadWriteLock -> synchronzied
Executor/ExecutorService -> Thread
Callable/Future -> Runnable
Condition.await -> wait
Condition.signal ->notify
Io流 File
File f = new File("a.txt");
System.out.println(f.exists());//判断一文件是否存在
if(!f.exists()){
boolean b = f.createNewFile();//创建文件
System.out.println(b);
}
System.out.println(f.delete());//删除文件,成功 true
System.out.println(f.getAbsolutePath());//获得绝对路径
System.out.println(f.getPath());
System.out.println(File.separator);
System.out.println(f.isFile());
System.out.println(f.isDirectory());
System.out.println(f.isAbsolute());
//创建目录
File f = new File("dir");
System.out.println(f.mkdir());
针对FileFilter接口编程。(当接口没有给出实现时,都是需要用户自己实现接口或者用
匿名内部类)
class MyFilter implements FileFilter{
public boolean accept(File pathname) {
String name = pathname.getName().trim();
if(name.endsWith(".txt"))
return true;
return false;}}
Input Stream & Output Stream
Byte Stream & Char Stream
Node Stream & Wrapper Stream
InputStream 读入 read() 读一个字节
read(byte[] b) b 是一个缓冲
byte[] buf = new byte[5];
while(true){
int len =in.read(buf,1,3);
if(len == -1) break;
System.out.println(len);
System.out.println(Arrays.toString(buf));
}
in.close();
OutputStream 写入write() 写入一个字节
包装流: DataInputStream DataOutputStream 中有一次性写读Int ,Short,Long.Double
等包装类型
BufferedOutputStream BufferedInputStream 记得写入时要flush
byte[] b = new byte[100];一次性读 100 个字节
int len = 0;//是否读到文件末尾。。注意 in = read(byte[])方法
while((len=in.read(b))!=-1){
}
in.close();
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(); 连接管道流
pout.connect(pin);
ObjectInputStream & ObjectOutputStream 对象流
Serizlizable序列化接口。。可将一个对象写入文件或在网络上传输
序列化文件以 ACED 开头
序列化可以给一个对象加上标识(序列号) 当修改对象类时,只要序列号一样,在文件
和网络上就能找到该对象。
transient 表此属性不序列,是一个临时属性 8 大基本类型都实现了序列化接口
在序列化类中有引用类型,也需要保存时都要序列化
Serialiver 命令,可查看序列化 序列化不可在后面追加。因为在一个文件中 ACED 只能
出现一次
要追加只好读出来再追加后写进去
字节流完
字符流:Reader Writer
InputStreamReader 包装类,包装字节流 桥转换:字节流转换成字符流
桥转换过程中可设定编码
BufferedReader readLine()
PrintWriter
StringReader
FileReader 直接读文件,不用桥转换
BufferedWriter
RandomAccessFile 随机访问文件
System.setOut(new PrintStream("a.txt"));//不输出在控制台,而输出到文件
System.out.println("Hello World");
System.out.println(System.out.getClass());
//InputStream in = System.in;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
String s = br.readLine();
if(s.equals("exit")) break;
System.out.println(s);
}
JAVA图形界面
JFC Swing AWT事件处理
Creating GUI 1:choosing A Container
(JFrame Jdialog,JApplent,JPanel) JtabbedPane
2:choosing A layout Manager
3:Adding Components in the Containter
4:Creating Event Handlers
事件监听原理:
import java.util.*;
public class TestGirl {
public static void main(String[] args) {
Girl g = new Girl("秋香");
Boy1 boy1 = new Boy1("xiegy");
g.addEmotionListener(boy1);
Boy2 boy2 = new Boy2("zhaojun");
g.addEmotionListener(boy2);
g.fire();
}
}
interface EmotionListener {
void whatCanIDoWhenGirlHappy(EmotionEvent e);
void whatCanIDoWhenGirlSad(EmotionEvent e);
}
//
////事件对象封装事件源
//class EmotionEvent{
// private Object source;//事件源
// public EmotionEvent(Object source){
// this.source = source;
// }
// public Object getSource() {
// return source;
// }
//
//}
//事件对象封装事件源
class EmotionEvent extends EventObject{
public EmotionEvent(Object source) {
super(source);
}
}
//事件源
class Girl {
private String name;
private List<EmotionListener> listeners = new
ArrayList<EmotionListener>();
public void addEmotionListener(EmotionListener listener){
listeners.add(listener);
}
public void removeEmotionListener(EmotionListener listener){
listeners.remove(listener);
}
public void fire(){
for(int i=1;i<=5;i++){
System.out.println("Day"+i);
if(i%2 == 0){
System.out.println(name+"说:今天
心情不好!");
for(EmotionListener e:listeners){
//所谓事件源向监听者发
出消息,即通过事件对象封装事件源
//然后以事件对象为参数
调用监听者的相应方法
EmotionEvent event =
new EmotionEvent(this);
e.whatCanIDoWhenGirlSad(event);
}
}else{
System.out.println(name+"说:今天
天气好,心情好!");
for(EmotionListener e:listeners){
EmotionEvent event =
new EmotionEvent(this);
e.whatCanIDoWhenGirlHappy(event);
}
}
}
}
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//事件处理者
class Boy1 implements EmotionListener {
private String name;
public Boy1(String name) {
this.name = name;
}
@Override
public void whatCanIDoWhenGirlHappy(EmotionEvent e) {
Girl g = (Girl)e.getSource();
System.out.println(name + "对"+g.getName()+"说:你开心我也挺开
心!");
}
@Override
public void whatCanIDoWhenGirlSad(EmotionEvent e) {
Girl g = (Girl)e.getSource();
System.out.println(name + "对"+g.getName()+"说:你EmotionEvent不
开心我也不开心!");
}
}
class Boy2 implements EmotionListener {
private String name;
public Boy2(String name) {
this.name = name;
}
@Override
public void whatCanIDoWhenGirlHappy(EmotionEvent e) {
Girl g = (Girl)e.getSource();
System.out.println(name + "对"+g.getName()+"说:你开心我倒不开
心!");
}
@Override
public void whatCanIDoWhenGirlSad(EmotionEvent e) {
Girl g = (Girl)e.getSource();
System.out.println(name + "对"+g.getName()+"说:你不开心我也开
心!");
}
}
private class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
jta.append(jtf.getText()+”\n”);
jtf.setText();
}
}
private class MyKeyListener extends KeyAdapter{
@Override
public void KeyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
jta.append(jtf.getText()+”\n”);
jtf.setText();
}
}
Java net 网络编程
端口0~65535
0~1024系统保留端口
IPV4 192.168.0.23 按位与
主机地址:0.0.1.23
网络地址:192.168.0.0
子网掩码:255.255.254.0
public class TcpServer {
public static void main(String[] args) {
ServerSocket ss = null;
try {
//1.得到ServerSocket
ss = new ServerSocket(8888);
System.out.println("Server start
...");
//2.等待客户端连接
Socket s = ss.accept();
//3.从Socket中得到输入输出流
InputStream in =
s.getInputStream();
DataInputStream din = new
DataInputStream(in);
String text = din.readUTF();
System.out.println("Server
Receive"+text);
OutputStream out =
s.getOutputStream();
DataOutputStream dout = new
DataOutputStream(out);
dout.writeUTF("你好,客户端");
dout.close();
din.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
try{ss.close();}catch(IOException
e){e.printStackTrace();}
}
}
}
import java.io.*;
import java.net.*;
public class TcpClient {
public static void main(String[] args) {
Socket s = null;
try {
s= new Socket("localhost",8888);
OutputStream out =
s.getOutputStream();
DataOutputStream dout = new
DataOutputStream(out);
dout.writeUTF("你好,服务器");
InputStream in =
s.getInputStream();
DataInputStream din = new
DataInputStream(in);
String text = din.readUTF();
System.out.println("Client
Receive:"+text);
din.close();
dout.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
Java中的IO(输入/输出)和线程是两个核心概念,它们在开发高效、响应性强的应用程序时起着至关重要的作用。输入/输出处理数据的传输,而多线程则涉及程序的并发执行。 首先,让我们深入理解Java的IO系统。Java.IO...
在Java编程语言中,IO(Input/Output)流和线程是两个重要的概念,它们在构建复杂的系统中扮演着至关重要的角色。在这个“万年历记事本”课设项目中,开发者结合了这两个概念来创建一个功能丰富的应用程序。下面我们...
Java线程和IO操作是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在Java中,线程用于实现并发执行,而IO操作则涉及数据的读取和写入。这两者结合可以创建能够同时处理多个输入/...
通过运行这些示例,你可以直观地理解IO流的工作原理,并学习如何在实际项目中运用。 总结来说,Java的IO流是一个庞大且重要的主题,涵盖了数据的输入、输出、缓冲、转换等多个方面。对于初学者而言,理解和掌握IO流...
### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....
Java多线程.drawio
本文档将介绍 Java 语言中的图形界面(Swing)、输入输出流(IO)和线程(Thread)部分的知识点,并提供相应的程序源码和运行结果截图。 资源摘要信息 Swing Swing 是一个用于开发 Java 应用程序用户界面的开发...
Java IO流是Java平台核心特性之一,它负责在程序与外部资源之间传输数据。这个概念在Java编程中至关重要,因为它提供了处理输入(读取)和输出(写入)的机制,无论是从键盘、文件、网络还是其他数据源。在本文中,...
Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 Java IO系统的设计原则之...
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
在Java IO模型中,当一个线程发起一个IO操作请求时,该线程会一直阻塞等待直到IO操作完成。这意味着如果一个线程正在执行一个读取操作,那么在此期间该线程无法执行其他任何任务,必须等到读取操作完成才能继续下...
Java IO应届生培训讲义是一份面向刚毕业的大学生进行Java IO相关知识的培训资料,它涵盖了Java IO的基础知识、不同的IO模型以及Java中的BIO、NIO和AIO高级IO类库。下面详细解释这些知识点: 1. 用户空间和内核空间 ...
Java中的IO流是Java核心库的重要组成部分,它用于在不同数据源之间传输数据。Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又...
自己写的 io流 多线程 实现上传下载 小程序 java
总的来说,这个“javaIO学习课件”涵盖了Java I/O的基础到高级主题,包括流的类型、文件操作、线程间通信以及非阻塞I/O,是全面学习和提升Java I/O技能的宝贵资源。通过深入研究这些材料,开发者可以更好地理解和...
《Java IO.chm》是一个关于Java输入/输出(IO)技术的压缩文件,其中包含了丰富的资料,适合开发者深入理解和学习Java IO系统。这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、...
Java IO操作是Java编程中的重要组成部分,主要用于处理输入和输出数据。在Java中,IO操作涉及到文件、字节流、字符流以及管道流等多个概念。下面将详细解释这些知识点。 首先,我们来看“文件类”。在Java中,`java...
在这个"java-demo"项目中,我们可以深入学习Java技术,特别是关于多线程、IO流以及两种不同的IO模型——阻塞IO(BIO)和非阻塞IO。此外,还涉及到Netty框架的应用,这是一个高性能、异步事件驱动的网络应用框架,常...
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
Java中的IO流是Java语言处理输入输出操作的重要组成部分,它为数据传输提供了强大的支持。本文将深入探讨Java的IO流实例应用,旨在帮助开发者更好地理解和掌握这一关键概念。 IO流在Java中分为两大类:字符流...