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+"\t");
								}
								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]+"\t");
            }
            System.out.println();
        }
        */
        //这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似
        for(int x=0; x<arr.length; x++) {
            for(int y=0; y<=x; y++) {
                System.out.print(arr[x][y]+"\t");
            }
            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
        }

 

posted @ 2017-07-04 21:22  wangw0107  阅读(425)  评论(0编辑  收藏  举报