20190730-java基础

20190730-java基础

                                        ——Javee

二十六、构造方法

 

1. 构造方法名称和类名相同,且不能有返回值

2. 每一个类在没有手动设置构造方法的时候都有一个默认的public构造方法

3. new对象必须要执行构造方法

4. 构造方法可以重载,但无法重写.

 

二十七、final关键字作用

1. final修饰属性代表最终的属性,即常量,不可修改

2. final修饰方法代表最终的方法,不可以重写

3. final修饰的类代表最终的类,不可以继承

(常量名一般使用匈牙利命名法:字母大写,单词之间只用下划线连接,如MY_GRIL_FRIEND、MAX_VALUE)

 

二十八、 static关键字作用

1. static修饰的属性为类属性,修饰的方法为类方法

不依赖于实例,只依赖于类,最早加载

2. static修饰的属性和方法只有一份

3. static修饰属性一般要和final一起使用变为静态常量,

因为static修饰的属性会有共享安全问题,多个实例修改是同一份空间

4. 静态方法不能直接调用实例属性和实例方法,因为没有this.

要调用的话,需要先实例化对象.

5.static修饰的属性和方法不易于GC回收,太多容易造成内存溢出

6.static不可以在方法内部修饰属性

 

二十九、this关键字作用

1. this关键字只能使用在实例方法和构造方法中

2. this代表当前实例

3  this可以访问实例属性,实例方法,和构造方法

 

实现多态的几种方法:

  • 父类接收子类对象

  • 重写

  • 重载

  • 可变参数

 

三十. 什么是继承

1. java中使用extends关键字继承

2. java中的类只能单继承

3. 子类继承父类所有属性和方法,但是只能访问有权限的属性和方法

4. 父类只提取子类共同的属性和方法

 

三十一. super关键字

1. super代表调用父类实例

2. 如果子类没有父类的属性,那么super和this调用的是同一份空间

3. 如果子类有的话,super和this获取到的数据不一样,super设置父对象的空间

this设置本身的空间

4. 子类如果重写了父类的方法,那么this.method()会调用子类的重写的方法

但是属性不会,因为属性不存在重写.

 

三十二.抽象类

1. 当一个类作为父类使用,本身不需要被实例化的时候,可以设置为

抽象类.

2. 抽象类不能被实例化

 

三十三. 抽象方法

1. 抽象方法本身没有方法体,也不需要被调用

2. 抽象方法必须包含在抽象类中,所以也无法调用,因为没有实例

3. 抽象方法的作用是为了设置标准,限制子类必须按这个方法签名去重写方法

4. 子类必须重写父类的抽象方法,除非子类又是一个抽象类

5. 抽象方法可以实现多态

 

三十四. 重写

1. 发生在子父基础关系中,子类重写父类方法

2. 方法名和参数列表必须相同

3. 访问权限不能比父类更严格,也就是要比父类更大(大是什么意思?)

4. 返回值类型必须相同或者是父类方法返回值的子类

5. static方法无法重写

6. 声明的异常不能比父类更大

 

 

三十五. 异常

try catch 捕获可能发生的异常

throw 强制抛出一个异常

throws 向上声明异常,写在方法的签名后面,意在告诉调用方去处理

 

Throwable 异常的基类,异常最大的类.有2个子类分别为:Exception,Error

Exception 编码级别的最大异常类,下面分为RuntimeException

    和非RuntimeException(或称为检查性异常)

Error 非编码级别的最大错误类,一般硬件或内存不足或编译错误.通过编码很难处理的错误.

 

RuntimeException 运行时异常,不要求必须处理

检查性异常   必须处理,否则编码将不通过

 

 

三十六、集合篇

1.

List,Set继承自Collection接口

ArrayList,LinkedList继承自List接口

HashMap,Hashtable继承自Map接口

HashSet,TreeSet继承自Set接口

 

2.

ArrayList为线性存储,查询效率快,尾部插入也快

中间插入和删除效率低

LinkedList为双向链表存储,插入删除效率快,非首尾查询效率低

 

3. Set无序(这里的无序指不按插入顺序排列)不可重复,

TreeSet多了排序功能,前提是需要实现Comparable接口的

compareTo方法编写排序规则

 

4. HashMap和Hashtable都是使用key和value

键值对的保存方式,通过key查找value.key不可以重复,会覆盖.

value可以重复.

两者区别是 hashmap可以有null的key,线程不安全

hashtable不可以有null的key,线程安全

 

集合遍历方式有: foreach  for  iterator  lombda表达式

 

三十七. == equals区别

1. 原生类只能使用==比较,比较的是值

2. 引用类==比较的是引用(地址),equals在不重写的情况下

是继承自Object类的equals方法,它的实现和==相同,比较地址

3. 重写后,按你重写的方式来比较

4. java推荐重写equals方法,也需要重写hashcode方法,

目的是为了保证一个对象如果equals相等,那么它们的

逻辑内存地址也应该相等.反之,只重写equals而不重写hashcode,

会导致在一些地方(HashSet,HashMap)使用,

会发生相同的对象被重复存储

 

三十八、什么是克隆

1. 克隆对象必须实现Cloneable接口

2. 克隆是创建一个新的对象

 

三十九、什么是GC

