动力节点——类的编写过程、类和对象的关系(六)

一,类的编写过程

使用java代码表示学生类

开始编写学生类

class  Student{

        //静态特征(属性):姓名    性别    年龄

        //变量    但是只有数据类型和名称

        String  name;//姓名

        int  sex;//性别

        int  age;//年龄

        //动态特征(行为):学习

        //方法,但是此时修饰符不要写static

        public  void  study(){

                System.out.println("学生学习");

        }

}


二,类和对象的关系

面向对象倡导万物都是对象

类:是实际生活中某类事物的属性以及相关的行为的抽象集合。

对象:对象时类具体化的一个实例(类具体化了就是对象即实例)。


三,对象的使用语法:

对象的使用方式:

使用类就是使用对象(实例)。

类是定义的,对象(实例)是使用的。

1,创建对象

类名称    ​对象名称(变量名称)=new    ​类名称();


2,使用对象

使用对象的属性(成员变量、对象变量、实例变量)

对象名称  .  属性名称=值;(这个值的数据类型必须和类中定义属性时的数据类型一致)。


使用对象的行为

对象名称  .  行为名称(参数值……);

eg:

//定义汽车类(类似汽车图纸)

class  Car{

    ​    ​//静态特征    ​属性

    ​    ​String  color;

    ​    ​double  price;

    ​    ​double xingNeng;

    ​    ​public void drive(){

    ​    ​    ​    ​System.out.println("汽车开始行使");

    ​    ​}

}

public  class  ObjectDemo{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​//根据汽车图纸创建一辆汽车

    ​    ​    ​    ​//创建汽车类的一个对象

    ​    ​    ​    ​Car  c=new  Car();

    ​    ​    ​    ​//给汽车上颜色

    ​    ​    ​    ​//为  c 对象的color成员变量赋值

    ​    ​    ​    ​c.color="红色";

    ​    ​    ​    ​//System.out.println("汽车 c 的颜色是:"+c.color);

    ​    ​    ​    ​//为  c 对象的price成员变量赋值

    ​    ​    ​    ​c.price=1.23;

    ​    ​    ​    ​//System.out.println("汽车 c 的价格是:"+c.price);

    ​    ​    ​    ​

    ​    ​    ​    ​//调用 c 对象的drive方法,让汽车开始行使。

    ​    ​    ​    ​c.drive();

    ​    ​}

}

一个对象的使用过程内存图解


drive方法执行完空间释放,main方法不调用也释放。

注意:

1,标记属于指针,指向另外一块内存。

2,在JVM中会为每块内存定一个地址值,一般是十六进制     0x0001

3,class类或Car类第一次使用需要加载进内存,只需要加载一次。

4,Car  c创建在main方法中,Car也可以叫局部变量,  c  叫对象名称

5,new在堆内存中开辟空间,创建完对象立即为成员变量开辟空间,并未成员变量赋默认初始化值

6,当执行到c.color的时候,才到堆内存去显示初始化值。


四,对象的创建过程内存图(初步讲解)

1,类的加载

在类第一次使用之前需要被加载如内存

类的描述信息放入方法区


2,对象的创建

为对象在堆内存开辟空间

为对象的成员变量开辟空间并默认初始化

默认值:

byte    ​short    ​int    ​long    ​    ​    ​0

float    ​double    ​    ​    ​    ​    ​    ​    ​0.0

boolean    ​    ​    ​    ​    ​    ​    ​    ​    ​  false

char    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​‘  

其他类型    ​    ​    ​    ​    ​    ​    ​           null


3,对象的使用


五,对象的成员变量、成员方法内存图解

由一个类创建两个不同对象

1,每个对象都有一份自己的成员变量

2,所有对象共享方法描述

class  Car1{

    ​    ​String  color;

    ​    ​double  price;

    ​    ​double xingNeng;

    ​    ​public  void  drive(){

    ​    ​    ​    ​System.out.println("汽车开始行使");

    ​    ​}

}

public  class  ObjectDemo1{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​Car1  x1=new  Car1();

    ​    ​    ​    ​x1.color="红色";

    ​    ​    ​    ​System.out.println("x1  颜色:"+x1.color);

    ​    ​    ​    ​x1.price=1.23;

    ​    ​    ​    ​System.out.println("x1  价格:"+x1.price);

    ​    ​    ​    ​x1.drive();


    ​    ​    ​    ​

    ​    ​    ​    Car1  x2=new  Car1();

                x2.color="黑色";

                System.out.println("x2  颜色:"+x2.color);

                x2.price=2.23;

                System.out.println("x2  价格:"+x2.price);

                x2.drive();

    ​    ​}

}


六,对象的引用复制

对象引用的复制就是地址值的复制

class  Car2{

    ​    ​String  color;

    ​    ​double  price;

