1.为什么java main不能使用static 定义变量?
只有类才存在静态的变量 方法只能对静态变量的操作 不能在方法内试图定义静态变量
否则的话会抛出编译错误
静态变量的本意是为了让所有的对象共享这个变量,如果在方法里面定义静态变量的话就存在逻辑错误了,也达不到你想要目的. 因为在方法定义静态变量根本没有他的任何意义. 任何对象都有自己的方法,即使是静态方法,方法内的变量也是在方法调用时候才开始分配内存,所以想给成静态的在逻辑上存在问题。
2浅复制(shallow copy)
https://www.cnblogs.com/shakinghead/p/7651502.html
3.equals和==的区别(老是记不住):
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
String s="abce"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。
以String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。
这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
而String s = new String("abcd");和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
也可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
重载和覆盖
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。
public class Super {
public float get(int n){
return 4.0f;
}
}
public class Sub extends Super {
public Sub(){
super();
}
/*覆盖*/
public float get(int n){
return 7.0f;
}
/*重载参数数量不同*/
public float get(int var1,int var2){
return var1;
}
/*重载参数类型不同*/
public float get(float var1){
return var1;
}
/*
* 返回类型不同不构成重载
* public int get(int var1){
* return var1;
* }
*/
}
jdk 8 中全新的日期时间API
官方文档:Java SE 8 Date and Time
Java 8新的时间日期库的20个使用示例
JVM参数
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
控制线程堆栈大小的参数:-Xss 每个线程的栈大小
Collection和Collections
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
List,Set,Queue接口都继承Collection。
直接实现该接口的类只有AbstractCollection类,该类也只是一个抽象类,提供了对集合类操作的一些基本实现。List和Set的具体实现类基本上都直接或间接的继承了该类。
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
常见方法
当我们想创建一个具体的对象而又不希望制定具体的类时,可以使用行为模式
构造函数
1.构造函数可以被重载。
2.构造函数不可以被覆盖(更不可覆盖父类的构造函数)。
3.构造函数不可以被重写,两个相同参数的构造函数是不允许的。
Java创建对象的方式 todo
1.new
2.clone
3.newInstance 反射
4.反序列化
https://www.cnblogs.com/wxd0108/p/5685817.html
https://blog.csdn.net/cpcpcp123/article/details/51353851
linux实时监控或查看系统资源使用情况的工具——TOP
https://blog.csdn.net/qq_20545159/article/details/49511753
开闭原则
https://www.jianshu.com/p/d36da4f136c4
浏览器渲染页面的流程
https://www.cnblogs.com/chenyoumei/p/9156849.html
进程间通信方式
[https://www.cnblogs.com/zgq0/p/8780893.html](https://www.cnblogs.com/zgq0/p/8780893.html
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
编写一个泛型方法,让它接受泛型参数并返回泛型类型
https://www.cnblogs.com/JohnTeslaaa/p/12706615.html