GC为java中的垃圾回收器,作为java的守护线程在后台运行

,检测没有使用的内存,对其进行释放空间.

但程序员无法保证它何时运行.只能通过System.gc()通知,

但通知了,也不能保证何时执行.

GC回收一个对象的时候,会首先调用它的finalizy方法.

 

 

四十、IO

1. IO指InputStream和OutputStream,输入输出流

2. 输入输出流又细分为字节流(操作文件)和字符流(读取中文)

3. 计算机其实只有字节流,字符流乃通过字节流封装出来的

 

四十一、什么是缓冲区

1. 缓冲一定的内存大小,避免频繁访问硬盘,提升性能和效率

2. 缓冲区中的内容没有满的时候,需要调用flush将剩余缓存的

空间输出.

3. 输出流Writer中默认有一个1kb的缓冲区,注意flush或close.

 

四十二、readline方法

该方法需要读取到一个换行符,才结束,否则一直等待。

如果在等待的时间,客户端断开了连接,那么会抛出一个连接重置异常

 

四十三、进程和线程的关系
一个进程可以包含多个线程
一个线程单独作为一个单元运行,可执行某种任务
实现线程有三种方法:
1. 继承Thread类  直接new 类.start()
2. 实现Runnable接口 没有start方法,使用时需要new Thread(r).start()嵌套一层
3. 使用线程池 有四种,参考四十五

四十四、run和start区别
1. 当线程开始运行,会调用run方法.
但是如果程序员手动调用该run方法,那么和普通方法一样

2. start是告诉jvm启动一个新的线程运行run方法.

四十五、线程池有几种?
1. CachePool 有就用原来的
没有就创建,创建数量无上限(Integer.MAX_VALUE).
2. FixedPool 有就用原来的,没有就创建,创建数量固定上限,后续任务等待.
3. SinglePool 只创建一个线程来完成任务,后续任务等待.
4. ScheduledPool 周期性执行的线程池(类似setInterval)

四十六、线程安全
1. 局部变量不存在线程安全问题,因为每个线程进入的方法会有单独的空间

2. 加上synchronized关键字同步.
可以同步整个方法.也可以同步部分代码块.

3. 使用Lock对象(tryLock,lock,unlock方法)

4. 使用读写锁,提升性能.可以一起读.但读的时候不能写,
写的时候不能读和写.

5. 使用本地线程ThreadLocal,为每一个线程保存一份单独的空间
,该方式可以理解为使用空间换时间.


四十七、synchronized
1. synchronized可以锁局部代码块
2. synchronized写在实例方法上,默认的锁对象为this
当一个对象的实例方法使用了synchronized,那么这个对象的
其他synchronized方法也同样加了this锁.其他线程也同样需要
等待锁释放才能运行这些synchronized方法.
3. synchronized写在静态方法上,默认的锁对象为该方法的类的字节码
.其他使用该字节码同步锁的方法,需要等待该字节码锁被释放.

四十八、什么是死锁, 怎么解决死锁
--->两个或多个线程直接相互等待彼此释放锁,会造成死锁。
解决:
1、 使用Lock的tryLock, 一段时间获取不到就执行unlock释放
2、 synchronize使用同一个锁对象
3、 使用ThreadLocal

四十九、volatile关键字的作用
1. 防止指令的重排序
2. 每次获取到是最新的值
3. 不能保证线程安全

五十、 线程的方法
1. join   示例:thread1.join
阻塞运行,等待thread1执行完成后,程序继续往下执行
2. stop 过时不推荐,直接停止线程,导致不安全
3. interrupt 设置一个interrupt布尔标志为true,然后线程根据这个标志
可以决定什么时候退出. 如果在线程阻塞的情况下调用了interrupt,那么线程会抛出
一个interruptException并重置interrupt为false
4. sleep(ms)阻塞当前线程一段时间,并且不会释放同步块(锁)
5. yield 退让,给OS调用其他同级别线程的机会,自己重新回到就绪状态参与竞选,
可以理解为自动时间的sleep.不会释放锁.

6. wait 等待,释放对象锁并且进入等待状态.释放的必须为同步块的锁对象
可以有参数设置ms多久进入就绪状态(一般不推荐,可能导致线程不安.全).
也可以不写参数,那么会一直等待下去,需要其他线程唤醒它才能继续运行
7. notify 随机唤醒一个等待状态的线程.
该方法必须和要唤醒的线程,在同一个锁对象中.


五十一、线程的生命周期和线程状态的转换
1. 新建--->就绪(可运行)--->运行--->等待/阻塞-->可运行-->死亡
2. 状态转换参考手机图


五十二、java的反射是什么 ?
1. reflect反射,
2. java程序在运行的过程中可以得到任意一个类的属性和方法
,也可以执行任意一个对象的属性和方法


五十三、反射的方法
1. getFiles,getMethods  获取所有public的属性,方法(含父类)
2. getDeclareFiles,getDeclareMethods 获取所有当前反射类的所有属性,方法
3. getDeclareConstructors 获取所有共有构造器(不含父类,因为构造器不能被继承)

 

Java中静态块、实例块和构造块执行顺序:

  • parent静态块

  • children静态块

  • parent实例块

  • parent构造块

  • children实例块

  • children构造块

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值