package com.momo.demo;
public class Main {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[0] = 55; arr[2] = 66; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int[] arr2 = new int[3]; System.out.println(arr2); System.out.println(arr2[0]); System.out.println(arr2[1]); System.out.println(arr2[2]); //2个变量指向堆中同一个区域 int[] arr3 = arr; System.out.println(arr3); System.out.println(arr3[0]); System.out.println(arr3[1]); System.out.println(arr3[2]); System.out.println("----------------"); arr3[0] = 6666; arr3[1] = 444; System.out.println(arr3[0]); System.out.println(arr3[1]); System.out.println(arr3[2]); System.out.println("------------"); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); }
}
1,数组的静态初始化
-格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...}
int[] arr = new int[]{12,3,4}
-简化:
数据类型[] 数组名 = {元素1,元素2,...}
int[] arr = {12,3,4}
package com.momo.demo;
public class Demo1 {
public static void main(String[] args) {
// int[] arr = new int[3]{12,3,4};java: 同时使用维表达式和初始化创建数组是非法的
// int[] arr = new int[]{12,3,4};
int[] arr = {12,3,4}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); }
}
2,数组常见的2个问题
-空指针异常
数组已经不在指向堆内存了,还去访问堆内存中的元素
-索引越界异常
访问了不存在的索引
-要求:以后把自己遇到的所有异常都记录下来并分析
出现的原因,现象,解决方式
package com.momo.demo;
public class Demo2 {
public static void main(String[] args) {
int[] arr = {2,3,4};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//ArrayIndexOutOfBoundsException 索引越界异常
// System.out.println(arr[3]);
arr = null; System.out.println(arr); //System.out.println(arr[0]);NullPointerException 空指针异常 }
}
3,数组的常见操作
-数组遍历:依次输出数组中每一个元素
package com.momo.demo;
public class Demo3 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
/System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[3]);System.out.println(arr[4]);/
//数组中有个属性length,可以获取数组长度 /* for (int i = 0; i < 5; i++) { System.out.println(arr[i]); }*/ /* for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }*/ System.out.println("---------------------"); int[] arr2 = {12,22,43,54,75}; /* for (int i = 0; i < arr2.length; i++) { System.out.println(arr2[i]); }*/ //如果有很多数组要遍历,只是数组名变化了,说明了这个代码是一个完成特定功能的代码,应该用方法来封装 printArray(arr); System.out.println("----------------"); printArray(arr2); } /* * 遍历数组的方法 * 返回值类型: * void * 参数列表: * 要遍历的数组 * */
/* public static void printArray(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}*/
//带格式
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1){
System.out.println(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}
}
-获取最值
package com.momo.demo;
/*
- 思路:
- 先拿任意一个作为参照,(一般第一个)假装是最大的
- 依次和后面的所有元素比较
- 大的留下继续比较
- 小的直接走开
- 最后留下的就是最大的
- */
public class Demo4 {
public static void main(String[] args) {
int[] arr = {12,4,11,67,2,879,22,34,234545,2232,3,23,3435,67,989,6654};
/int max = arr[0];for (int i = 1; i < arr.length; i++) {if(arr[i]>max){max = arr[i];}}/
int max = getMax(arr);
System.out.println(max);
}
/*
- 获取最大值的方法
- 返回值类型: int
- 参数列表:int[] arr
- */
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
max = arr[i];
}
}
return max;
}
}
-元素逆序
package com.momo.demo;
/*
- 第一个和最后一个交换位置 arr[0] , arr[arr.length-1-0]
- 第二个和倒数第二个交换 arr[1] , arr[arr.length-1-1]
- ...
- 交换到中间位置 arr.length/2
- */
public class Demo5 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
System.out.println("逆序前:");
printArray(arr);
reverse(arr);
System.out.println("逆序后:");
printArray(arr);
}
/* public static void reverse(int[] arr){
for (int i = 0; i < arr.length/2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}*/
public static void reverse(int[] arr){
for (int i=0,j=arr.length-1;i
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1){
System.out.println(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}
}
-数组元素查找(查找指定元素第一次出现的索引)
注意:不存在的时候返回一个负数 一般返回-1即可
-根据索引获取元素
注意:索引越界
-冒泡排序
-选择排序
-二分查找
一,二维数组
1,元素是一维数组的数组(一条烟)
2,格式
-数据类型[][] 数组名 = new 数据类型[x][y];
-数据类型[] 数组名[] = new 数据类型[x][y];
-数据类型 数组名[][] = new 数据类型[x][y];
x表示二维数组中有多少个一维数组
y表示每一个一位数组中的元素个数
int[][] arr = new int[3][2];
package com.momo.demo;
public class Demo6 {
public static void main(String[] args) {
int[][] arr = new int[3][2];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][0]); System.out.println(arr[0][1]); int[] a; int[] b[]; int[] x,y[]; x = new int[2]; System.out.println(x); y = new int[2][3]; System.out.println(y); }
}
-数据类型[][] 数组名 = new 数据类型[x][];
int[][] arr = new int[3][];
package com.momo.demo;
public class Demo7 {
public static void main(String[] args) {
int[][] arr = new int[3][];
System.out.println(arr);
/* System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[0][0]); System.out.println(arr[0][1]);*/ arr[0] = new int[3]; arr[1] = new int[2]; arr[2] = new int[55]; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[0][0]); System.out.println(arr[0][1]); }
}
-数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2,...},{元素,...},...};
int[][] arr = new int[][]{{1},{2,3,4},{3,4}}
简化:
数据类型[][] 数组名 = {{元素1,元素2,...},{元素,...},...};
int[][] arr = {{1},{2,3,4},{3,4}}
package com.momo.demo;
public class Demo8 {
public static void main(String[] args) {
int[][] arr = {{1},{2,3,4},{3,4}};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][0]); //System.out.println(arr[0][1]); }
}
3,常见操作
-遍历:依次输出二维数组中每一个一维数组中的每一个元素
格式:[[1],[2,3,4],[3,4]]
package com.momo.demo;
public class Demo9 {
public static void main(String[] args) {
int[][] arr = {{1},{2,3,4},{3,4}};
print2Array(arr);
}
public static void print2Array(int[][] arr){ System.out.print("["); for (int i = 0; i < arr.length; i++) { if(i==arr.length-1){ System.out.print("["); for (int j = 0; j < arr[i].length; j++) { if(j==arr[i].length-1){ System.out.print(arr[i][j]+"]"); }else{ System.out.print(arr[i][j]+","); } } System.out.println("]"); }else{ System.out.print("["); for (int j = 0; j < arr[i].length; j++) { if(j==arr[i].length-1){ System.out.print(arr[i][j]+"]"); }else{ System.out.print(arr[i][j]+","); } } System.out.print(","); } } }
}
-二维数组求和
-通过键盘输入行数,打印杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
....
package com.momo.demo;
import java.util.Scanner;
/*
- 分析:
- 每一行的第一个和最后一个都是1
- 从第三行开始,除了第一个和最后一个之外,其余的值都是它上一行前一列和上一行本列值之和
- 是由多行多列组成的,看成是一个二维数组,先定义一个二维数组
- 行数是键盘输入的l,我们先把列数也看成l
- int[][] arr = new int[l][l];
- 给每一行的第一个和最后一个赋值1
- 在按照第二个规律给其他列赋值
- 最后输出的时候按照九九乘法表的方式输出
- */
public class Demo10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入行数:");
int l = sc.nextInt();
int[][] arr = new int[l][l]; for (int i = 0; i < arr.length; i++) { arr[i][0] = 1; arr[i][i] = 1; } for (int i = 2; i < arr.length; i++) { for (int j = 1; j < arr[i].length-1; j++) { arr[i][j] = arr[i-1][j-1]+arr[i-1][j]; } } for (int i = 0; i < arr.length; i++) { for (int j = 0; j <= i; j++) { System.out.print(arr[i][j]+"\t"); } System.out.println(); }
}
}
package com.momo.demo;
/*
- 参数传递问题:
- 基本类型:形参的改变不影响实际参数
- 引用类型:形参的改变直接影响实际参数
- */
public class Demo11 {
public static void main(String[] args) {
int a = 5;
int b = 6;
System.out.println("a="+a+",b="+b);//5,6
change(a,b);
System.out.println("a="+a+",b="+b);//5,6
System.out.println("--------------------");
int[] arr = {1,2,3,4,5,6}; System.out.println(arr[3]);//4 change(arr); System.out.println(arr[3]);//8
}
public static void change(int[] arr) {
for (int i = 0; i < arr.length; i++) {
if(arr[i]%2==0){
arr[i] *= 2;
}
}
System.out.println(arr[3]);//8
}
public static void change(int a, int b) {
a = b;
b = a+b;
System.out.println("a="+a+",b="+b);//6,12
}
}
-练习:使用公用电话传递密码(是一个不大于8位的整数)
为了保证安全,在传递的过程中采用加密,规则如下:
先把数据倒序
然后给每位上的数字加5
在用除以10的余数代替该数字
最后把第一位和最后一位数字交换位置
编写代码实现输入任意一个不大于于8位的整数,把加密后的结果输出到
控制台上。
经过简单分析,如果能把键盘输入的整数变成一个数组,其实就没有难度了
二,面向对象思想
1,我们早上讲解数组常见操作的时候,写了多个方法,随着需求越来越多
我们写的方法也就会越来越多,将来要在多个方法中找方法的时候,就变得
困难了。于是我们就要想办法,降低这个困难,通过前面学习,我们知道类中
可以存放方法,所以我们就可以用不同的类来封装不同类型的方法。
把功能类似的方法封装到一个类中(把操作数组的封装到一个类中,把操作字符串的
方法封装到另一个类中,。。。。) 这样以后我们在想操作数组的时候,
我们就不需要找具体的方法了,我们只需要找到那个封装了数组操作的类,
然后调用方法即可操作--这就是面向对象思想的编程方式
-就是把方法进行分类存储,将来就不需要找具体的方法了,只需要找到对应的类
2,面向对象之前有面向过程:
-面向过程:强调的是每一个步骤
我们之前写的代码都是面向过程的做法,我们现有一个需求
然后分析需求,根据分析出来的步骤我们自己一步步实现。每一步都是我们
自己做的,这就是面向过程的具体体现。
代表语言C语言,是面型对象的基础
-面向对象是基于面向过程的
-面向对象:强调的是对象
3,面向对象思想特点
-把复杂的事情简单化了
-从执行者变成了指挥者
4,代码举例
package com.momo.demo;
/*
- 爸爸给孩子喂奶
- 面向过程:
冲奶
喝奶
洗奶瓶
- /
public class Demo12 {public static void main(String[] args) {/
* 明白:现在只是为了举例子,用一个输出语句表示一个功能,实际一个功能可能需要几百行代码才能完成
* //
System.out.println("冲奶");
System.out.println("喝奶");
System.out.println("洗奶瓶");
//第2次 System.out.println("冲奶"); System.out.println("喝奶"); System.out.println("洗奶瓶"); //第3次 System.out.println("冲奶"); System.out.println("喝奶"); System.out.println("洗奶瓶"); //....*/ /* * 用方法封装一下每一个功能 * */ //1 chongnai(); henai(); xinaiping(); System.out.println("---------------"); //2 chongnai(); henai(); xinaiping();
}
public static void chongnai(){
System.out.println("冲奶");
}
public static void henai(){
System.out.println("喝奶");
}
public static void xinaiping(){
System.out.println("洗奶瓶");
}
}
package com.momo.demo;
/*
- 爸爸给孩子喂奶
- 面向对象:
有哪些对象
- 爸爸类:冲奶,洗奶瓶
- 孩子类:喝奶
- 测试类:main
- */
public class Demo13 {
public static void main(String[] args) {
//1
//调用爸爸的冲奶
//调用孩子的喝奶
//调用爸爸的洗奶瓶
}
}
class Baba{
public static void chongnai(){
System.out.println("冲奶");
}
public static void xinaiping(){
System.out.println("洗奶瓶");
}
}
class Haizi{
public static void henai(){
System.out.println("喝奶");
}
}
5,面向对象开发,设计和特征
-开发:不断的创建对象,使用对象,指挥对象做事强
-设计:就是管理和维护多个对象之间的关系
-特征:
封装
继承
多态
6,类和对象的关系
-编程是为了模拟现实,实现信息化(超市的计费系统)
-如何表示一个现实世界的事务?
属性:描述信息
行为:功能
-学生:
属性:学号,姓名,出生日期,性别...
行为:学习,吃饭,睡觉,谈恋爱...
-我们学习的java基本单位是类, 我们要用类来描述事物
类中有:
成员变量:属性
和之前定义变量的格式一样,只不过现在放到类中方法外
成员方法:行为
和之前定义的方法一样,现在把static去掉即可
-学生类:
成员变量:学号,姓名,出生日期,性别...
成员方法:学习,吃饭,睡觉,谈恋爱...
-类:是一组相关属性和行为的集合,是一个抽象概念
-对象:是该类事物中的具体个体
学生类:
张三
李四
汽车图纸
具体汽车
package com.momo.entity;
/*
- 学生类
- */
public class Student {
//成员变量
int id;
String name;
int age;
//成员方法
public void study(){
System.out.println("好好学习,向钱看,向厚赚。");
}
public void sleep(){
System.out.println("学生要休息");
}
}
-创建对象来使用
格式:类名 对象名 = new 类名();
对象名.成员变量
对象名.成员方法(...)
package com.momo.demo;
import com.momo.entity.Student;
public class Demo14 {
public static void main(String[] args) {
Student stu = new Student();
stu.id = 11;
stu.name = "张三";
stu.age = 18;
System.out.println(stu.id);
System.out.println(stu.name);
System.out.println(stu.age);
stu.study(); stu.sleep(); }
}
package com.momo.demo;
/*
- 假设在一个文件中写多个类,注意文件名和测试类名保持一致
- */
public class Demo15 {
public static void main(String[] args) {
Phone h1 = new Phone();
System.out.println(h1);
h1.brand = "华为";
h1.color = "中国红";
h1.price = 9999;
System.out.println(h1.brand+","+h1.color+","+h1.price);
h1.call("大大"); h1.send(); System.out.println("---------------"); Phone h2 = new Phone(); System.out.println(h2); h2.brand = "三星"; h2.color = "黑色"; h2.price = 999; System.out.println(h2.brand+","+h2.color+","+h2.price); h2.call("大大"); h2.send(); System.out.println("------------------"); Phone h3 = h1; System.out.println(h3); System.out.println(h3.brand+","+h3.color+","+h3.price); h3.brand = "小米"; h3.color = "黑色"; h3.price = 666; System.out.println(h3.brand+","+h3.color+","+h3.price); System.out.println(h1.brand+","+h1.color+","+h1.price);
}
}
//手机类
class Phone{
String brand;
String color;
int price;
public void call(String name){ System.out.println("给"+name+"打电话"); } public void send(){ System.out.println("发信息"); }
}
7,成员变量和局部变量的区别
-类中位置不同
成员变量:在类中方法外
局部变量:在方法内
-内存位置不同
成员变量:堆
局部变量:栈
-生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的消失而消失
-初始值不同
成员变量:有默认值
局部变量:没有默认值
-注意:
成员变量名称和局部变量名称可以一样,在方法中使用的时候采用就近原则
package com.momo.demo;
public class Demo16 {
public static void main(String[] args) {
MyVariable m = new MyVariable();
m.show();
System.out.println(m.i);//成员变量
}
}
class MyVariable{
int i = 5;
// int j = 7;
public void show(){
int i = 6;
System.out.println(i);
// System.out.println(j);
}
}
8,参数问题
-一个方法的形式参数是类类型(引用类型),
实际上调用方法的时候要传递的是该类的具体对象
package com.momo.demo;
public class Demo17 {
public static void main(String[] args) {
//调用Stu中的show方法
/Stu s = new Stu();s.show();/
//调用StuDemo中的method方法
StuDemo sd = new StuDemo();
//int a = 5;
Stu s = new Stu();//地址值
sd.method(s);
}
}
class Stu{
public void show(){
System.out.println("我是学生,我爱学习。。");
}
}
class StuDemo{
/*
* 如果你看到一个方法的形式参数是类类型(引用类型),实际上调用方法的时候
* 要传递的是该类的具体对象
* */
public void method(Stu s){
//Stu s = new Stu(); 地址值
//只有具体对象才能调用方法
s.show();
}
}
9,匿名对象
-就是没有名字的对象,是对象的简化表示形式
new Stu()
-作用:
可以当作实参传递
当方法仅仅需要调用一次的时候
好处:使用完成之后会立刻变成垃圾
需要调用多次的时候不建议使用
public class Demo17 {
public static void main(String[] args) {
//调用Stu中的show方法
/Stu s = new Stu();s.show();/
//调用StuDemo中的method方法
//StuDemo sd = new StuDemo();
//int a = 5;
/* Stu s = new Stu();//地址值
sd.method(s);*/
//sd.method(new Stu()); Stu s = new Stu(); s.show(); s.show(); s.show(); System.out.println("--------------"); new Stu().show(); new Stu().show(); new Stu().show(); }
}
标签:arr,java,int,System,面向对象,数组,println,public,out From: https://blog.51cto.com/u_16230968/7240081