    ​    ​double  xingNeng;

    ​    ​public  void  deive(){

    ​    ​    ​    ​System.out.println("汽车开始行使");

    ​    ​}

}

public  class  ObjectDemo2{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​Car2  x1=new  Car2();

    ​    ​    ​    ​x1.color="红色";

    ​    ​    ​    ​System.out.println("x1  颜色:"+x1.color);


    ​    ​    ​    ​Car2  x2=new  Car2();

    ​    ​    ​    ​x2.color="黑色";

    ​    ​    ​    ​System.out.println("1  x2  颜色:"+x2.color);


    ​    ​    ​    ​Car  x3=x2;

    ​    ​    ​    ​x3.color="白色";

    ​    ​    ​    ​System.out.println("x3  颜色:"+x3.color);


    ​    ​    ​    ​System.out.println("2  x2  颜色:"+x2.color);

    ​    ​}

}



七,基本数据类型和引用数据类型做方法参数的区别:

1,基本数据类型做方法参数,

基本数据类型传递的是具体值    ​    ​传递值    ​    ​往往不会改变原有值


2,引用数据类型做方法参数,

引用数据类型传递的是地址值    ​    ​地址传递    ​    ​通常改变原有值

eg:

class  T{

    ​    ​int  i;

}  

public  class  ObjectDemo3{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​//基本数据类型做方法参数

    ​    ​    ​    ​int  i=10;

    ​    ​    ​    ​System.out.println("1  i="+i);//10

    ​    ​    ​    ​chengeValue(i);

    ​    ​    ​    ​System.out.println("2  i="+i);//10


    ​    ​    ​    ​//引用数据类型做方法参数

    ​    ​    ​    ​T  tt=new  T();

    ​    ​    ​    ​tt.i=10;

    ​    ​    ​    ​System.out.println("1  tt.i="+tt.i);//10

    ​    ​    ​    ​chengeValue(tt);

    ​    ​    ​    ​System.out.println("2  tt.i="+tt.i);//20

    ​    ​}

    ​    ​public  static  void  chengeValue(int  i){

    ​    ​    ​    ​i=20;

    ​    ​}

    ​    ​public  static  void  chengeValue(T  tt){

    ​    ​    ​    ​tt.i=20;

    ​    ​}

}



八,成员变量和局部变量的区别:

1,代码编写位置不同

成员变量是在class内部,所有方法外部

局部变量必须在方法内部定义


2,在内存中的位置不同

成员变量在堆内存

局部变量在栈内存


3,创建时机不同

成员变量是随着对象的创建而创建

局部变量是随着方法的执行而创建


4,初始化值不同

成员变量会被默认初始化

局部变量必须被显示初始化

注意:如果成员变量和局部变量有相同名称,则符合就近原则

eg:

class  E{

    ​    ​//int  i;

    ​    ​int  i=10;

    ​    ​public  void  test(){

    ​    ​    ​    ​//int  j=20;

    ​    ​    ​    ​//int  j;定义变量  j

    ​    ​    ​    ​//以上代码只是定义并没有初始化,所以下面输出代码错误,变量在使用之前必须被初始化完毕

    ​    ​    ​    ​//System.out.println(j);


    ​    ​    ​    ​int  i=20;//局部变量

    ​    ​    ​    ​//局部变量和成员变量的就近原则,那个语句近就输出谁。

    ​    ​    ​    ​System.out.println(i);   ​    ​    ​    ​

    ​    ​}

}

public class  ObjectDemo4{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​E  ee=new  E();

    ​    ​    ​    ​//System.out.println(ee.i);//10

    ​    ​    ​    ​ee.test();//20

    ​    ​    ​    ​System.out.println(ee.j);语法错误,注意  j  的作用域,不能再另外一个方法中直接调用

    ​    ​    ​    ​

    ​    ​    ​    ​//测试成员变量和局部变量同名称输出结果

    ​    ​    ​    ​ee.test();//20

    ​    ​}

}


九,匿名对象

就是没有名字的对象

class  P{

    ​    ​public  void  test{ }

}

public  class  ObjectDemo5{

    ​    ​public  static  void  main(String[]  args){

    ​    ​    ​    ​//创建P类的一个对象

    ​    ​    ​    ​P  pp=new  P();

    ​    ​    ​    ​//按照以上的写法,对象的名称叫pp

    ​    ​    ​    ​//调用Test方法

    ​    ​    ​    ​//pp只是一个指针,指向对象,把pp定为对象的名字

    ​    ​    ​    ​//那么pp.test()实际上就是对象调用的自己的方法Test

    ​    ​    ​    ​pp.test();


    ​    ​    ​    ​//一下使用匿名对象的方式

    ​    ​    ​    ​//new  P();

    ​    ​    ​    ​new  P().test();

    ​    ​}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值