JavaSE-笔记

java SE-笔记
handsome1531346 pass123456word
接口:

没有构造函数,没有方法体,其他和抽象类一样
jdk1.7:只能有常量和抽象方法:1、常量默认有public static final,公共的静态的常量
2、抽象方法默认有public abstract
jdk1.8:接口中可以定义有方法体的方法了,但是 如果是静态可以直接写,如果是非静态必须加default(前面可以加public,default并不是默认)

类与类:继承关系,只能单继承,可以多层(重)继承
类与接口:实现关系,可以单实现,可以多实现,还可以继承一个类的同时实现多个接口(默认类继承Object)
接口与接口:继承关系,可以单继承,可以多继承

接口和抽象类的区别:
成员特点区别:抽象类可以比普通类多一个抽象方法,接口里只能写常量或抽象方法,1.8的时候可以写非静态的(普通)方法(加default)或静态(普通)方法
关系特点不同:类只能单继承多重继承,接口可以单、多继承接口,类可以继承一个类的同时实现多个接口。
设计理念不同:抽象类:定义整个继承体系的共性内容,接口:定义整个继承体系的扩展内容

多态:
概述:同一事物在不同时刻表现出来的不同形态
前提条件:
1.要有继承或实现关系
2.要有父类引用或父接口引用指向子类对象(实现了接口)
3.要有方法重写(不然就没有意义了)

多态成员访问特点:
fu f=new zi()成员变量和方法在编译时都需要父类中有变量和方法,否则报错,调用变量运行时是运行父类中的变量,因为继承关系到方法,和变量无关。静态方法同样也是如此,因为静态不是重写和继承没有关系。非静态就是重写,运行时是子类中的非静态方法。以上三个编译时都是必须父类中要有这个变量或方法。只有非静态是运行子类中的,因为重写

多态的好处和弊端:
好处:
1.提高代码的扩展性
2.提高代码的可维护性
多态在实际开发汇中最常用的应用场景:
父类型可以作为方法的形参参数,这样就可以接受其任意的子类对象

弊端:
1.父类(父接口)引用 不能直接使用子类的特有成员(成员变量和成员方法)非重写的方法、静态的方法(类似重写并非重写),解决方法是父类对象向下转型成子类的对象来调用

异常:
分类:Throwable类:
Error:错误
服务器宕机,数据库崩溃
Exception:异常
编译期异常:非RuntimeException类以及子类,javac.exe .java->.class 编译只检查语法问题,编译器的异常不处理通不过(无法启动执行项目)
运行时异常:RuntimeException类及其子类,执行.class字节码文件,不处理也可以运行,
面试题:运行时的异常有哪些:空指针异常,数组下标越界异常,类型转换异常,除数为0异常

异常处理(运行时或编译时):
1、try{}catch(异常类型 异常对象){如果发生异常,就运行此模块}finally{正常情况下都会运行,一般是用来释放资源的} 选中整个代码+快捷键shift alt z,如果在try里的出现异常的代码后面加了其他语句,报异常了其他语句就不会执行(直接执行catch里的语句去了)如果在chtch里写了return那就就会结束程序运行(和throws一样了,原本就该结束)finally里的代码一般都会运行即使catch里写了return,除非服务器宕机电脑卡死或者终止当前正在运行的虚拟机jvm(在chach块里写System.exit(0)命令)不会执行finally
2、throws 异常对象
try catch和throws的区别:try catch处理完异常以后程序会继续往下执行,throws处理完异常程序会终止运行
分类:
按流向分:输入流(读去数据)和输出流(写出数据)
按操作分:以下四个都是抽象类,他们的子类都是在父类前加一个File
字节流:以字节为单位来操作数据,字节输入输出流:InputStream,OutputStream
字符流:以字符为单位来操作数据,字符输入输出流:Reader,Writer

io流的顶层都是抽象类,集合的顶层都是接口

fileinputstream中主要有两个方法:一个是read(文件路径)一个是read(file对象),一个一个读返回值是booleam类型
fileoutputstream中有四个方法:一个是write(文件路径)一个是write(file对象),另外两个都两个参数多一个booleam类型参数,注意:没有booleam类型参数的构造函数 输出到文件里面会覆盖原文件,若是true则会追加到原文件后面

