每日一点Java基础小知识 — day6
欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,欢迎大家的点赞关注喔
-
方法重载:
- 被重载的方法必须改变参数列表(参数个数或类型或顺序不一样)
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的检查异常
- 方法能够在同一个类中或者在一个子类中被重载
- 无法以返回值类型作为重载函数的区分标准
-
方法重写:
- 参数列表必须完全与被重写方法的相同
- 返回类型必须完全与被重写方法的返回类型相同
- 方法名相同
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以
-
关于Javaweb目录问题:
/WEB-INF/web.xml
是部署描述文件/WEB-INF/classes
用来放置应用程序用到的自定义类(.class),必须包括包(package)结构/WEB-INF/lib
用来放置应用程序用到的JAR文件
-
解决哈希冲突常用的两种方法是:开放定址法和链地址法
- 开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败
- 链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0…m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针
-
关于构造方法:
- 在类内部用户可以使用关键字**this.构造方法名()**调用(参数决定调用的是本类对应的构造方法)
- 在子类中用户可以通过**关键字super.父类构造方法名()**调用(参数决定调用的是父类对应的构造方法)
- 反射机制对于任意一个类,都能够知道这个类的所有属性和方法,包括类的构造方法,反射机制
-
try{ } catch() { } finally { }
finally不管是否有异常都会执行,而且,try可以和catch和finally中的一个搭配使用,但是catch和finally不能单独使用
-
关于线程:
-
定义线程:扩展
java.lang.Thread
类、实现java.lang.Runnable
接口 -
实例化线程:
-
如果是扩展java.lang.Thread类的线程,则直接new即可
-
如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法
Thread(Runnable target) Thread(Runnable target, String name) Thread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, Runnable target, String name, long stackSize)
-
-
启动线程:在线程的Thread对象上调用start()方法,而不是run()或者别的方法
-
-
对于final关键字:
- final变量:如果是基本数据类型,则其数值一旦初始化后就不能被改变。如果是引用类型的变量,则对其初始化后,便不能再指向另一个对象,但是其里面的值是可以改变的。引用变量所指向的对象中的内容是可以改变的
- final方法:类中的 final 方法可以被子类继承,但是不能被子类修改。声明 final 方法的主要目的是防止该方法的内容被修改
- final类:final 类不能被继承,没有类能够继承 final 类的任何特性
-
非静态变量不能够被静态方法访问,只能被该类的实例化访问
public class Test { public int x; // 非静态变量 public static void main(String []args) { System. out. println("Value is" + x); // 编译出错,因为静态方法先行执行,此时类中的非静态变量还没有初始化,所以编译出错 } }
-
子类继承的是父类的所有成员,并不只是非私有方法和状态,利用反射可以看出子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。字段同理
-
两个数值进行二元操作时,会有如下的转换操作:
- 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型
- 否则,如果其中一个操作数是float类型,另一个将会转换为float类型
- 否则,如果其中一个操作数是long类型,另一个会转换为long类型
- 否则,两个操作数都转换为int类型
-
关于尖括号问题:
- 只看尖括号里边的!!明确点和范围两个概念
- 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如
List<A>
,List<B>
,List<Object>
- 如果尖括号里面带有问号,那么代表一个范围,
<? extends A>
代表小于等于A的范围,<? super A>
代表大于等于A的范围,<?>
代表全部范围 - 尖括号里的所有点之间互相赋值都是错的,除非是俩相同的点
- 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错
- 如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
List<?>
和 List 是相等的,都代表最大范围- 补充:List既是点也是范围,当表示范围时,表示最大范围
参考牛客Java专项题中的讲解,原题如下:
class A {} class B extends A {} class C extends A {} class D extends B {} 下面的哪4个语句是正确的? A. The type List<A>is assignable to List. B. The type List<B>is assignable to List<A>. C. The type List<Object>is assignable to List<?>. D. The type List<D>is assignable to List<?extends B>. E. The type List<?extends A>is assignable to List<A>. F. The type List<Object>is assignable to any List reference. G. The type List<?extends B>is assignable to List<?extends A>.
public static void main(String[] args) { List<A> a; List list; list = a; //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内 List<B> b; a = b; //B错,点之间不能相互赋值 List<?> qm; List<Object> o; qm = o; //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内 List<D> d; List<? extends B> downB; downB = d; //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中 List<?extends A> downA; a = downA; //E错,范围不能赋值给点 a = o; //F错,List<Object>只是一个点 downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛 }