1、基本数据类型算法
Java数据大多数存放在堆栈中。数组
栈区:存放局部变量,对象声明的引用等。数据结构
堆区:存放new关键字建立的类(包含成员变量)和数组等。函数
堆与栈的优缺点this
栈的优势:栈数据能够共享,存取速度比堆快。 缺点是:存在栈中数据大小与生命周期是肯定的。code
堆的优势:能够动态分配内存大小,生存期也没必要事先告诉编译器。缺点是:存取速度较慢。对象
举个栗子,以下图:blog
编译器会在栈中建立一个a的引用,而后在栈中查找字面值为5的引用,将a指向5的地址,若没有找到,就会开辟一个地址来继承
存放字面值5,而后再将a指向该地址。定义int c=5;由于栈中存在字面值5,全部c会直接指向5的地址。令a=8,由于栈中教程
没有字面值为8的引用,全部会开辟一个地址存放8,a会从新指向8的地址,c的指向不受a影响,c的值不会改变。
2、引用数据类型
1. Class(类)
2. Interface(接口)
3. Array(数组)
Java是面向对象语言,它为每个基本数据类型都作了相应的包装类(见上一个表格),也就是实现了基本类型变量到包装类
对象的转换。引用类型通常经过new关键字来建立,(对象)它存放在内存的堆中,能够在运行时动态的分配内存大小。引用
变量中存放的是变量内容的地址,它存放在内存的栈中。当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收。
1.代码示例-Class:
public class Demo { String Name; int Age; double Score; Demo(String Name,int Age,double Score){ //定义带三个参数的构造函数,进行初始化 this.Name=Name; this.Age=Age; this.Score=Score; }; public static void main(String[] args) { Demo d1=new Demo("小吴",20,98); Demo d2=new Demo("小天",19,80); } }
2.代码示例-Interface
interface Animal {//定义Animal接口 public void eat(); public void speak(); } public class Dog implements Animal {//Dog类实现Animal接口 public void eat() { System.out.println("我喜欢吃骨头!"); } public void speak() { System.out.println("汪汪汪!"); } public static void main(String[] args) { Dog d=new Dog(); d.eat(); d.speak(); } }
编写接口的方式和类很类似,可是它们属于不一样的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中全部的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口须要被类实现。
接口支持多继承。
3.代码示例-Array
public class Array { public static void main(String[] args) { int[] myList = new int[] {5,2,0,1,3,1,4}; for(int list: myList) { System.out.print(list); } } }
拓展1:
方法的返回值类型为类名:返回该类的对象。
方法的返回值类型为接口名:返回该接口的实现类的对象。
public static Comparable findMax(Comparable[] arr) { int maxIndex=0; for(int i=1;i<arr.length;i++) if(arr[i].compareTo(arr[maxIndex])>0) maxIndex=i; return arr[maxIndex]; }
上述代码中,传递参数为实现了Comparable接口的对象数组,方法返回的是Comparable接口的实现类的对象。
咱们一般会使用Object、接口类型等方式来表示泛型,目的是支持代码重用。
拓展2:自动装箱与拆箱
自动装箱:若是一个int型量被传递到须要一个Integer对象的地方,编译器将在幕后插入一个对Integer构造方法的调用。
自动装箱:若是一个Integer对象被放到须要int型量的地方,则编译器将在幕后插入一个对intValue方法的调用。
注:参考《数据结构与算法分析Java语言描述》和 菜鸟教程