您的位置:首页 > 编程语言 > Java开发

2017 - 10 -13 java基础

2017-10-14 19:54 134 查看
1  环境配置

path              配置javac 编译  不需要进入bin目录 直接运行javac

classpath    配置java 运行  不需要进入文件目录 直接运行class 文件  算是了解知识    
                     模仿path制作的

2  命名规则

包:文件夹,区分类。。。全部用小写。

类或接口: 

       一个单词:单词首字母必须大写  Student  Dog

       多个单词:每个单词首字母必须大写  HelloWorld

方法或者变量:

       一个单词:单词的首字母小写  main age

       多个单词:从第二个单词开始,每个单词的首字母大写  studentAge

常量:

      一个单词:全部大写                 PI

      多个单词:每个字母都大写,用_隔开  STUDENT_MAX_AGE

3 原码反码补码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

(补码->原码   取反加一   补码的补码就是原码 )

4  自动转换

byte  a=3;

int   b=4;

byte c= a+b;// byte做加法 默认转换,a转换成4字节然后加b,结果会提示精度问题。

                      //从小转换到大  byte char short 转换成int进行运算

5  强制类型转换溢出问题(8种类型)

//因为byte的范围是:-128到127 而130不在范围内,所以报错

byte b=130;

//所以可以使用强制类型转换

byte b =(byte)130;

分析过程:

我们要想知道结果是什么,就应该知道是如何进行计算的

而我们又知道计算机中数据的运算都是补码进行的。

而要得到补码,首先要计算出数据的二进制

A:130 这个数据的二进制

   00000000 00000000 00000000 10000010

B:做截取操作,截成byte类型的了。

   10000010

   这个结果是补码。

C:已知补码求原码

          符号位           数值位

   补码:   1             0000010

   反码:   1             0000001

   原码:   1             1111110

(1 1111110)所以变成了 -126

***6 面试题

byte b1=3,b2=4,b;

b=b1+b2;

b=3+4;

哪句是编译失败的呢?为什么呢?

byte b=130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?

练习:byte b=300;

b=b1+b2;//这个是类型提升,所以有问题  。。。byte做加法 自动转换成int类型,但b是byte类型

b=3+4;  //常量,先把结果计算出来,然后看是否在byte的范围内,如果在范围就运算

(XJad 反编译工具,将class文件编译成java文件)

***7 看程序写结果

class DataTypeDemo{

      public static void main(String[] args){

         System.out.println('a');   //直接输出一个  字符a
         System.out.println('a'+1); //输出一个字符和一个整数做加法 98   ('0'48 'A'65 'a'97 )

         // 字符串数据和其他数据做+,结果是字符串类型。

         // 这里的+不是加法运算,而是字符串连接符。

         //println输出从左到右?

         System.out.println("hello"+'a'+1);//helloa1

         System.out.println('a'+1+"hello");//98hello

         System.out.println("5+5="+5+5);//5+5=55

         System.out.println(5+5"=5+5");//10=5+5

8 数据类型中补充的几个小问题

(1):在定义Long或者Float类型变量的时候,要加L或者f。

   整数默认是int类型,浮点数默认是double。

   byte,short在定义的时候,它们接收的其实是一个int类型的值。

   这个是自己做了一个数据检测的,如果不在它们范围内,就报错。

(2):byte值得问题

   byte b1=127;

   byte b2=(byte)128; //-128

   byte b3=(byte)129; //-127

   byte b4=(byte)130; //-127

   byte的范围:-128-127

   

   128:1000 0000

   -128:1000 000(这里的1即是符号位,也是数值位)

(3):数据类型转换之默认转换

   byte,short,char--int--long--float--double

   long:8个字节

   float:4个字节
  l为什么long会转换成float呢?

  A:它们底层的存储结构不同。

  B:float表示的数据范围比long的范围更大

  long:2^63-1

  float:3.4*10^38>2*10^38>2*8^38=2*2^114>2^63-1

(4):java语言中的字符char可以存储一个中文汉字吗?为什么呢?

     可以,因为java语言中字符占用两个字节。

     java语言采用的unicode编码。

9 +的用法:

  A:加法

  B:正号

  C:字符串连接符

  System.out.println(3+4);//加法

  System.out.println(+4);//正号

  System.out.println("hello"+'a'+1);//helloa1

  System.out.println('a'+1+"hello");//98hello

10 单目运算符  ~3

   双目运算符  3+4

   三目运算符:

   格式:比较表达式?表达式1:表达式2;
     

***11 赋值运算符 面试题

   short s= 1;

   s=s+1; //有问题,s运算时自动转换成int类型,然后s又是short 会精度报错

   short s=1;

   s +=1;//好像是s=s+1;

   //但实际上没有问题。。。。

   为什么第二个没有问题。。。因为扩展的赋值运算符其实隐含了一个强制类型转换。

   s+=1;

   不是等价于 s=s+1;

   而是等价于 s=(s的数据类型)(s+1)

***12 位运算符 面试题

   两个数的交换

   a b

   方式1:使用第三方变量 c

   方式2:用位异或实现(面试用)

   a=a^b;

   b=a^b;//a^b^b=a

   a=a^b;//a^b^a=b

   方式3:用变量相加的做法

   a=a+b;//a=30

   b=a-b;//b=10

   a=a-b;//a=20

   方式4:一句话搞定

   b=(a+b) - (a=b);// b=10+20 - (20) , a=20

13 \t tab的位置  \n 换行  \r 回车

  

14 java内存分配

   寄存器

   栈

   堆

   方法区
   常量池

 (jdk1.6及之前的版本常量池在方法区,方法区默认4M,容易出现java.lang.OutOfMemoryError:PermGen space错误;jdk1.7做了调整,常量池移动到堆中;jdk1.8取消方法区。永久代是hotspot虚拟机的中方法区的实现,所以hotspot虚拟机中方法区也叫永久代。jdk1.8中用元空间代替了方法区。)

   c++内存管理

   栈

   堆

   自由存储区

   全局(静态)存储区

   常量存储区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: