自动转换
byte,short,char—> int —> long—> float —> double
Java 变量类型
类变量:独立于方法之外的变量,用 static 修饰。
实例变量:独立于方法之外的变量,不过没有 static 修饰。
局部变量:类的方法中的变量。
实例变量和静态变量的区别
可以通过对对象属性的更改来进行对类的静态属性的更改
选择排序
int [] a = new int[]{(int)(Math.random()*100),(int)(Math.random()*100),
(int)(Math.random()*100),(int)(Math.random()*100),(int) (Math.random()*100)};
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.print("\n");
for (int j = 0; j < a.length-1; j++) {
for (int i = j+1; i < a.length; i++) { //收缩前边界
if(a[i]
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
冒泡排序
for (int j = 0; j < a.length; j++) {
for (int i = 0; i < a.length-j-1; i++) { //收缩后边界
if(a[i]>a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
//把内容打印出来
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println(" ");
类标识符
Java类初始化顺序
静态属性:static 开头定义的属性
静态方法块: static {} 圈起来的方法块
普通属性: 未带static定义的属性
普通方法块: {} 圈起来的方法块
构造函数: 类名相同的方法
方法: 普通方法
关于 JAVA 基础-类和对象-属性初始化的提问属性初始化的顺序为:1、声明变量的时候的初始化2、初始化块3、构造函数初始化所以建立一个新的对象的时候,其属性最终应该是构造函数中的赋给的值
单例模式
构造方法私有化
静态属性指向实例
public static的 getInstance方法,返回第二步的静态属性
类的多态条件
父类(接口)引用指向子类对象
调用的方法有重写
实际上,是子类重写的静态方法被隐藏了。父类引用指向子类对象时,调用的是父类的静态方法;子类引用指向子类对象时,调用的是子类重写的静态方法
类方法就是隐藏呀,对象方法才是重写
方法的重写是子类覆盖父类的对象方法
隐藏,就是子类覆盖父类的类方法
public class Hero {
public static void battleWin(){
System.out.println("hero battle win");
}
}
public class ADHero extends Hero {
//隐藏父类的battleWin方法/
public static void battleWin(){
System.out.println("ad hero battle win");
}
public static void main(String[] args) {
Hero.battleWin();
Hero h=new ADHero();
h.battleWin();
ADHero.battleWin();
}
}
public class ADHero extends Hero {
//隐藏父类的battleWin方法/
// public static void battleWin(){
// System.out.println("ad hero battle win");
// }
public static void main(String[] args) {
Hero.battleWin();
Hero h=new ADHero();
h.battleWin();
ADHero.battleWin();
}
抽象类与接口的区别
区别1:
子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
区别2:
抽象类可以定义 public,protected,package,private 静态和非静态属性 final和非final属性 但是接口中声明的属性,只能是 public 静态 final的 即便没有显式的声明
集合框架体系整理
java 堆、栈、堆栈区别
java 堆、栈、堆栈区别:只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
String str3 = str1;
System.out.println(str3); //bcd
String str4 = "bcd";
System.out.println(str1 == str4); //true
---------------------------------------------------
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
总结:
(1)我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。因 此,更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。清醒地认 识到这一点对排除程序中难以发现的bug是很有帮助的。
(2)使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是 享元模式的思想,但JDK的内部在这里实现是否应用了这个模式,不得而知。
(3)当比较包装类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。
(4)由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高效率。
栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量. 在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).
堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中. 在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用.
堆是全局的,堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new 得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。 其实在实际应用中,堆栈多用来存储方法的调用。而堆则用于对象的存储。
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
1、语法层面的,以及最简单的多线程、接口、抽象类、继承、封装、多态、jdbc这些基础打扎实了2、熟练使用框架,最重要的是Spring、Spring MVC,持久层框架Hibernate与MyBatis其中之一,当今企业级开发一般都是后者,这既是工作中要用到的,对这些框架的使用也可以强化你的基础,为后面的研究打下基础3、开始逐步研究JDK源码,重点是集合类的实现原理4、设计模式,最常用的几种5、深入学习多线程知识,比如synchronized、ReentrantLock、、定时器、线程池和各种多线程组件6、Java虚拟机7、Java Web方面的一些知识(如果你是Web程序员的话)以及分布式相关知识体系