java基础知识学习

一:继承:

特点:

1.super关键字

2.this关键字

3.实例化某对象时,会自动调用无参构造函数

4.子类对象转换为父类对象,可进行隐式转换或显示转换,父类对象转换为子类对象时,只能进行显式转换。

class CA{
    String s = "class CA";
}
class CB extends CA{
    String s = "class CB";
}
class Convert{
    public static void main(String args[]){
        CB bb,b = new CB();
        CA a,aa;
        a = (CA)b;//显式转换
        aa = b;//隐式转换
        System.out.println(a.s);
        bb = (CB)b;//显式转换
    }
}

二:多态

特点:

  1. foreach循环

    for (type variableName : array | collection)//array 数组 collection 容器/集合
    {	
    	// variableName 自动迭代访问每个元素...
    }
    
  2. public static void main(String[] args){
    
    	String[ ] books = {"Hello","World","!"};
    	//使用foreach 循环来遍历数组元素
    	//其中 book 将会自动迭代每个数组元素
    	for(String book : books){
    		System.out.println(book);
    	}
    }
    
    
  3. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBy2H0uq-1678670331795)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1656461154383.png)]

4.抽象类与抽象方法:

如果一个类包含了抽象方法,则必须被定义为抽象类,但抽象类不一定要包含抽象方法。

抽象类中的抽象方法没有方法体,必须在子类中具体实现该方法

三:泛型(集合)

1.iterator的使用

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayListHashSet 等集合。

循环集合元素(while循环和for循环)

package item1;

import java.util.ArrayList;
import java.util.Iterator;


public class IteratorTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Zhihu");
        Iterator<String> it = sites.iterator();
        while (it.hasNext()){
            String tmp = it.next();
            System.out.println(tmp);
        }

//        for(Iterator it = sites.iterator();it.hasNext();){
//            Object  tmp = it.next();
//            System.out.println(tmp);
//        }


    }

}

四.输入输出处理

流的划分:

一般的,数据流分为输入流(InputStream)和输出流(OutputStream),输入流只能读不能写,输出流只能写不能读。有字节流和字符流的划分

一.字节流

1.输入字节流有以下类

InputStream

FileInputStream

FilterInputStream

BufferedInputStream

2.输出字节流有以下类

OutputStream

FileOutputStream

FilterOutputStream

BufferedOutputStream

二.字符流

1.字符输入流:

Reader

BufferedReader

InputStreamReader

FileReader

2.字符输出流:

Writer

BufferedWriter

OutputStreamWriter

PrintWriter

FileWriter

三.主要学习点:

1.标准输入System.in.read()

package item4;

import java.io.IOException;

public class StdInput {
    public static void main(String[] args) throws IOException {
        System.out.println("input:");
        byte b[] = new byte[512];
        int count = System.in.read(b);
        System.out.println("Output");
        for (int i = 0; i < count; i++) {
            System.out.print(b[i]+" ");
        }
        System.out.println();
        for (int i = 0; i < count; i++) {
            System.out.print((byte)b[i]+" ");
        }
        System.out.println("count="+count);

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MN5OW1ug-1678670331800)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1656582169630.png)]

2.标准输出System.out.print

3.实例(文本替换)

package item4;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class ReplaceText {
    public static void main(String[] args) throws FileNotFoundException {
        File f;
        String filename;
        System.out.println("输入文件名:");
        Scanner console = new Scanner(System.in);
        filename = console.nextLine();
        f = new File(new File("src/item4"),filename);
        System.out.println("输入要替换的字符串:");
        String pattern = console.nextLine();
        System.out.println("输入要替换的结果:");
        String result = console.nextLine();
        PrintWriter pw = new PrintWriter("replace.txt");
        Scanner reader = new Scanner(f);
        while (reader.hasNextLine()){
            String s1 = reader.nextLine();//分行读取文件
            String s2 = s1.replaceAll(pattern,result);//进行替换
            pw.println(s2);//打印输出
        }
        console.close();
        pw.close();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gsLUOzb-1678670331803)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1656583793263.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KE6FKfEo-1678670331807)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1656583817066.png)]

五.java多线程

线程的创建:

1.通过继承Thread父类创建线程

