一、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不在此区间");        }    }}