键盘录入一个数据n(1-9之间):输出对应的NN乘法表
//导包
import java.util.Scanner;
class FunctionTest3{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收数据
System.out.println("请输入行数:");
int m = sc.nextInt() ;
System.out.println("请输入列数:");
int n = sc.nextInt() ;
//单独调用
printStar(m,n) ;
System.out.println("-------------------------") ;
System.out.println("请输入一个数据num(1-9之间): ") ;
int num = sc.nextInt() ;//实际参数
printNN(num) ;
}
/*
nn乘法表
定义方法
明确返回值类型:没有具体返回值void代替
参数类型以及参数个数
int 1个参数
*/
public static void printNN(int n){//形参
for(int x = 1; x <= n ; x ++){
for(int y = 1 ; y <= x ; y++){
System.out.print(y+"*"+x+"="+(y*x)+"\t") ;
}
System.out.println() ;
}
}
/*
定义一个方法:
1)明确返回值类型:没有具体返回值类型,使用void代替
2)明确参数类型和参数个数:
int 2个参数
*/
public static void printStar(int m,int n){
for(int x = 0 ; x < m ; x ++){
for(int y = 0 ; y < n ; y ++){
System.out.print("*");
}
System.out.println() ;
}
}
}
1)数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
2)数组既可以存储基本数据类型,也可以存储引用数据类型。
数组的定义格式:
格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
注意:针对数组定义两种格式,推荐使用第一种格式。因为第一种的可读性更强。第二种可以早期的时候确实有很多人这样用。不过,现在这样用的人越来越少了。作为Java的粉丝C#(Java的模仿者)就不再支持第二种语法格式了。越来越多的语言可能会抛弃第二种格式。
数组的初始化方式:
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
举例:
int[] arr = new int[]{1,2,3};
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
其实这种写法还有一个简化的写法—>int[] arr = {1,2,3};
数组中常见的小问题:
1)数组索引越界
ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生。
出现的原因:
访问了数组中不存在的角标值
解决方案:
更改角标在范围内即可!
2)空指针异常
NullPointerException
数组引用没有指向实体,却在操作实体中的元素时
出现的原因:
代码结构不严谨(某个对象已经为null,还有使用这个对象调用方法或者访问元素…)
解决方案:
只要 给对该对象进行非空判断
如果该对象不为空,才能使用这个对象完成一些操作!
为什么要记住这些小问题?
因为写程序不仅仅是把代码写出来,还包括出现问题后要能够及时的把问题解决。而排错也应该是我们的基本功。所以,我们也应该记住一些常见的问题,以及出错原因和解决方案。
数组中有没有length属性,字符串有没有length属性,集合中有没有?
答:数组中存在length属性。
字符串没有length属性—>String类中:length()
集合没有length属性—>集合中:size()
遍历:就是将元素的内容一一输出出来!
class ArrayTest{
public static void main(String[] args){
//定义一个数组,静态初始化
int[] arr = {57,69,80,13,22} ;
printArray2(arr) ;
}
//最终版代码:遍历数组
public static void printArray2(int[] array){
//拼接左中括号
System.out.print("{") ;
//遍历array数组
for(int x = 0 ; x < array.length; x ++){//x角标
//获取到每一个元素
//判断:如果x取到最大索引值,---->取到最后一个元素了
if(x==array.length-1){
//最后一个元素,输出元素内容以及右中括号
System.out.println(array[x]+"}") ;
}else{
//不是取到最大索引值,将中间的元素按照按照格式输出(元素+逗号+空格)
System.out.print(array[x]+", ") ;
}
}
}
}
两两比较,大的值往后放,第一次比完最大值就出现在最大索引处,依次比较,可以得到一个排好序的数组。
比较次数:数组长度-1—>length-1
代码如下:
class Test5{
public static void main(String[] args){
int[] arr={12,54,66,21,36};
printArray(arr);
maoPao(arr);
printArray(arr);
}
public static void printArray(int[] arr){
System.out.print("[");
for(int x=0;x<arr.length;x++){
if(x==arr.length-1){
System.out.println(arr[x]+"]");
}else{
System.out.print(arr[x]+", ");
}
}
}
public static void maoPao(int[] arr){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}
二维数组:
其实就是一个元素为一维数组的数组
定义格式:
数据类型[] 数组名称[] ;
数据类型[][] 数组名称 ;
动态初始化:
二维数组的格式1:
数据类型[][] 数组名称 = new 数据类型[m][n] ;
举例:
int[][] arr = new int[3][2] ;
=号左边:
int:当前数组存储的是int类型的元素
[][]:定义的是一个二维数组
arr :数组对象名称
=号右边:
new :在堆内存中创建该数组的对象(产生堆内存空间地址)
int:当前数组存储的是int类型的元素
[3]:当前定义的这个二维数组中有3个一维数组
[2]:每一个一维数组中有2个长度
注意:
在一些笔试题:定义变量 进行初始化
int x, y ; x 和y是两个int类型的变量
int x [],y[] ;x和y都是int类型的数组
int x[][],y[] ; x是一个二维数组,y是一个一维数组
二维数组的格式2:
指定了一维数组的个数,一维数组的长度需要动态给定
数据类型[][] 数组名称 = new 数据类型[m][] ;
举例:
int[][] arr = new int[3][] ;
二维数组的格式3:
就是静态初始化
数据类型[][] 数组名称 =
new 数据类型[][]{{元素1,元素2,元素3…},{元素1,元素2,元素3,…},{,}};
简写格式:
数据类型 [][] 数组名称 = {{元素1,元素2,元素3…},{元素1,元素2,元素3,…},{,}};
举例:
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}} ;
—>简写格式 int[][] arr = {{1,2,3},{4,5,6},{7,8,9}} ;
需求看以下代码计算结果:
class ArgsDemo{
public static void main(String[] args){
//定义两个变量
int a = 10 ;
int b = 20 ;
System.out.println("a:"+a+",b:"+b) ;
change(a,b) ;
System.out.println("a:"+a+",b:"+b) ;
int[] arr = {1,2,3,4,5} ;
change(arr) ;
System.out.println(arr[1]) ;
}
//形式参数是两个数据类型数据
public static void change(int a,int b){ //实际参数赋值给形式参数
System.out.println("a:"+a+",b:"+b) ;
a = b ;
b = a +b ;
System.out.println("a:"+a+",b:"+b) ;
}
public static void change(int[] arr){
//遍历
for(int x = 0 ; x < arr.length ; x ++){
if(arr[x]%2 ==0){
arr[x] *= 2 ;
}
}
}
}
结果如下:
**结论:**形式参数如果是基本数据类型,形式参数的改变不会影响实际参数。
方法的形式参数如果是引用类型(数组,类,接口),形式参数的改变会直接影响实际参数。
特别注意,String是特殊的引用类型,如果作为形参,不会影响实际参数。
基于面向过程的一种思想!
面向过程: 代表C语言,强调一个功能的步骤
面向对象: 代表Java语言,强调对象的创建,使用对象调用功能! (用到了键盘录入Scanner类)
面向对象的三大特征:封装,继承,多态!
面向对象设计原则:不断创建对象,使用对象,指挥该对象做事情!
面向对象的思想特点:
1)更符合生活中的思想行为习惯
2)让复杂的事情简单化
3)让我们成从执行者变成了一个指挥者!
Scanner:键盘录入---->录入int类型数据/String类型数据
比如把大象装进冰箱:
面向过程:强调功能的步骤
Demo类
class Demo{
public static void main(String[] args){
//调用打开冰箱门的功能
open() ;
//调用in功能
in();
//关闭冰箱门的功能
close();
}
//定义一个冰箱打开的功能
public static void open(){
System.out.println("打开冰箱门") ;
}
//定义一个大象进去的功能
public static void in(){
System.out.println("将大象装进去") ;
}
//定义一个冰箱关闭的功能
public static void close(){
System.out.println("关闭冰箱门") ;
}
...
}
面向对象: 创建对象,使用对象调用功能
伪代码
"把大象装进冰箱" 使用名词提取法---- 大象 冰箱
Demo类 :测试(main方法测试)
大象类
冰箱类
class Demo{
public static void main(String[] args){
冰箱类的对象.open() ;
大象类的对象.in() ;
冰箱类的对象.close() ;
}
}
class 冰箱类{
public static void open(){
System.out.println("打开冰箱门") ;
}
public static void close(){
System.out.println("关闭冰箱门") ;
}
}
class 大象类{
public static void in(){
System.out.println("将大象装进去) ;
}
}
事物:描述现实世界的真实存在泛指的东西!
类:是描述一组事物的属性和行为的集合,是Java语言的最基本的单元