java day03-day05 基础知识梳理

来源:互联网 发布:c语言中 ||是什么意思 编辑:程序博客网 时间:2024/05/18 18:47
一. java 三大流程控制

1. 顺序控制:依次执行代码。

2. 条件控制

 a. 目的 : 对程序执行,一些不可预知的流程,进行一个预先判断.
 b. 条件:    条件具有真假的特性。而且只可能为真,或者为假。
 c. java条件控制有四种手段:
              (1)if语句
                  结构:     if(表达式){
                               若干语句
                               }
             (2)if...else语句
                  结构:    if(表达式){
                              若干语句
                              }else{
                              若干语句
                               }
             注意:else后面之间跟的是{若干语句}
            (3)if(表达式)...else if(报答是)...(接N个)...else
             注意: a.else if(表达式): 条件的约束,和我们前面说的if(表达式),俩者是等价的.
                      b.else if 可以有很多个
                      c.else 可以省略掉的, 但是即使没有匹配所有条件,我们依然建议必须有else,来保证语句的完整和可                            读性.

           a. 目的 : 对程序执行,一些不可预知的流程,进行一个预先判断.
           b. 条件:    条件具有真假的特性。而且只可能为真,或者为假。
           c. java条件控制有四种手段:
              (1)if语句
                  结构:     if(表达式){
                               若干语句
                               }
             (2)if...else语句
                  结构:    if(表达式){
                              若干语句
                              }else{
                              若干语句
                               }
             注意:else后面之间跟的是{若干语句}
            (3)if(表达式)...else if(报答是)...(接N个)...else
             注意: a.else if(表达式): 条件的约束,和我们前面说的if(表达式),俩者是等价的.
                      b.else if 可以有很多个
                      c.else 可以省略掉的, 但是即使没有匹配所有条件,我们依然建议必须有else,来保证语句的完整和可                            读性.

                      d.如果满足条件只需要执行一行代码,{}也是可以省略的,但是不建议这么做.

                 例子:

                           

public class ClassTest1{public static void main(String[] args){int age = -1;if(age<0){System.out.println("非法年龄");}if(age>60){System.out.println("老年");}else if(age>=40 && age<=60){System.out.println("中年");}else if(age>18 && age <40){System.out.println("少年");}else{System.out.println("未成年");}}}
      (4)switch 开关语句

               结构:   switch(判断值){
                          case 值1:
                          break;
                          case 值2:
                          break;
                          .......
                         case 值n:
                         break;

                        default:
                       }

           注意: 条件控制语句彼此之间可以嵌套使用的.

          例子:

public class SwitchDemo{public static void main(String[] args){int turn = 10;switch(turn){default:System.out.println("100");break;case 1:case 2:case 3:System.out.println("800");break;case 4:case 5:System.out.println("500");break;}}}

3.循环控制

(1) while 循环

          结构:      while(循环条件){
                        //循环实现的代码

                         }

          例子:

public class WhileDemo{public static void main(String[] args){int maxNum = 10;int minNum = 11;while(minNum<=maxNum){System.out.println(minNum);minNum++; // minNum == 2}}}

(2) do .. while循环
          结构:     do{
                       //实现的代码

                        }while(循环的条件);

public class DoWhile{public static void main(String[] args){int maxNum = 10;int minNum = 11;//打印1到10之间的自然数do{System.out.println(minNum);minNum++;}while(minNum<=maxNum);}}

(3) for 循环(使用率最高的循环)
          结构:     for(循环变量初始化 ;循环条件判断; 循环变量的改变){

                       //循环需要实现的逻辑

                       }

           例子:

public class ForDemo1{public static void main(String[] args){int minNum = 1;final int MAX_NUM = 50;int sum = 0;for(int i=1;i<=MAX_NUM;i++){if(i%2 == 0){sum+=i;}}

(4) foreach 循环(不是一个常规的java提供的循环的方式,他只是java提供的一种语法糖)
          foreach: 对一种循环方式的命名,常规循环的简化方式. 
          语法糖: 针对基本的语法,提供了一种简化的实现方式.
补充:
两个关键字: 应用到循环控制中,continue的含义是跳出当次的循环,break的含义是跳出整个循环
continue:
在循环的代码体中,如果遇到continue, 则会跳出当次循环,循环体内continue之后的代码都不会执行,并且循环变量进行一次改变操作,
之后再次进行条件判断,如果满足条件,则进入循环,否则直接结束循环; 跳出的仅是continue外层直接包裹的循环.
break:
在循环的代码体中,如果遇到break,则会跳出本循环代码块,break后的代码不会执行。并且整个循环的过程结束。
break后退出的循环也是直接包围break的循环。

System.out.println("*"); //输出,会默认换行
System.out.print("*"); //输出,不会换行



二.数组

1.数组的定义:
   数组保存元素的类型 [] 数组变量的名称 = new 数组保存元素的类型[元素的数量];

2.数组元素的访问: 

   index(数组保存元素的索引) , 从0开始(length-1)

注意:

a.数组来说,如果初始化一个数组,但是并没有保存任何的值,那么数组中会存放一些默认的值:

byte,short,int,long: 0
float,double:0.0
boolean: false
char: ''

b.数组对象中有一个变量length,能够让我们拿到数组的长度.

例子:

public class ArrayDemo1{public static void main(String[] args){int [] arr = new int[3];for(int i=0;i<arr.length;i++){arr[i] = i;}for(int i=0;i<arr.length;i++){System.out.println(arr[i]);}}}
c.数组的长度一旦指定,长度将无法改变。

d.定义数组的时候指定的类型,数组始终只能保存该类型的元素。

3.数组维度:一维数组,多维数组

4.一维数组:

   (1)声明:类型[ ]数组变量名称;例如:int[ ] arr; 或int arr[ ];

   (2)初始化

             a.动态初始化:将定义一个数组和对数组进行赋值分开执行的操作;

             b.静态初始化:定义一个数组的同时,将数组初始化。

             new:用来初始化一个对象。

补充:数组对象中有一个变量length,能够让我们拿到数组的长度。

           数组名称.length      例如:arr.length

5.二维数组:

   (1)声明:类型[ ][ ]数组名称;例如 int [ ] [ ] arr;

   (2)初始化

            a.动态初始化   int[ ] [ ] arr=new int [ ] [ ];

            b.静态初始化 int[ ] [ ] arr={{1,2,3},{4,5,6}};

6.数组元素的访问:

    arr[index]:index表示数组元素的索引,注意索引是从0到length-1;

    arr[1]:访问第二个元素;

    index:可以是常量,也可以是表达式


选择排序:选择特定的数,之后进行交换

       算法:从左至右,依次比较当前的数和后面的数的大小关系,如果满足我们的排序条件,那么保持不变,否则,                   做一个交换操作。

选择排序:

public class Order{public static void main(String[] args){int[] arr = {3,4,1,7,4,4,9,1,2};for(int i=0;i<arr.length;i++){for(int j=i+1;j<arr.length;j++){if(arr[i]<arr[j]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for(int i=0;i<arr.length;i++){System.out.println(arr[i]);}}}
三.方法

1.定义:实现一个功能的代码片段的封装;

              [修饰符...]返回值类型 方法名称(形参的列表){

                        //方法中实现的逻辑

                }

2.形参列表:方法接收外部传入的数据的接收媒介。

                     当我们定义了一个方法之后,去调用方法的时候,一定要注意我们传递给方法的入参类型和数量,一定                        要一一对应。

3.返回值:方法执行结束之后,返回的值的类型。

                 如果方法不需要返回任何值,那么我们的方法返回类型写作void。