io流拷贝图片,需要创建字节输入流和输出流,然后把拿到的每个字节都传给输出流写入目标文件里,一次拷一个字节
拷贝文件,一次拷一个字节数组,需要创建一个byte数组并赋值上长度,调用输入流的read方法参数为byte对象,方法返回值为读到的有效长度,为空返回-1,并将读到的内容赋值给byte数组。可以使用string类的构造方法来把读到的内容赋值给byte数组,string(byte对象,前下标,后下标)

递归:

转换流:java.io.read的子类inputstreamreader和outputstreamwriter 参数是fileinputstream对象,另一个参数是string类型的编码格式,默认是eclipse默认格式。
fileoutputstream(“a.txt”)会自动创建文档,但是字节输入流不会自动创建所以才有了notfountfile异常
高效流字符流也叫缓冲字符流,bufferedreader(fileinputstream)和bufferedwriter可以一次读一行,每一行都用string来接收,字节流fileinputstream是用byte数组来接收,字符流filereader是用char来接收,儿bufferedwriter是一行用string来接收,java.io.buffered。方法有newLine():输出的时候换行的功能
高效字节流 bufferedwriter。高效的流也可以读一行和读单个或者读一个数组。读一行的时候是readLine,写一行的时候是write里面传string就可以

jdk1.6以及以前的io流异常处理的代码:try{}catch(){ }finally{ 关流,因为输入和输出流都是在外面声明的null,可能异常没有捕捉到就停止运行了,导致输入输出流为null,所以有可能也有异常所以判断不为空以后用trycatch再捕捉一次最后把另一个流放在finally中关闭 }
jdk1.7以及以后io流的标准异常处理代码:try-catch-resources
try(){},写在try小括号里的内容,会在大括号里的代码执行完毕后自动释放(try里的类对象必须实现autocloseable接口,重写了close方法,大括号执行完以后,自动调用小括号里的类对象的close方法)

多线程:
进程:可执行文件(程序)exe
线程:进程的执行单元(路径)
多线程:进程的多条执行路径

举例:
qq,飞秋
一台电脑可以有多个进程,这些进程之间的数据是隔离的
一个进程可以有多条线程,这些线程共享当前进程的数据

多线程并行:多个线程同时执行,前提:需要多核cpu,多线程并行是多个cpu同时运行多个线程
多线程并发:多个线程同时请求执行,但是cpu同时只能执行一个,于是就安排这些线程交替执行
由于时间间隔非常短,我们看起来好像是同时执行的,其实不是,多线程并发是一个cpu同时运行多个线程
多线程的执行特点:随机性,延迟性 。原因是cpu在做着高效的切换

多线程的第一种实现方式:
方式一:
定义一个类去继承Thread类
重写Thread#run(),把要执行的代码写到run()中
创建线程对象
开启线程
第二种实现方式:实现Runnable接口
定义一个类去实现Runnable接口
重写Runnable#run(),把要执行的代码写到run()中
创建Runnable接口的子类对象,将其作为参数传入Thread类的构造,创建线程对象
开启线程
第一种方式是调用的Thread类的空参构造,第二种是调用的thread类的有参构造

多线程的两种实现方式有什么区别
方式一:继承Thread类
好处:代码相对比较简单,因为(MyThread)是直接继承Thread类,所以可以直接使用Thread类中的方法,比如getname,获取该线程的名字,如果runnable的实现类myrunnable想要用,必须用Thread.currentThread()来获取当前的线程对象
弊端:代码扩展性差,因为(MyThread)已经继承了Thread类,就不能继承其他的类了
方式二:实现Runnable接口
好处:代码扩展性强,因为可以继承其他的类和实现其他的接口
弊端: 代码比较繁琐

