一些碰到的知识点
Java基础
或者:file:///D:/新建文件夹/Java基础知识篇.pdf
-
static、final等的区别与联系
很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量初始化后则不可变。
final int i= Math.random就一直是初始化这个值,打印多少次都是,static int i 则不是。
无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量;
一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。而final类的成员变量初始化后则不会被改变。(例子可见class那儿)
Java中static和final的区别 :
static是静态修饰关键字,可以修饰变量和程序块以及类方法:
当定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;
当修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;
当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。静态方法只能继承,不能被重写。重写没有用,永远是用父类中的那个静态方法
final可以修饰变量、方法及类:
当定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;(值比地址更死板,static值还是可以被改变的,就是除了类加载时那一次,运行时是不会再动态初始化加载的,而final过的就是最终形态)
当修饰一个方法时,该方法在子类中将不能被重写;
当修饰一个类时,该类不能被继承。
其他参考:java中 static,final,transient,volatile关键字的作用
JAVA基础--关键字 final/static/this/super
-----------------------------------------------------------------------------------------------------------------------
-
关于内部类:
Java内部类与外部类的那些事
原来leetcode上的题在IDEA上跑的正确姿势是定义为非静态内部类,然后new类.new Solution对象(内部类构造时要通过外部类,直接new不合法,必须要有new P22这个外部类对象),通过solution对象调用方法,我一直是直接把方法static好像不太对:
------------------------------------------------------------------------------------------------------------------------------
-
非内部类的class在main方法可以直接new对象,不用外部引用。
Java编程中public class与class的区别(Public类和类的区别):
共同点:
Public class和class都是对类进行声明,用于定义类,都会生成.class文件。public的class还可以继承class。但非内部类的class不能用于反射好像,可能是因为不能被其他包访问限制了。
一、Public class:
1 如果使用了该类,则类名必须与文件名一致
2 被public修饰的类可以被其他包访问
二、Class:
Class类可以访问Public类,但不能被其他包访问
public class Spike { public static void main(String[] args) { Counter a = new Counter(); System.out.println(a.increment());//0 System.out.println(a.anotherIncrement());//2 Counter b = new Counter(); System.out.println(b.increment());//2 这里不是0 说明static的成员变量初始化只有类加载时那1次 System.out.println(b.anotherIncrement());//4 } } class Counter { private static int count = 0; public int increment() { return count++; } public int anotherIncrement() { return ++count; } }
一个编译单元(java文件)可以存在多个类,在编译时产生多个不同的.class文件,.class文件便是程序运行的数据来源。java将public类作为每个编译单元的数据接口,只能有一个,不然不能处理存在多个类的java文件。当一个编译单元(java文件)有多个非public类时,运行时需要对数据来源进行选择。
--------------------------------------------------------------------------------------------------------
原来new对象时(非类加载)不光是执行构造方法,得先初始化成员变量!!new对象是new类的模板!!
看该代码的输出顺序:
public class Test2 { Person person = new Person("Test"); static { System.out.println("test static");} public Test2() { System.out.println("test constructor");} public static void main(String[] args) { new MyClass(); } } class Person { static { System.out.println("person static");} public Person(String str) { System.out.println("person " + str);} } class MyClass extends Test2 { Person person = new Person("MyClass"); static { System.out.println("myclass static");} public MyClass() { System.out.println("myclass constructor");} }
答案:
person在constructor之前!!不能漏!!!!
Java常见面试题汇总-------
-
this和super
1、从本质上讲,this是一个指向本对象的指针,然而super是一个Java关键字,用来对父类进行调用。
2、this:它代表当前对象(本类的对象?)的引用(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)。
3、可以使用super关键字来引用父类(最近父类)的成员变量,方法与构造器。(用来访问直接父类中被隐藏的成员数据或函数,基类与派生类中有相同成员定义时,如:super.变量名、super.成员函数名(实参))。
4、super(参数):调用基类(??不是父类吗?)中的某一个构造函数(应该为构造函数中的第一条语句)。
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
5、this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)。尽管可以用this调用一个构造器,但却不能调用两个。
super()和this()类似,均需放在构造方法内第一行。区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它构造方法。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。(而且从this和super都要求放在构造函数的第一行来看,它们也无法同时存在一个构造方法里面)。
6、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
-
多态的含义解释
父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。继承和接口都可以实现多态。
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
-
继承
extends 使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能。
-
jvm的原理
.class文件被jvm装载以后,经过jvm的内存空间调配,最终是由执行引擎完成class文件的执行。当然这个过程还有其他角色模块的协助,这些模块协同配合才能让一个java程序成功的运行,下面就详细介绍这些模板,它们也是后面学习jvm最重要的部分
详细看下面两个:
参考1:JVM原理最全、清晰、通俗讲解,五天40小时吐血整理
参考2:深入详细讲解JVM原理
-
重载解释
方法名必须相同,参数类型不同个数不同顺序不同
-
==与equals区别与联系
"=="可作用于基本类型变量和引用类型变量:
1.当作用于基本类型变量时,比较的是变量的值是否相等。
2.当作用于引用变量时,比较的是该变量在内存中地址。
"equals"不能作用于基本类型变量,只能作用于引用类型变量
超类object()方法源码,没有重写equals()方法的话,equals() 方法是比较两个对象的内存地址是否相等:比较严格
当有其他方法对equals()进行重写,那么比较的是所指向的对象的内容。比如String类中equals源码重写了,宽松些了
下面,我们以HashSet为例,来深入说明hashCode()的作用。
假设,HashSet中已经有1000个元素。当插入第1001个元素时,需要怎么处理?因为HashSet是Set集合,它不允许有重复元素。
“将第1001个元素逐个的和前面1000个元素进行比较”?显然,这个效率是相等低下的。散列表很好的解决了这个问题,它根据元素的散列码计算出元素在散列表中的位置,然后将元素插入该位置即可。对于相同的元素,自然是只保存了一个。
由此可知,若两个元素相等,它们的散列码一定相等;但反过来确不一定。在散列表中,
1、如果两个对象相等,那么它们的hashCode()值一定要相同;
2、如果两个对象hashCode()相等,它们并不一定相等。
所以,若equals重写了则hashode也必被重写。
注意:这是在散列表中的情况。在非散列表中不一定如此!
-
String a =new String(“abc”)共新建了几个对象
如果之前没有定义过String str =”abc“ 则上面那条语句创建了2个对象。若之前定义过,则只需要1个String对象,sbc指向内容相同的str的引用地址。
String a=new String("b"+"c");
字符串常量 "b" 被JVM存放在数据段区常量池中
字符串常量 "c" 被JVM存放在数据段区常量池中
由于String不可变性,"b"+"c" 又生成了一个字符串 被JVM存放在数据段区常量池中
new String("b"+"c")对象被JVM存放在堆中
总共四个
-
ArrayList、LinkedList和Vector的区别与解释
前两个都是非线程安全但高效,后一个类中所有方法都是同步的,线程安全。
-
集合源码
问题们:
-
new一个对象,内存分配原理
5、算法基础
快排算法描述,时间复杂度
二分查找算法描述,时间复杂度
完全二叉树概念
平衡二叉树概念
红黑树是平衡二叉树么?
hashmap与hashtable的区别
小顶堆概念
6、计算机网络
tcp/ip通信
三次握手
为什么要加ACK
五层网络协议
7、操作系统
进程与线程
8、Android基础
activity的生命周期
Intent传值
intent a=…,intent b=…,如何将a转换成b
//Android多线程(忘了问了木有,问了也不会)
Android运行过程(activity活动流程),应该是
launch mode?
9、项目中的难点与解决方法