                 在方法里返回一个值,需要用到return。

唯一确定一个方法:

关注点:

a.方法名是否一致

b.形参列表的所有参数类型和数量是否一致。对于形参变量的命名,完全是没有关系的

c.返回值的类型:可以是基本类型,也可以是引用类型。

注意:
a.一旦明确指定了方法的返回类型(非void),那么一定要保证最终方法可以成功的返回我们对应的返回类型的数据.
b.关于void返回类型
如果我们不主动的添加return语句,在执行的时候,也会帮我们自动添加return.我们在实现void类型的方法的时候,主动添加一个return也是没有问题的。


方法参数的传递:
方法参数的传递来说,基本类型传递的是值。对于引用类型,传递的是引用.(传递的是地址)

package task;public class array3 {public static void main(String[] args){int a[][][]=new int[][][]{{{1,2,4},{5,4,6}},{{5,8,7},{2,3},{4,5,8}},{{2,6},{8,0}}};for(int i=0;i<a.length;i++){for(int j=0;j<a[i].length;j++){for(int k=0;k<a[i][j].length;k++){System.out.print(a[i][j][k]);}System.out.println("");}System.out.println("");}}}

四. 关于变量的作用域:
1.成员变量:类的属性
2.局部变量:方法中定义的变量或者是方法的形式参数。
   对于java语言来说,作用域控制是通过块来控制的.
   块的概念: 一对{} 包裹,该代码片段就称为 一块.
3.对于某个块内定义的变量:
  a.对于当前的块,不能再定义同名的变量,即使类型不同也不行。
  b.对于当前的块,定义了某个变量,在块外不能够访问到块中定义的变量
4.如果存在块的嵌套:
  那么外层块定义的变量,在内层块中是可以访问到的.



四.构造方法(构造器)

1.类中特殊的方法,对于定义来讲,它的方法名必须和类名一模一样,并且不返回任何的值,主要不能添加void.
2.在new(创建一个对象的时候),一定会去调用它的构造方法。 但是如果我们没有自己添加自己定义的构造器的话,编译器会帮我们添加一个默认的构造器:
  
  类名(){
  
  }
  
