我们先通过一个案例来复习上一节的二维数组
案例:二维数组交换位置
有一个二维数组:
int[][] array={ {11,23,44,55},{15,26,37,48}, {37,58,69,89},{44,56,68,78} };
每一秒都会发生如下变化:array [ 0 ] 先放到array [ 3 ] 后面,然后整体向前移动,即
array[0]=array[1],array[1]=array[2],array[2]=array[3],
示例:第一秒:{ {15,26,37,48},{37,58,69,89},{44,56,68,78},{11,23,44,55} } ;
第二秒:{ {37,58,69,89} , {44,56,68,78} , {11,23,44,55} ,{15,26,37,48} } ;
代码如下:
class DoubleArrayExchangeTwo{
public static void main(String[] args){
int[][] array={ {11,23,44,55},{15,26,37,48}, {37,58,69,89},{44,56,68,78} };
Scanner scn=new Scanner(System.in);
System.out.print("请输入换位的周数:");
int week=scn.nextInt();
for(int a=1;a<=week;a++){
int[] x=array[0];
array[0]=array[1];
array[1]=array[2];
array[2]=array[3];
array[3]=x;
}
for(int[] a:array){
for(int b:a){
System.out.print(b+"\t");
}
System.out.println(" ");
}
}
}
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=14796:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\baciccode\out\production\baciccode Maycode.DoubleArrayExchangeTwo
请输入换位的周数:3
44 56 68 78
11 23 44 55
15 26 37 48
37 58 69 89
进程已结束,退出代码0
一:面向对象思想
我们以 “ 将大象装进冰箱共有几步 ” 为例 ,来深刻感知两种不同的思想:
面向过程:
第一步:打开冰箱门 第二步:把大象放进去 第三步:关上冰箱门
侧重过程,容易理解,但代码的复用性很低,即如果将大象换成狮子/老虎,得重新编写代码,原先 “ 将大象放进冰箱 ” 的代码不可用;
面向对象:
侧重谁,干了什么事情,比如:这件事情共涉及 大象,人,冰箱
大象:大,重; 人:开门,关门 冰箱:有门,有容积
于是当我们将对象改为 狮子/老虎 时,只需要将大象的 特点(属性)更改就行 ,提高了代码的复用性,我们后来会学到 接口 ,类等等,这是基于这个思想 ;
类:
具有相同特征和行为的事物的统称,比如人类,鸟类,动物类,是个抽象的,较为宽泛的称呼;
对象:
类的具体表现,比如人类中有一个名叫 ‘’ achieve ‘’ 的人,动物类中有一个叫做 ” god “ 的大黄狗;
在Java中,我们先创建一个类,描述它的特征(属性),再创建类的具体对象,通过对象调用类的属性:
二:代码演示
下面我们来创见一个人类,描述它的属性:名字,年龄,性别;
再创建一个对象:man ,;
最后通过 mam 这个对象来调用人类的属性 ;
(1)定义一个类:
public class ClassPeopele {
public String name;
public String sex;
public int age;
}
(2) 定义一个对象并且调用类:
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
}
}
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=5920:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
刘备备 18 男
进程已结束,退出代码0
(3)对象有默认值
与创建的数组有默认值相同(在堆内存开辟的数值都有默认值);
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
}
}
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=5746:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
null 0 null
进程已结束,退出代码0
(4)定义多个对象来调用类的属性:
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
ClassPeopele p2=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
p2.name="吕小布";
p2.sex="女";
p2.age=19;
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
System.out.println(p2.name+"\t"+p2.age+"\t"+p2.sex);
}
}
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=6534:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
刘备备 18 男
吕小布 19 女
进程已结束,退出代码0
(5)当然,我们也可以试着想一下;
int a = 1 ; int b = a ; 结果 b = 1 ;
int [ ] array = { 11,13,45 } ; int[ ] array2 = array ; 结果 array2 [ ] = { 11,13,45 } ;
那么我们如下做呢:
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
ClassPeopele p2=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
//p2.name="吕小布";
//p2.sex="女";
//p2.age=19;
p2=p;
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
System.out.println(p2.name+"\t"+p2.age+"\t"+p2.sex);
}
}
输出结果如下:
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=6974:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
刘备备 18 男
刘备备 18 男
进程已结束,退出代码0
(6)再对 新的对象 进行赋值呢
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
ClassPeopele p2=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
//p2.name="吕小布";
//p2.sex="女";
//p2.age=19;
p2=p;
p2.sex="男";
p2.age=16;
p2.name="牛爷爷";
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
System.out.println(p2.name+"\t"+p2.age+"\t"+p2.sex);
}
}
结果如下:
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=9591:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
牛爷爷 16 男
牛爷爷 16 男
进程已结束,退出代码0
三:内层原理
我们首先以这个为例进行讲解其底层实现:
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
}
}
(1) 基础原理
首先,源文件存储在电脑硬盘中,经Java编译器编译之后形成的字节码文件也会存储在硬盘中,运行时,JVM会在内存条开辟一部分空间运行程序,开辟的空间中又划分为栈内存,堆内存,存储区。其中,存储区又划分为 常量池(储存常量,如需使用,复制即可),方法区(由字节码文件中的类通过 类加载器 映射而成,相当于模板,供开辟堆内存时参考),静态区;
在 main 方法中,执行 ClassPeople p = new ClassPeople ( ) 时 ;等号左边是在栈内存开辟一个 ClassPeoplel 的空间 ,命名为 p ,里面存储堆内存中开辟的对象的地址,右半部分是在堆内存开辟一个 ClassPeople的空间(但凡是出现关键字 new 一定是在堆内存开辟空间的), 参考方法区形成 name , age , sex 三个属性。
p.name = “ 刘备备 ” ;栈内存中的 p 通过地址找到 堆内存 中的 name 进行赋值;其余同理;
(2) 定义多个对象
和(1)的原理相同:
public class ClassPeopleDemo {
public static void main(String[] args){
ClassPeopele p=new ClassPeopele();
ClassPeopele p2=new ClassPeopele();
p.name="刘备备";
p.sex="男";
p.age=18;
p2.name="吕小布";
p2.sex="女";
p2.age=19;
System.out.println(p.name+"\t"+p.age+"\t"+p.sex);
System.out.println(p2.name+"\t"+p2.age+"\t"+p2.sex);
}
}
(3)对象之间赋值
ClassPeople p2 右半部分没有 new ClassPeople , 堆内存中根本没有 p2 的对象开辟的空间,因此绿色部分不存在。p 会将自己存储的地址复制给 p2 ;
ClassPeopele p=new ClassPeopele();
ClassPeopele p2;
p2=p;
(4)新对象重新赋值
p2=p;
p2.sex="男";
p2.age=16;
p2.name="牛爷爷";
C:\Java\jdk-17.0.11\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=8148:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Test\classDemo\out\production\classDemo ClassPeopleDemo
牛爷爷 16 男
牛爷爷 16 男
进程已结束,退出代码0