java——面向对象

        我们先通过一个案例来复习上一节的二维数组

案例:二维数组交换位置

有一个二维数组:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值