  如果我们主动添加一个默认的构造器,那么在创建对象的时候,通过new 类名(); 会调用我们自己添加的默认构造器.
  
3.当我们主动添加了一个包含参数列表的构造器,并且没有主动添加默认的构造器,则再通过new 类名(); 就会遇到编译问题.

例子:

public class Person{int age;boolean male;double height;double weight;Person(int ageParm,int maleParm,int heightParm,int weightParm){age = ageParm;male = maleParm;height = heightParm;weight = weightParm;}boolean getSex(){if(male){System.out.println("男孩");}else{System.out.println("女孩");}}public static void main(String[] args){Person green = new Person(20,false,150,50);test.getSex();}}



五. 方法重载 overload
 
1. 对于同名的方法,具有不相同的参数列表,我们在访问的时候,通过调用方法传入不同的参数列表,就可以找到我们特定的方法。
2. 当我们定义多个重载的方法的时候,在编译阶段的话,编译器可以根据我们方法形式参数数量以及类型来区别不同的方法,执行阶段可以根据我们调用的时候传入的参数列表, 仅仅拥有不同的返回值类型,是不被视为重载的。

例子:

public class ClassTest2{short[] arrShort;int sum;void ClassTest2(){System.out.println("ClassTest2 execute !");}ClassTest2(int a){arrShort = new short[]{2,3,4};for(int i=0;i<arrShort.length;i++){sum+=arrShort[i];}}int getArrPlusResult(int[] arr){int sumAll = 0;for(int i=0;i<arr.length;i++){sumAll+=arr[i];}return sumAll - sum;}long getArrPlusResult(long[] arr){long sumAll = 0;for(int i=0;i<arr.length;i++){sumAll+=arr[i];}return sumAll - sum;}public static void main(String[] args){ClassTest2 test = new ClassTest2(3);int sum1 = test.getArrPlusResult(new int[]{1,2,3});long sum2= test.getArrPlusResult(new long[]{1,2,3});test.ClassTest2();System.out.println("getArrPlusResult(int[] arr): result"+sum1);System.out.println("getArrPlusResult(int[] arr): result"+sum2);}}


六. 类的继承 子类继承或者说派生自父类。子类可以享有父类的方法。在初始化一个子类对象的时候,调用其中的方法,如果该方法中在父类也有定义, 并且参数列表不同,则调用到的是子类特有的方法。否则调用的是父类方法。 注意:如果仅仅是他们的返回值类型不同,则会出现编译错误。 例子:
public class People{String name ;String nationality;void eat(){System.out.println("people eat");}public static void main(String[] args){/*People green = new People();green.eat();Teacher wang = new Teacher();wang.eat();wang.teach();*/Student king = new Student();king.eat();king.study();}}class Student extends People{String name;String nationality;void study(){System.out.println("student study");}int eat(){System.out.println("Student eat:"+ a);return 0;}}class Teacher extends People{String name;String nationality;void teach(){System.out.println("teacher teach");}void eat(){System.out.println("teacher eat");}}

作业

1.考试成绩已经保存在数组scores中,依次为 89,23,64,91,119,52,73,-23
  要求根据通过自定义方法来找出其中前三名,将数组成绩作为参数传入
  要求判断成绩的有效性(0-100),如果成绩无效,则忽略此成绩.

package day03_05;public class Task1 {void fund(int[]scores){int x=0;for(int i=0;i<scores.length;i++){for(int j=i+1;j<scores.length;j++){if(scores[i]<scores[j]){int temp;temp=scores[i];scores[i]=scores[j];scores[j]=temp;}  }}for(int i=0;i<scores.length;i++){if(scores[i]>100||scores[i]<0){continue;}    x++;if(x>3){break;}System.out.println(scores[i]);}}public static void main(String[] args){Task1 a=new Task1();a.fund(new int[]{89,23,64,91,119,52,73,-23});}}



2. 用数组来实现, 定义并初始化一个(1--100)保存100个数的数组,从第一个元素开始,依次数(1,2,3 循环往复),每次数到到3的元素淘汰掉.当到达数组
末尾的时候再从头开始,直到最后剩余一个元素,写出算法,并输出最后保留的元素所在的最初的位置.
package day03_05;public class Task2 {int []arr=new int[100];void fund(){int count=0;int i=0;int circul=0;int outSub=0;System.out.println("每次被淘汰的元素所在的位置是:");while(count!=100){if(arr[i]!=-1){if(circul==2){count++;arr[i]=-1;circul=0;outSub=i;System.out.print(outSub);System.out.print(" ");}else{circul++;}}i++;if(i==100){i=0;}}System.out.println("");System.out.println("最后保留的元素所在的最初的位置是:"+outSub);}public static void main(String[] args){Task2 a=new Task2();a.fund();}}



3. 用数组来实现对于一个整形数组, 分别通过冒泡排序和 快速排序,实现对于任意一个数组进行由小到大的排列。
package day03_05;public class Task3 {/*public static void main(String[] args){ //冒泡排序int[]arr={2,6,8,4,9,7,0,1,3};for(int i=0;i<arr.length;i++){for(int j=i+1;j<arr.length;j++){if(arr[i]>arr[j]){int temp;temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}System.out.println(arr[i]);}}*/void fund(int []arr,int low,int high){
           //快速排序int key=arr[low];int l=low;int r=high;int temp;while(l<r){while(l<r&&arr[r]>=key){r--;}if(l<r&&arr[r]<key){temp=arr[r];arr[r]=arr[l];arr[l]=temp;l++;}while(l<r&&arr[l]<=key){l++;}if(l<r&&arr[l]>key){     temp=arr[r];    arr[r]=arr[l];    arr[l]=temp;    r--;}}if(l>low){fund(arr,low,l-1);}if(r<high){fund(arr,r+1,arr.length-1);}}public static void main(String[] args){Task3 a=new Task3();int []arr={2,6,8,4,9,7,0,1,3};a.fund(arr, 0, arr.length-1);for(int i=0;i<arr.length;i++){System.out.print(arr[i]);System.out.print(" ");}}}


4.判断101-200之间有多少个素数,并输出所有素数。
package day03_05;public class Task4 {void fund(){int y=0;for(int i=101, x=0;i<=200;i++){for(int j=1;j<=i;j++){if(i%j==0){x++;}}if(x<3){System.out.print(i);System.out.print(" ");y++;}x=0;}System.out.println("");System.out.println("101-200之间的素数的个数为:"+y);}public static void main(String[] args){Task4 a=new Task4();System.out.println("101-200之间所有的素数为:");a.fund();}}



5.题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package day03_05;import java.util.Scanner;public class Task5 {public static void main(String[] args){Scanner sc=new Scanner(System.in);System.out.println("请输入一行字符:");String string=sc.nextLine();int letter=0,blank=0,figure=0,other=0;char str[]=string.toCharArray();for(int i=0;i<str.length;i++){if(Character.isDigit(str[i])){figure++;}else if(Character.isLetter(str[i])){letter++;}else if(Character.isSpace(str[i])){blank++;}else{other++;}}System.out.println("数字的个数是:"+figure);System.out.println("英文字母的个数是:"+letter);System.out.println("空格的个数是:"+blank);System.out.println("其它字符的个数是:"+other);}}


6.题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,
高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,
高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润,求应发放奖金总数?
package day03_05;import java.util.Scanner;public class Task6 {public static void main(String[] args){Scanner sc=new Scanner(System.in);System.out.println("请输入这个月的利润多少万:");float I=sc.nextFloat();double i=I/10;int a=(int)i;double money;if(I<0){a=-1;}switch(a){case -1:System.out.println("亏本了哦!");break;case 0: money=I*0.1;System.out.println("发放奖金总数为:"+money+"万");break;case 1: money=(I-10)*0.075+1;System.out.println("发放奖金总数为:"+money+"万");break;case 2: case 3:money=(I-20)*0.05+1+0.75;System.out.println("发放奖金总数为:"+money+"万");break;case 4:case 5:money=(I-40)*0.03+1+1+0.75;System.out.println("发放奖金总数为:"+money+"万");break;case 6:case 7:case 8:case 9:money=(I-60)*0.015+20*0.03+1+1+0.75;System.out.println("发放奖金总数为:"+money+"万");break;default:money=(I-100)*0.01+40*0.015+0.6+1+1+0.75;System.out.println("发放奖金总数为:"+money+"万");break;}}}



7.分别定义用户类,订单类,产品类,其中订单类至少要具有下订单的行为(入参为一个产品名称),
  产品类中至少有一个成员变量为产品名称,至少有一个方法用来获取产品的名称。
  用户类中持有一个产品类型的成员变量。
  用户类中持有一个订单类型的成员变量。
  
  在我们的用户类中定义main函数,当执行的时候,构造一个用户类的对象,
  并且通过手段可以拿到产品成员变量中的产品名称,并且调用成员变量订单的对象,进行下单。
  最后输出下单成功。

package day03_05;import java.util.Scanner;public class User extends Order{void payOrder(){int payNum;System.out.println("确认支付您的订单吗? 输入1:确认;输入2:取消;");Scanner sc=new Scanner(System.in);payNum=sc.nextInt();if(payNum==1){System.out.println("支付成功!");}else if(payNum==2){System.out.println("取消支付!");}else{System.out.println("非法输入!");}}public static void main(String[] args){Product pro=new Product();Order ord=new Order();User wang=new User();pro.setProduct();pro.getProduct();ord.placeOrder(pro.productName);wang.payOrder();}}class Order{void placeOrder(String productName){int inputNum;System.out.println("确认购买您输入的商品"+"["+productName+"]"+"吗?  输入1:确认;输入2:取消;");Scanner sc=new Scanner(System.in);inputNum=sc.nextInt();if(inputNum==1){System.out.println("下单成功!");}else if(inputNum==2){System.out.println("取消下单!");}else{System.out.println("非法输入!");}}}class Product{String productName;int productNumber;void setProduct(){Scanner sc=new Scanner(System.in);System.out.println("请输入您要购买的商品的名称:");productName=sc.nextLine();System.out.println("请输入您要购买的商品的数量:");productNumber=sc.nextInt();}void getProduct(){System.out.println("您要购买的商品是:"+productName);System.out.println("您要购买的商品的数量是:"+productNumber);}}

  














                




 

原创粉丝点击