zoukankan      html  css  js  c++  java
  • Java编程基础

    Java中的变量

     变量的数据类型

    :String 类型不是基本数据类型,它实际上是final修饰,所以也不可以继承。

      • float

        float 是单精度类型,当你不声明的时候,默认小数都用 double 来表示,如果要用 float 的话,则应该在其后加上 f 。

      例如:float a = 1.3;

        则会提示不能将 double 转化成 float 这成为窄型转化

      正确:float a = 1.3f;

    数据类型转换

      • boolean类型不参与转换
      • 默认转换

      从小到大:byte , short , char — int — long — float — double

      byte , short , char 之间不相互转换,直接转成 int 类型参与运算。

      • 思考题
    1、下面程序是否有问题
        	byte b1 = 3;
    		byte b2 = 4;
    		byte b3 = b1 + b2;
    		byte b4 = 3 + 4;
    	答:
    		b1、b2 是变量在做运算时默认转化成 int 类型,int类型赋值给 byte 类型会编译报错。
    		3、4 是常量相加为 7 ,检查是否在数据类型范围内,如果不在编译报错,如果在赋值给 byte 类型不会报错。
    
    2、byte b = 300; 是否有问题,如果有如何修改?结果是什么?
    	答:
    		300的二进制表示:00000000 00000000 00000000 100000010
    		转化成 byte 后为 100000010,第一位为符号位会损失精度,所以会报错应该是 byte b = (byte)300; 
    		100000010这个是截取后的补码:源码为:
    		                符号位			数值位
    			补码:		  1             0000010
    			反码:		  1				0000001
    			源码:		  1				1111110
    			
    3、字符串参与运算 是查找ASCII里的值
    		‘a'	97
    		'A' 65
    		'0'	68
    		System.out.println('a');	//a
    		System.out.println('a' + 1);	//98
    
    4、字符串参与运算 是字符串的链接
    		System.out.println("hello" + 'a' + 1);	//helloa1
    		System.out.println('a' + 1 + "hello");	//98hello
    		System.out.println("5+5=" + 5 + 5);	//5+5=10
    		System.out.println(5 + 5 + "=5+5");	//10=5+5
    
    

    变量的作用域

    变量定义在哪个大括号内,它就在这个大括号内有效。 

     

    Java中数据传递

    基本数据类型

    /*
        1、Java中的参数传递
              当 传递基本数据类型的时候,形参的改变 对 实参 是没有影响的
              当 传递引用数据类型的时候,形参的改变 对 实参 是有影响的 
    */

    引用数据类型

    Java中运算符

    算术运算符

      • ++和--参与操作使用

      放在操作数的前面:先自增或者自减,再参与操作

      int a = 10;
      int b = ++a;
      放在操作数的后面:先参与操作,再自增或者自减

      int a = 10;
      int b = a++;

      • 赋值运算符

      扩展的赋值运算符的特点:隐含了自动强制转换。

      面试题:
      short s = 1;
      s = s + 1;

      short s = 1;
      s += 1;
      请问上面的代码哪个有问题?

      • 逻辑运算符

      位运算符(了解)
        A:^的特殊用法
          一个数据针对另一个数据位异或两次,该数不变
        B:面试题
          a:请实现两个变量的交换
            **采用第三方变量
            **用位异或运算符
              左边a,b,a
              右边a^b
          b:请用最有效率的方式计算出2乘以8的结果
            2<<3

    键盘录入(掌握)

        (1)实际开发中,数据是变化的,为了提高程序的灵活性,我们加入键盘录入数据。
        (2)如何实现呢?目前就记住
          A:导包
             import java.util.Scanner;
             位置:在class的上边
          B:创建对象
             Scanner sc = new Scanner(System.in);
          C:获取数据
             int x = sc.nextInt();
        (3)把三元运算符的案例加入键盘录入改进。

    选择结构语句

    switch条件语句

    1、格式:
        	switch(表达式) {
    			case 值1:
    				语句体1;
    				break;
    			case 值2:
    				语句体2;
    				break;
    			...
    			default:
    				语句体n+1;
    				break;
    		}
    		
    		格式解释说明:
    			表达式:可以是byte,short,int,char
    				JDK5以后可以是枚举
    				JDK7以后可以是字符串
    			break:表示程序到这里中断,跳出switch语句
    			default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
    2、面试题
    		switch语句的表达式可以是byte吗?可以是long吗?可以是String吗?
    			可以,不可以,JDK7以后可以
    3、注意事项:
    		A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
    		B:default可以省略吗?
    			可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
    			特殊情况:
    				case就可以把值固定。
    				A,B,C,D
    		C:break可以省略吗?
    			可以省略,但是结果可能不是我们想要的。
    			会出现一个现象:case穿透。
    			最终我们建议不要省略
    		D:default一定要在最后吗?
    			不是,可以在任意位置。但是建议在最后。
    		E:switch语句的结束条件
    			a:遇到break就结束了
    			b:执行到末尾就结束了
    4、案例:
    		A:键盘录入一个数字(1-7),输出对应的星期几。
    		B:单项选择题
    		C:键盘录入一个字符串的问题
    			String s = sc.nextLine();
    		D:根据给定的月份,输出对应的季节
    5、if语句和switch语句各自的场景
    		A:if
    			针对boolean类型的判断
    			针对一个范围的判断
    			针对几个常量的判断
    		B:switch
    			针对几个常量的判断
    

    循环结构语句

    for和while的区别

    			1、使用上的区别
    				for语句的那个控制条件变量,在循环结束后不能在使用了。
    				而while的可以继续使用。
    			2、理解上的区别
    				for适合于一个范围的判断
    				while适合次数不明确的
    					举例:吃葡萄
    			3、案例		
    				把for语句的练习用while改进:
    				a:在控制台打印水仙花数
    				b:统计水仙花个数
    					/*
    						水仙花数:一个三位数,其各位数字的立方和等于该数本身。
    					*/
    						//三位数其实是告诉了我们范围。
    						for(int x=100; x<1000; x++) {
    							int ge = x%10;
    							int shi = x/10%10;
    							int bai = x/10/10%10;
    			
    						//让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
    							if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
    								//如果相同,就把该数据在控制台输出。
    								System.out.println(x);
    				c:改进版的回文数
    					/*
    						一个五位数
    						个位 = 万位
    						十位 = 千位
    						个位 + 十位 + 千位 + 万位 = 百位
    					*/
    						public static void main(String[] args) {
    							//五位数就告诉了我们范围。
    							for(int x=10000; x<100000; x++) {
    								//分解每一个五位数的个,十,百,千,万位上的数据
    								int ge = x%10;
    								int shi = x/10%10;
    								int bai  = x/10/10%10;
    								int qian = x/10/10/10%10;
    								int wan = x/10/10/10/10%10;
    								
    								//按照要求进行判断即可
    								if((ge==wan) && (shi==qian) && (ge+shi+qian+wan==bai)) {
    									System.out.println(x);
    								}
    							}
    						}
    				
    				d:输出九九乘法表
    					public static void main(String[] args) {
    						for(int x=0; x<9; x++) {
    							for(int x=1; x<=9; x++) {
    								for(int y=1; y<=x; y++) {
    									System.out.print(y+"*"+x+"="+y*x+"	");
    								}
    								System.out.println();
    							}
    					}
    					
    				a:珠穆朗玛峰问题
    					/*
    						我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
    						请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
    					*/
    						public static void main(String[] args) {
    int count = 0; int end = 884800; int start = 1; while(start<end) { count++; start *= 2; System.out.println("第"+count+"次厚度是"+start); } System.out.println("要叠"+count+"次"); } b:小芳存钱问题(break以后才能做) /* 需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是, 每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱, 请问,经过多少天,小芳才可以存到100元钱。 */ public static void main(String[] args) { //每天要存储的钱是2.5元 double dayMoney = 2.5; //存钱的初始化值是0 double daySum = 0; //从第一天开始存储 int dayCount = 1; //最终存储不小于100就不存储了 int result = 100; //因为不知道是多少天,所以我用死循环, while(true) { //累加钱 daySum += dayMoney; //一旦超过100元我就退出循环。 if(daySum >= result) { System.out.println("共花了"+dayCount+"天存储了100元"); break; } if(dayCount%5 == 0) { //花去6元钱 daySum -= 6; System.out.println("第"+dayCount+"天花了6元钱"); } //天数变化 dayCount++; } }

    do...while和for、while的区别

    			1、do...while循环至少执行一次循环体
    

    控制跳转语句

    			1、do...while循环至少执行一次循环体
    			2、填空题
    			for(int x=1; x<=10; x++) {
    				if(x%3 == 0) {
    					//补齐代码
    				}
    				System.out.println("Java基础班");
    			}
    			如何让控制台输出2次:Java基础班
    			如何让控制台输出7次:Java基础班
    			如何让控制台输出13次:Java基础班
    

    方法

    方法的注意事项

    如果方法有明确的返回值类型,就必须有return语句返回。

    数组

    定义格式

      A:数据类型[] 数组名;

      B:数据类型 数组名[];

      推荐是用A方式,B方法就忘了吧。 但是要能看懂

    数组的初始化

      A:动态初始化 只给长度,系统给出默认值 举例:

        int[] arr = new int[3];

      B:静态初始化 给出值,系统决定长度 举例:

        int[] arr = new int[]{1,2,3};

        简化版:int[] arr = {1,2,3};

    数组长度

      int len = arr.length;

    Java的内存分配

      A:栈 存储局部变量

      B:堆 存储所有new出来的

      C:方法区(面向对象部分详细讲解)

      D:本地方法区(系统相关)

      E:寄存器(CPU使用)

      注意:

        a:局部变量 在方法定义中或者方法声明上定义的变量。

        b:栈内存和堆内存的区别

          栈:数据使用完毕,就消失。

          堆:每一个new出来的东西都有地址 每一个变量都有默认值

            byte,short,int,long 0

            float,double 0.0

            char 'u0000'

            boolean false

            引用类型 null 数据使用完毕后,在垃圾回收器空闲的时候回收。

    数组内存图

     二维数组(理解)

      元素是一维数组的数组

      • 格式

       A:数据类型[][] 数组名 = new 数据类型[m][n];
       B:数据类型[][] 数组名 = new 数据类型[m][];
       C:数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}};
       D:数据类型[][] 数组名 = {{...},{...},{...}};

      • m,n

       数组名.length;

       数组名[].length;

      • 案例(掌握)

       A:二维数组的遍历

       public static void printArray2(int[][] arr) {
    
          for(int x=0; x<arr.length; x++) {
            for(int y=0; y<arr[x].length; y++) {
              System.out.print(arr[x][y]+" ");
            }
            System.out.println();
          }
        }

       B:杨辉三角形  

    /*
    
        需求:打印杨辉三角形(行数可以键盘录入)
        
        1
        1 1    
        1 2 1
        1 3 3 1
        1 4 6 4 1 
        1 5 10 10 5 1
    
        分析:看这种图像的规律
            A:任何一行的第一列和最后一列都是1
            B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
        
        步骤:
            A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。
              这个n的数据来自于键盘录入。
            B:给这个二维数组任何一行的第一列和最后一列赋值为1
            C:按照规律给其他元素赋值
                从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
            D:遍历这个二维数组。
    */
    import java.util.Scanner;
    
    class Array2Test3 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //这个n的数据来自于键盘录入。
            System.out.println("请输入一个数据:");
            int n = sc.nextInt();
            
            //定义二维数组
            int[][] arr = new int[n][n];
            
            //给这个二维数组任何一行的第一列和最后一列赋值为1
            for(int x=0; x<arr.length; x++) {
                arr[x][0] = 1; //任何一行第1列
                arr[x][x] = 1; //任何一行的最后1列
            }
            
            //按照规律给其他元素赋值
            //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
            for(int x=2; x<arr.length; x++) {
                //这里如果y<=x是有个小问题的,就是最后一列的问题
                //所以这里要减去1
                //并且y也应该从1开始,因为第一列也是有值了
                for(int y=1; y<=x-1; y++) {
                    //每一个数据是它上一行的前一列和它上一行的本列之和。
                    arr[x][y] = arr[x-1][y-1] + arr[x-1][y];
                }
            }
            
            //遍历这个二维数组。
            /*
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    System.out.print(arr[x][y]+"	");
                }
                System.out.println();
            }
            */
            //这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<=x; y++) {
                    System.out.print(arr[x][y]+"	");
                }
                System.out.println();
            }
        }
    }

        

        C:数据转成数组

        int index = 0;
            
            while(number > 0) { //number=123456,number=12345,number=1234,number=123,number=12,number=1,number=0
                arr[index] = number%10; //arr[0]=6,arr[1]=5,arr[2]=4,arr[3]=3,arr[4]=2,arr[5]=1
                index++;//index=1,index=2,index=3,index=4,index=5,index=6
                number/=10;//number=12345,number=1234,number=123,number=12,number=1,number=0
            }
  • 相关阅读:
    JavaScript -- BATweb笔试面试
    1--html属性
    0--node安装
    1-- express
    lsof命令
    1--字符串和数组的指向问题
    19--复杂链表的复制。
    18--二叉树中和为某一值的路径
    剑指offer——64和为s的数字
    剑指offer——04二维数组中的查找
  • 原文地址:https://www.cnblogs.com/zhanwang/p/7118589.html
Copyright © 2011-2022 走看看