多线程的安全(同步)问题:
概述:多线程 并发 操作同一数据,就有可能引发安全问题(负数,值重复)需要用同步解决
同步synchronized:
1、同步代码块:
格式:synchronized(锁对象){
//要加锁的代码
}
锁对象可以是任意对象,但是多的线程必须使用同一把锁,一般是用该类的字节码文件对象.class

	2、同步方法:
		非静态方法:锁对象:this
		静态方法:锁对象:该类的字节码文件
		意思是说非静态方法如果使用同步方法来同步的话,默认使用的是this方法,所以在使用同步方法和同步代码块的时候,一定把同步代码块的锁对象设置成this,静态方法对应的同步代码块锁对象使用的是类文件

匿名内部类:其实就是一个继承了类或实现了接口的匿名的子类对象,相当于new zi()一样
new Fu(){
重写父类所有的抽象方法
}
匿名内部类访问其所在的方法的局部变量时,该变量必须加final修饰,原因是为了延长该变量的生命周期,
但是jdk1.8以后会默认加final

Thread#start为什么调用的是自己写的MyRunnable#run方法,因为thread类的有参构造函数会把传进来的MyRunnable(实现了runnable接口)赋值给变量,然后run方法判断是否null后会调用变量.run(),而多态下,非静态方法调用是运行是的子类的run方法,就是myrunnable#run了

网络编程概述:
网络编程三要素:ip地址,端口号,协议
ip地址:网关号码+主机地址
协议:
UDP:(qq群发)
1、面向无连接
2、采用数据包形式发送,每个包不能超过64kb
3、不安全(不可靠)协议
4、效率高
5、不区分客户端和服务端(发送端和接收端)
TCP:
1、面向有连接(三次握手)
2、采用IO流的形式发送数据,数据无大小限制
3、安全协议
4、效率低
5、区分客户端和服务端
Socket通信:
也叫socket编程或者套接字编程
套接字:ip+端口号就是套接字

静态代码块:只有类加载的时候运行且只有一次,一般是用于加载驱动,一个类创建多个对象,他只会执行一次,比如键盘
构造代码块:执行构造方法前执行构造代码块,里面一般定义的是多个构造方法的共性内容的
局部代码块:为了尽快让变量从内存中释放,因为局部代码块执行完就会释放内存
同步代码块:解决多线程安全问题的

集合:ArrayList,HashSet,HashMap
单列:顶层接口 Collection(接口)
List(接口):有序(存取一致),重复
ArrayList:数组
LinkedList:链表
Vector: 数组
Set(接口):无序,唯一
HashSet:哈希算法啊
TreeSet:二叉树
双列:顶层接口Map
HashMap:哈希算法
TreeMap:二叉树
Hashable
单列遍历三种方式:增强for,iterator迭代器,转数组(toArray)
双列遍历两种方式:获取所有键,获取键值对对象(EntryMap)

并发修改异常:在遍历集合(一般是List集合)的时候添加或删除会报异常
方案一:使用ListIterator列表迭代器解决,注意:添加或者删除不能用list的方法,必须用列表迭代器的删除和添加的方法
方案二:使用CopeOnWriteArrayList结合解决(已经解决并发问题),可以使用arrayList集合的add和delete方法,

Collections:单列集合的工具类
max,min,reverse,sort,shuffle(随机打乱顺序)
StringBuilder(String对象),stringbuilder有一个reverse方法

Properties集合类:它是一个双列集合,键值都是String类型,它是唯一一个可以和IO流直接使用的集合
load(fileinputstream(文件名))方法直接从文件中读数据到控制台
put(“键”,“值”),然后接着使用store(fileoutputstream(文件名,备注))方法来向文件中写数据

内存输出流:把整个内存当作一个缓冲区,可以往里面写数据或读数据
ByteArrayOutputStream:write(byte)写入到内存中。输出到控制台的方法有两个:toByteArray,toString

输出语句System.out.println();默认调用了该对象的toString方法

线程的声明周期:4个
1、新建状态:线程对象创建完成
2、可运行状态(就绪状态):获取了cpu的执行权限(个人理解:调用的strat方法)
3、运行状态:正在执行,可能有阻塞(等待同步锁,调用阻塞方法)或等待(wait,join,sleep)然后就失去了cpu资源回到了就绪状态
4、死亡状态:run()方法执行完成,Exception,Error

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值