一、java"一次编译,到处运行"的跨平台性:
跨平台的原因:同样的一个java字节码文件(.class),既可以在java CPU上运行,也可以通过Windows的java字节码解释程序,(就像一个虚拟的java CPU,也就是JVM(java虚拟机)),进行解释运行只要操作系统上有相应的java字节码解释程序,.class文件就能在这个操作系统上编译运行,不是所有的操作系统都有字节码解释程序!
二、堆和栈内存?
- java将内存划分为堆内存和栈内存,定义的变量是存放在栈内存中的 ,而new出来的对象和数组是存放在堆中的
- 栈内存:当一个函数调用时,会在栈内存中申请一个空间,当函数中定义一个变量时,会分配到这个函数申请的栈空间中
,函数运行结束时,函数的栈空间被收回,在这个函数中定义的变量也随之被收回
- 堆内存:用new关键字产生的数组和对象都存放在堆内存中,由java的垃圾回收器来自动管理,堆中产生一个数组或对象,
,还可以在栈中定义一个"引用变量",取值等于堆中的数组或对象的首地址,以后就可以直接通过栈中的引用变量
,直接调用在堆中的数组或对象,栈中的这个变量就是堆中对象或数组的别称,或者是代号
- 引用变量是一个普通变量,第一次在栈中分配,当超过他的作用域之外就会被回收,而堆中的对象或数组,即使不使用,方法结束
也不会释放,只是没有引用变量指向他的首地址了,变成垃圾,不能使用,但是依然站着堆内存空间不放, 到最后被垃圾回收器回收走 这就是java比较消耗内存的原因
public class Arraylist_demo { public static void main(String[] args) { // 定义了一个普通变量,其中要装的数据是堆中某个对象的首地址 int[] x; // 在堆内存中产生了一个数组,将首地址赋值给x x = new int[5]; int sum = 0; for (int i = 0; i < x.length; i++) { x[i] = i + 1; sum += x[i]; } // x变量中的值设为null,x就与原先的数组对象断开了关系,原来的数组对象就没有任何引用变量指向它,然后他就等待垃圾回收器来将它释放 x = null; System.out.println(sum); // 静态数组,定义时就赋值 // ! int[5], 不能指定长度 ! int[] arr = new int[] { 1, 2, 3, 4, 5 }; // arr = null; // java.lang.NullPointerException空指针异常: // 使用时如一个函数返回一个对象,使用时判空,不让经常导致空指针异常 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } // java.lang.ArrayIndexOutOfBoundsException数组下标越界 // System.out.println(arr[5]); 角标大于最大角标 // 防止异常使用length System.out.println("最后一个数为:" + arr[arr.length - 1]); /** * 多维数组: * * 类似棋盘 */ int[][] xx = new int[2][3]; xx[0][0] = 5; xx[1][2] = 8; for (int i = 0; i < xx.length; i++) { for (int j = 0; j < xx[i].length; j++) { System.out.println("xx[" + i + "][" + j + "]" + xx[i][j]); } } System.out.println("-----------------------------------------------------------"); /** * arraycopy */ int[] aa = new int[] { 2, 3, 1, 5, 9 }; int[] bb = new int[10]; System.arraycopy(aa, 0, bb, 2, aa.length); for (int i = 0; i < bb.length; i++) { System.out.println("bb[" + i + "]:" + bb[i]); } }}
三、java和Android的区别:
java内涵:1、一种编程语言2、一套开发工具3、一个运行环境Android是:具体的操作系统,可以用java语言来编写
四、面向对象
java中的对象:万物皆对象,指的是现实中存在的具体实例;·面向过程: [主 '谓' 宾]重点在谓语,怎么操作?·面向对象 ['主' 谓宾]重点是主语,操作谁?·三大特征 封装 继承 多态·核心 类与对象 {类:是对一种事物的描述,是抽象的,概念上的定义 -动物 *** {对象:是实际存在的某个该类事务的个体,也称为实例 -猫,狗 private私有的 public公开的 四.1:类 一个类就是一个小的模块,尽可能的只公开必须让外部知道的内容,隐藏其他一切内容 设计时避免一个类直接修改另一个类的数据 模块设计: 强内聚:许多功能尽量在类的内部独立完成,不让外面干预 弱耦合:给外部尽可能少的方法调用 四.2:this关键字 - 一个类中的成员方法可以直接调用同类中的其他成员 - 让该类的成员变量名和对其赋值的成员方法的形参变量同名 四.3:垃圾回收 System.gc(); - 叫来垃圾回收器
五、static
静态对象被所有的实例对象所共享属性作用域方法中可以访问属性,但方法之间不能访问彼此内部定义的变量
- 静态方法
使用前不用创建任何对象main方法是静态的,JVM在执行main方法时不创建main方法所在的类的实例对象,所以不能直接访问该类的非静态成员,必须创建该类的一个实例对象,才能通过这个对象去调用非静态成员
- 静态变量
特定的数据在内存中只有一份,无论是否产生,或产生了多少对象;
- 静态代码块:
一个类可以中可以使用不包含在任何方法中的静态代码块,类被载入时,静态代码块执行,且执行一次,常作属性初始化操作。即使产生多个实例对象,其中静态代码块只执行一次
当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就加载程序中的所有用到的类
- 子类对象实例化 :
new
关键字
六、多线程
六.1:进程 在多任务的系统中,每个独立执行的程序都被称为进程(正在进行的程序) CPU只有一个的情况下,每个进程之间要不断的切换,反而要额外的开销(交替执行多个程序)反而更慢 双CPU系统才能实现多进程,每个CPU一个执行一个程序,两个程序同时进行 一个进程可以包含一个或多个线程六.2:线程 一个线程就是一个程序内部的一条执行线索 多线程:一个程序实现多段代码同时交替运行,就需要产生多个线程,并且指定每个线程要执行的代码 Thread.currentThread().getName(); Thread thread = new Thread(); //后台线程 thread.setDaemon(true);
- 多线程卖票案例
public class ThreadDemo { public static void main(String[] args) { try { /** * 一个thread对象是一个线程 */ TestThread tt = new TestThread(); // 继承thread // tt.start(); // tt.start(); // tt.start(); // tt.start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); } catch (Exception e) { // TODO: handle exception } }}/** * 实现runnable 接口比继承thread灵活 * * 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序代码、数据有效分离 , 体现了面向对象的设计思想 * * @author TianYu * */class TestThread implements Runnable /* extends Thread */ { int tickets = 100; @Override public void run() { while (true) { if (tickets > 0) { System.out.println(Thread.currentThread().getName() + " is show " + tickets--); } } }}
基础
① if & switch
/** * 使用{}使得代码可读性好 * * @author TianYu * */public class If_demo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入数字"); int i = scanner.nextInt(); /** * if语句 执行多条语句要放在{}中的代码块中 * * 每个语句可以是使用{}组成的复合语句 */ if (i < 3) { System.out.println("输入的数字<3"); } else if (i >= 3 && i <= 8) { System.out.println("输入的数字在3和8之间"); } else { System.out.println("输入的数字>8"); } /** * * 三元运算符 当语句比较简单,使用问号表达式: 条件成立执行:前,否则执行:后语句 * * 变量 = 布尔表达式 ? 语句1 :语句2 */ System.out.println("--------------------------------"); int y; y = i >= 5 ? i : -i; System.out.println(y); /** * syitch语句: * * 只要找到一个case语句就开始执行,所以拿break跳出switch代码,执行之后代码 int byte char short * 不能接受其他类型 */ System.out.println("--------------------------------"); switch (i) { case 1: System.out.println("你输入的是一"); break; case 2: System.out.println("你输入的是二"); break; case 3: case 4: System.out.println("3,4"); break; default: System.out.println("你输入的大于二"); break; } while (i <= 10) { System.out.println(i++); } }}
② Float
public class Float_demo { public static void main(String[] args) { // 最大浮点数 Infinity 幂指数为254 有效的 System.out.println(Float.intBitsToFloat(0X7f800000)); // 比最大还大 NaN 幂指数为255 System.out.println(Float.intBitsToFloat(0X7f800001)); // 最小浮点数 System.out.println(Float.intBitsToFloat(0X00000001)); System.out.println(Float.intBitsToFloat(0X50000000)); /** * 区间 */ Float x = 3.141f; if (x > 3.14 || x < 3.15) { System.out.println(x); } else { System.out.println("x不在此区间"); } }}