Java基础学习 1.Scanner Import java.util.scanner Scanner sc=new Scanner(System.in) Int num=sc.nextINT(); String str=sc.next()
Int temp=a>b?a:b; a大于b吗 大于的话就是a否则是b
2.匿名对象 如果只使用唯一的一次 如 public class Person(){ String name; Publilc void showname(){ Systom.out.print(我是:”+name) } } 非匿名对象 Person per=new person() Per.name=’李飞’
匿名对象 New person().name=’lifei’
匿名对象作为方法参数 Public static void main(String[] args){ methodParam(new Scanner(System.in)) }
Public static void merhodParam(Scanner sc){ Int num=sc.nextint(); System.out.print(‘输入的是’+num)} 3.随机数 Random r =new Random(); Int num=r.nextint()
Int num=r.nextint(10);随机0-9
4.对象数组 Public class person{ Private String name; Privatr int agr; Public person(){} Public person(string name,int age){ This .name=name; This.age=age; } Public string getname() {4 Return name; } Public void setname(String name) { This.name=name; } }
… Person[] array=new person[3]; Person one=new person(‘123’,12); Person two=new person(‘135’,22); Array[0]=one; Array[1]=two;
System.out.print(array[0].getname());
5.集合类 arraylist长度可以变化 Arraylist E 代表一个类型 比如String 类型是引用类型 不是基本类型
Arraylist list=new Arraylist<>(); List.add() List.get() List.remove() List.size(); 基本 byte short int long float double char boolean 引用 Byte Short Integer Long Float Double Character Booleam
从jdk1.5+ 可以自动装箱 自动拆箱 即基本类型–>引用类型(包装类) 引用类型(包装类)–>基本类型 Alt+inter 可以出现可以选择的get set 方法
Public class demo4{ Public static void main(String[] args){ Arraylist biglist=new Arraylist<>(); }
Public static Arraylist getsmallList(Arraylist biglist){
Arraylist smalllist=new Arraylist<>();
} } 6.字符串 所有的“”中的额字符串都是String对象 可以共享 字符数组创建字符串 Char[] chararray={‘a’,’b’,’c’} String str= new string(charArray) System.out.print(str)
字符串比较 Str1.equals(str2) 内容比较 字符串获取相关方法 Length() concat()拼接方法 charAt() 获取索引位置值 indexOF() 参数字符串首次出现的位置 字符串截取方法 Substring(int index)或者(int begin int end) 转换方法 分割方法 Replace() split(string regex)按照字符串规则分割
7.静态static 静态只能访问静态 成员方法可以访问静态 8.继承性 extends 共性抽取 父类也是基类和超类 子类也叫派生类 子类可以拥有父类的内容 也可以有自己专有的内容 Public class fu{ int num=10 }
Public class zi extends fu { Int num=20; Public void mehtod(){ Int num=30; System.out.println(num); 局部变量 30 System.out.println(this.num); 本类的成员变量 20 System.out.println(super.num); 父类的成员变量 10 } } 方法的重写也叫覆盖 方法名称一样 参数列表一样 创建的是子类对象就优先使用子类的方法
方法的重载是 方法名称一样 参数列表不一样 子类构造方法中有隐含的super方法 默认先调用父类的构造方法9.super this 关键字 Super 访问父类的成员方法 成员变量 构造方法 This 访问本类的成员变量 本类的另一个成员方法 本类的另一个构造方法 10.抽象类 如果父类中的方法不确定如何实现就是一个抽象方法 抽象类 public abstract class animal{ 抽象方法 public abstract void eat(); } 1.不能直接创建new抽象类对象 2.必须用一个子类继承抽象父类 3.子类必须覆盖重写抽象父类中的所有抽象方法 即 子类去掉抽象方法的abstract 然后补上方法体大括号 如 public void eat(){ System.out.println(‘吃鱼’) } 4.创建子类对象使用 5.如果不全部重方法的话 可以将继承的子类也定义为抽象类
11.接口 公共规范标准 interface 引用数据类型 Public interface 接口名称{} 接口都能定义抽象方法 例如 public abstract void method(); Public 和 abstract 可以省略 必须有一个继承的子类才能使用 实现implements 默认方法 public default voidmethod(){} 默认方法会被实现类继承下去
静态方法 public static void method(){} 可以在实现类中通过接口名称直接调用 如 MYinterface.method();
私有方法 如果接口中共用方法 不让实现类使用 可以定义 私有方法 private void method(){}
接口中的常量 必须赋值 一旦赋值不能修改 建议用完全大写字母 用 public static final 修饰
接口没有静态代码块和构造方法 可以实现多个接口 例如 Public class myinterface implements interfaceA,interfaceB{} 12.多态性 父类 public class Fu{ Public void methods(){ System.out.println(‘父类’) } } 子类public class zi extends Fu{ Public void methods(){ System.out.println(‘字类’) } } 实现类public class demo{ Public static void main(String[] args){ Fu obj=new zi(); Obj.method(); 父类名称 对象名=new 子类名称(); } 接口名称 对象名=new 实现类名称(); }
对象的向上转型 就是多态写法 父类名称 对象名=new 子类名称(); 对象的向下转型 子类名称 对象名=(子类名称)父类对象 Animal animal=new Cat(); Cat cat=(Cat)animal; 13.多线程 并发 交替进行 同一时间段 并行 同时发生 分时调度 抢占式调度
主线程:执行主方法的线程 Java.lang.thread 创建多线程程序的第一种方法:创建thread子类 步骤1.创建一个thread类的子类 2.在thread类的子类中重写run方法 设置线程任务 3.创建thread类的子类对象 4.调用thread类方法start 开启新的线程 执行run方法 多线程原理: Start方法重新开辟一个站空间 执行run方法 Getname 获取线程名称 Sleep 以指定的毫秒数暂停线程 创建多线程程序的第二种方法:声明实现runnable接口的实现类 步骤1.创建一个runnable接口的实现类 2.在实现类中重写run方法 设置线程任务 . 3.创建一个runnable接口的实现类对象 4.调用thread类对象 构造方法中传递runnable接口的 实现类对象 5.调用thread类方法start 开启新的线程 执行run方法
匿名内部类 没有名字 写在其他类内部的类 作用:把子类继承父类,重写父类的方法,创建子类对象合成一步 把实现类实现接口,重写接口方法 创建实现类对象合成一步 方法一:public static void main(String[] args){ 1.//new myThread().start(); New Thread(){ //重写run Public void run(){ For(){sout()} } }.start();
2.//接口 Runnable r=new runnable(); 多态 Runnable r=new runnable(){ Public void run(){ For(){sout()} }
} } New thread®.start();
多线程共享数据会产生安全问题 比如一个影院的三个窗口同时卖票 1-100 解决安全问题方法一:同步代码块 Synchronize(锁对象){ 例如 object obj=new object(); 肯出现问题的代码(访问了共享数据的代码) } 注意:锁对象可以任意但是必须保证多个线程使用的是同一个 作用:把代码块锁住 只让一个线程在同步代码块中执行 解决安全问题方法二:同步方法 Public Synchronize void paytictet(){ 可能出现问题的代码(访问了共享数据的代码) } 解决安全问题方法三:this Public Synchronize void paytictet(){ Synchronize(this){ 可能出现问题的代码(访问了共享数据的代码) } } 解决安全问题方法四:静态同步方法 Public static Synchronize void paytictet(){ 可能出现问题的代码(访问了共享数据的代码) } 解决安全问题方法五:lock接口 1.成员位置创建一个ReentrantLock对象 2.可能出现问题的代码前调用lock接口方法lock获取锁 3.可能出现问题的代码后调用unlock接口方法lock释放锁 如public class Runnableimpl implements Runnable{ Lock l=new ReentrantLock(); Public void run(){ L.lock(); 可能出现问题的代码块 L.unlock(); } } 14.线程状态 notify方法唤醒waitting无限等待状态 只有锁对象才能调用notify和waitting方法 notifyAll唤醒所有 15.线程池即容器 用集合(Arraylist,HashSet,LInkedlist,HashMap)
16.集合 list 创建一个list集合对象 多态 List list=new Arraylist<>(); Add() Add(index:3,element:’love’) Set(3,’A’)替换元素 Get()
Arraylist 数组集合 查询块 增删慢
Linkedlist 链表集合 查询慢 增删块 Linkedlist linked=new Linkedlist<>(); Addfirst()
Vector集合 17.set集合 不包含重复元素 没有索引 也没有for循环 Hashset无序集合 哈希表结构 查询速度快 不能遍历循环 只能用迭代器实现每个元素的输出 如: Set set=new hashset<>(); Interator it=set.iterator(); While(it.hasnext()){ Integer n=it.next(); System.out.print(n); } 或者 for(integer i : set){ System.out.print(i) } 哈希值 hashcode() Hashset 哈希集合 Hashset set=new Hashset<>(); 必须重写hashcode和equals 才能保证元素唯一
Hashset 无序 不允许重复 Linkedhashset 有序 不允许重复 18.可变参数 方法的参数列表数据类型确定 个数不确定时 19.collection集合 工具类 向一个集合中同时添加多个元素 Arraylist list=new Arraylist<>(); Collections.addAll(list,’a’,’b’,’c’…) Collections.shuffle打乱集合元素顺序 Collections.sort升序 可以对类进行创建列表 如 Arraylist list=new Arraylist<>(); Person类 20.Map集合 键和值一一对应 键不可以重复 Put 添加元素 使用多多态创建Map的对象 Map<String,String> map=new HashMap<>();
Map集合遍历利用set集合存储键 用迭代器遍历set集合的key 再通过map集合的get方法获取value值 Map<String,Integer> map=new HashMap<>(); Map.put(‘A’,1) map.put(“B”,2) Set set=map.keyset(); Iterator it=set.iterator(); While(it.hasNext()){ String key=it.next(); Integer value=map.get(key); System.out.print(value) } 21.异常处理 Debug追踪 设置断点 右键选择debug 程序就会停在设置的断点处 f8 逐行执行程序 console回到原控制台 f9跳到下一个断点
Try{ 可能出现异常的代码 }catch(Exception e){ System.out.print(e) 异常的处理逻辑 }
throws声明异常 一旦出现异常就会终止程序的运行 后续代码不会执行 Try{}catch(){} 自己处理异常 后续的代码继续执行 Try{}catch(){}finally{无论是否出现异常 代码都会执行} 如果finally中有return语句 永远返回finally中的结果
22.文件流 字符输入流 FileReader fr=new FileReader(“…\a.txt”) 这里读取文件中数据存 Int len=0; Whiie((len=fr.read())!=-1){ System.out.println((char)len)#强转成字符 } Fr.close();
读取数据存入字符数组 再输出到控制台 FileReader fr=new FileReader(“…\a.txt) Char[] cs=new char[1024]; Int len=0; While((len=fr.read(cs))!=-1){ System.out.println(new String(cs,0,len)) } 将字符数组转换成字符串输出
字符输出流 输出到文本文件 Filewriter fw=new Filewriter(“…\a.txt”) Char[] cs={‘a’,’b’,’c’} 写字符数组 Fw.write(cs) Fw.write(“黑马程序员”) 写字符串 Fw.close(); 23.Properties集合 唯一和io流结合的集合 双列集合 key和value都是String Properties pr=new Properties(); Pr.setProperty(“赵丽颖”,168); Set set=pr.stringpropertyName();#取出键值 放在set集合中 For(String key:set){ String value=pr.getProperty(key); #使用增强for }
使用store方法将数据存储进文件 如.txt文件 使用字符流时 Filewriter fw=new FileWriter(“…\data.txt”) 可以读取中文 Pr.store(fw,”save data”)
使用load方法将文件中数据以键值对的读取到控制台 遍历出来 Pr.load(new FileReader(“…\data.txt”)) Set set=pr.stringpropertyName();#取出键值 放在set集合中 For(String key:set){ String value=pr.getProperty(key); #使用增强for } 24.缓冲流
24.final关键字 内部类 Final 修饰类时 不能有子类 其成员方法因为没有子类也不可以重写 Public final class Myclass{ Public void method(){ } } Final 修饰局部变量 这个变量永不变 内部类 是在类中的 局部内部类在类的成员方法中
25.equals方法 基本类型 比较值 引用类型 比较地址值 Objects的equals方法可以防止空指针异常
迭代器 针对集合 循环遍历 如 Collection coll=new Arraylist<>(); 创建了集合对象 使用多态 接口new实现类 Coll.add(‘asd’) Iterator it=coll.iterato r(); While(it.hasNext()){ hasNext判断集合中还有下一个元素吗 返回值为false或者true String e=it.next(); next()取出元素 Sout(e) }
增强for循环:遍历数组或者集合 For(集合/数组数据类型 变量名:集合名/数组名) { system.out.print(变量名)} 26.File类 文件遍历 用list或者listfiles File file=new File(“c:\a\b”) String[] arr=file.list(); For(String filename:arr){ Sout(filename) } 27.递归 递归需要条件限定 保证递归能停下来 不然会导致栈内存溢出 有限定条件 次数太多也会导致溢出 28.缓冲流 对基本流的增强 增加缓冲区 相当于数组(一次存储多个) 增强效率 FileoutoutStream fos=new FileoutoutStream (“12\0.txt”) 字节输入输出名流 BufferedoutoutStream bos=new BufferedoutoutStream(fos); Bos.write(“123456”) Bos.flush(); Bos.close(); outputStream 把数据写入文件中
字节输入流 Fileinputstream fis=new Fileinputstream (‘12\0.txt’) Bufferedinputstream bis=new Bufferedinputstream (fis) Int len=0; While(len=bis.read()!=-1){ Sout(len) } Bis.close()
字节输入流 读取数据到控制塔 这里利用字节数组存储 一次性读取 Fileinputstream fis=new Fileinputstream (‘12\0.txt’) Bufferedinputstream bis=new Bufferedinputstream (fis) Byte[] byte=new byte[1024] Int len=0; While(len=bis.read(byte)!=-1){ Soutn(new String(byte,0,len)) } Bis.close() 复制文件 先输入在输出
字符缓冲流 字符输出流 BufferedWriter bw=new BufferedWriter (new filewriter(“10\0.txrt”)) Bw.write(“lovE”) 将love写入0.txt 字符缓冲输入流 BufferedReader bw=new BufferedReader (new filereaser(“10\0.txrt”)) Readline()读一行 String line; Whlie((line=br.readline())!=null){ Sout(lilne) } 29.转换流 即编码与解码 UTF-8 gbk等
30.序列化 与 反序列化 把对象以流的方式写入文件 就叫对象的序列化 因为对象包括字符与字节 ObjectOutputstream 对象的序列化流 writeObject§ 序列化时类必须实现Serializable接口
把文件中保存的对象以流的方式读取出来 叫做读对象 也叫对象的反序列化 Objectinoutstream 对象的反序列化流 readObject§
打印流 Printstream 31.软件结构 C/S结构 如QQ 网盘 客户端与服务器 b/s结构 如谷歌 火狐 浏览器与服务器 32.网络通信协议 TCP/IP协议 传输控制协议 包括四层 应用层 http ftp tfto dns 传输层 tcp udp 网络层 icmp ip 物理层
udp协议 无连接通信协议 如视频会议 qq TCP协议 面向连接的协议 三次握手 文件下载 浏览网页 1.客户端向服务器端发送连接请求 等待服务器确认 2.服务器端向客户端会送一个响应 通知客户端收到请求 3.客户端再次向服务器端发送请求 确认连接 33.TCP通信协议 Socket 和 字符字节流
34.Stream流 属于管道流 只能使用一次 List list=new Arraylist<>(); List.add(“张王玉”); List.add(“张2玉”); List.add(“张3玉”); List.stream() .filter(name->name.startswith(“张”)) .filter(name->name.legthn()=3) .filter(name->System.out.print(name))
Foreach 方法 Stream stream=stream.of(“1”,’’2’’,’’3’’) Stream.foreach((String name)->{ System.out.print(name) }) Filter 过滤方法 Stream.filter((string name)->{ return name.startswith(“张”)}) 输出列表中以张开头的字符串 还有 map映射方法 skip 跳过方法 count 统计方法 concat 合并两个流
35.junit单元测试 黑盒 白盒 单元测试 白盒测试 1.定义一个测试类 2.定义测试方法:可以独立运行 3.给方法加@test注解 4.导入Junit包
利用assert断言方法 Assert.assertEquals(expected,result) 期望值和真实值 36.反射 很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架 框架的灵魂 将类的各个组成部分封装成其他对象
获取Class对象的方式: 1.class.forname(‘全类名’):将字节码文件加载进内存 返回class对象 *多用于配置文件 将类名定义在配置文件中 读取文件 加载类 2.类名.class:通过类名的属性class获取 *多用于参数的传递 3.对象.getclass():getclass()方法在Object类中定 Class对象的功能 1.获取成员变量 2.获取构造方法 3.获取成员方法 4.获取类名 案例:写一个框架 不能改变该类的任何代码 可以帮我们创建任意类对象执行任意方法 实现:配置 反射 步骤:1.将需要创建的对象全类名和需要执行的方法定义在配置文件中 2.在程序中加载读取配置文件 3.使用反射技术加载类文件进内存 4.创建对象 5.执行方法 37.注解 本质就是接口 编写文档 生成doc文档 如java API 代码分析 编译检查OC](这里写自定义目录标题)