2017

来源:互联网 发布:怎么安装php 编辑:程序博客网 时间:2024/04/29 09:53
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++内存管理
   栈
   堆
   自由存储区
   全局(静态)存储区
   常量存储区
原创粉丝点击