Android面试-Java基础-基本语法

来源:互联网 发布:解忧杂货店淘宝 编辑:程序博客网 时间:2024/06/02 02:47

基本语法

基本数据类型

数据类型 字节数 默认值 byte 1 0 short 2 0 char 2 0 int 4 0 long 8 0l float 4 0.0f doble 8 0.0d boolean 1 false

整型:
默认使用int类型,声明long类型需要加上l或L
byte short int long 唯一的区别就是存储空间的大小不同
浮点型:
默认使用的类型是double,后面加上F或f才被标示为float类型

基本数据类型转换

把不同的数据类型看出是不同容量的容器.
byte是1个字节,最多只能装1斤水.
short是2个字节,最多只能装2斤水.

自动类型转换:当把小数据范围类型的数值或变量赋给另一个大数据范围类型变量,系统可以完成自动类型转型。这好比把装一斤水容器里的水倒进可以装两斤水的容器里一样。
byte,short,char -> int -> long -> float-> double
byte、short、char之间不会相互转换,他们在计算时首先会转换为int类型

强制类型转换:当把大范围类型的数值或变量赋给另一个小范围类型变量时,此时系统不能自动完成转换,需要加上强制转换符,但这样的操作可能造成数据精度的降低或溢出,所以使用时要格外注意。
这就好比把装两斤水容器里的水倒在可以装一斤水的容器里,是可能造成水溢出的。

byte c=5这是符合强转类型转换条件的,可为什么没转呢?
若直接把一个较小的整数常量(byte,short范围内)赋给一个byte或short变量,系统会自动把这个整数当做是byte或short类型,也就是存在隐式转换

Java中的基本数据类型变量为全局变量时,可以不赋值,直接使用,因为有默认值,但是作为局部变量时,就必须在赋值后才能使用,而对于引用数据类型,无论是全局还是局部变量,都会被赋予默认值null。另外,凡是用new关键字新建出来的对象或数组等,对象或数组里面的基本类型都被初始化了默认值,用static关键字声明的变量也被初始化为了默认值。

任何数据类型与String类型的变量或常量相”+”都会转换为String类型

引用数据类型

接口、类、数组、枚举
默认的初始值都为Null

赋值运算符

public class Hello{     public static void main(String[] args){         short s = 5;    //s = s + 3;//编译出错,需要强转  s = (short)(s + 3);     s += 3;//编译OK,隐式类型转换    }}加等于:x  +=  5; 相当于 x  =  x  +  5,但还包括隐式类型转换。

switch

switch支持的类型是byte、short、char、int,本质是只支持int型(byte、short、char自动提升为int)。
除此之外switch还支持他们的包装类,在Java1.5之后支持枚举在Java1.7之后支持String类型。

嵌套循环

优化案例这里写图片描述这里写图片描述

循环嵌套案例
1.输出矩形图案
”* * * * *“
”* * * * *“
”* * * * *“

    for(int i = 0; i < 3;i++){        for(int j = 0; j < 5; j++){            System.out.print("*");        }        System.out.println();    }

2.输出三角形图案
“*”
“* *”
“* * *”
“* * * *”
“* * * * *”

for(int i = 1; i <= 5; i++){    for(int j = 1; j <= i; j++){        System.out.println("*");    }    System.out.println();}

输出九九乘法表
这里写图片描述

for(int i = 1; i <= 9; i++){    for(int j = 1; j <= i; j++){        Syste.out.println(i + " * " + j + " = " + i * j + "/t");    }    System.out.println();}

控制循环结构语句
break 结束当前所在的循环
continue 结束本次循环进入下一次循环
return 结束循环所在的方法
break、continue、return后面的语句永远没有机会执行,所以不能再跟任何语句,否则编译失败

控制外层循环
此时就得使用标签了,标签就是给某个循环起的别名,不过该别名得满足标识符的规范。
若要控制外层循环,就在break或continue后面跟上循环的别名就OK了
如: break <标签名>; continue <标签名>;
这里写图片描述

方法的重载与重写

重载 同一个类中,方法名相同,参数列表不同,根据传入的参数类型不同调用不同的方法
System.out.println();能打印各种类型的数据的原因就是因为重载

重写 父类与子类之间,子类定义了与父类方法名、参数相同的方法,子类调用这一方法时,默认调用子类自己的方法

方法的递归操作

斐波那契数列
f(0)=0 f(1)=1 f(n)=f(n-1)+f(n-2)

public int fn(int n){    if(n == 0){        return 0;    }else if(n == 1){        return 1;    }else{        return fn(n-1) + fn(n-2);    }} 

JVM内存模型

JVM内存模型图

Java虚拟机栈:每一个方法,创建一个栈帧,,栈帧存放了当前方法的数据信息(局部变量),当方法调用完毕,该方法的栈帧就被销毁了.

Java堆:被所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例以及数组都要在堆上分配(使用new关键字,就表示在堆中开辟一块新的存储空间)。

方法区:线程共享的内存区域,存储已被虚拟机加载的类信息(.class)、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)。