1.1引例:使用两个线程分别执行数的求和与平方和的运算
package item5;
//1~1000的平方和运算
public class SumThread extends Thread{
    public void run(){
        int sum = 0;
        for (int i = 1; i <=1000 ; i++) {
            sum += i *i;
        }
        System.out.println("平方和:"+sum);
    }
}

package item5;
//1~1000和的运算
public class SquareSumThread extends Thread{
    @Override
    public void run() {
        int sum = 0;
        for (int i = 1; i <= 1000 ; i++) {
            sum += i;
        }
        System.out.println("和:"+sum);
    }
}

测试:

package item5;

public class SimpleThreadTest {
    public static void main(String[] args) {
        Thread sum = new SumThread();
        Thread squareSum = new SquareSumThread();
        sum.start();
        squareSum.start();
    }
}

总结:

通过继承父类Thread,创建自定义线程

线程的核心代码在run()方法中,也被称为线程体

创建线程对象后,run()方法不会自动执行,需要调用start()方法启动线程

线程的执行是并发的,独立线程之间没有确定的顺序关系,输出结果的先后顺序因此不确定。

2.通过实现接口创建线程

package item5;
//自己创建的线程是并发执行的
public class MyThread implements Runnable{
    int count = 1, number;

    public MyThread(int i) {
        number = i;
        System.out.println("创建线程:"+number);
    }

    @Override
    public void run() {//线程体
        while (true){

            System.out.println("线程:"+number+":计数"+count);
            if (++count == 6){
                return;
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(new MyThread(i+1)).start();//线程对象

        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCfkmMut-1678670331812)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1656587715607.png)]

六.网络通信

多客户端Socket通信(将socket对象放置到线程中)

ServerThread线程类

package item6;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ServerThread extends Thread{
    private Socket s;
    private DataInputStream is;
    private DataOutputStream os;

    ServerThread(Socket socket) throws IOException {
        super();
        s = socket;
        is = new DataInputStream(s.getInputStream());
        os = new DataOutputStream(s.getOutputStream());
        start();
    }

    @Override
    public void run() {
        try{
            String str;
            double result;
            double zhi;
            boolean NotEnd = true;
            while (NotEnd){
                str = is.readUTF();
                if (!str.equals("bye")){
                    zhi =Double.parseDouble(str);
                    System.out.println("接受到的值为:"+zhi);
                    result = zhi * zhi;
                    str = Double.toString(result);
                    os.writeUTF(str);
                    os.flush();
                    System.out.println("平方值"+str+"已经发送");
                }else {
                    NotEnd = false;
                    os.writeUTF("bye");
                    os.flush();
                }
            }
            is.close();
            os.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器主程序:

package item6;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MultiServer {
    public static void main(String[] args) {
        try {
            System.out.println("等待连接");
            ServerSocket serverSocket = new ServerSocket(5500);
            Socket s = null;
            while (true){
               s = serverSocket.accept();
               new ServerThread(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端程序:

package item6;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try{
            Socket s = new Socket("localhost",5500);
            DataInputStream is = new DataInputStream(s.getInputStream());
            DataOutputStream os = new DataOutputStream(s.getOutputStream());
            System.out.println("输入待求平方值,输入bye结束。");
            String outStr,inStr;
            boolean NotEnd = true;
            BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
            while (NotEnd){
                outStr = buf.readLine();
                os.writeUTF(outStr);
                os.flush();
                inStr = is.readUTF();
                if (!inStr.equals("bye")){
                    System.out.println("返回结果:"+inStr);
                }else {
                    NotEnd = false;
                }
            }
            is.close();
            os.close();
            s.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:

客户端经过服务器通过输出流的写方法os.writeUTF()发送数据给socket

线程中的方法体run方法中有相应的is.readUTF() 方法读取数据,再通过os.writeUTF(str)方法,将结果通过服务器返回给客户端。

客户端在通过is.readUTF()方法读取数据并显示。

      System.out.println("返回结果:"+inStr);
            }else {
                NotEnd = false;
            }
        }
        is.close();
        os.close();
        s.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

}


结果:

客户端经过服务器通过输出流的写方法os.writeUTF()发送数据给socket

线程中的方法体run方法中有相应的is.readUTF() 方法读取数据,再通过os.writeUTF(str)方法,将结果通过服务器返回给客户端。

客户端在通过is.readUTF()方法读取数据并显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值