《自学JAVA》第六章 20190820 面向对象(上)

 

学习目标 

  • 面向对象的基本概念(是什么,为什么要用,怎么用)
  • 面向对象的主要组成内容(类、对象)
  • 类的定义和组成部分(是什么,为什么使用,如何定义)
  • 对象(是什么、为什么使用,如何使用对象、对象的引用和this引用)
  • 类的成员变量、局部变量
  • 类的方法详解
  • 类的构造器初始化详解

 面向对象程序设计

面向对象是一种程序设计方法。

因为1)它与人类思维方法有好的相似度,主谓宾一目了然  2)一切以对象为中心,只需关心对象能完成哪些工作、具有什么功能 所以面向对象更容易设计程序。

通常我们使用单位 来实现面向对象。

  • 类是具有某种特征数据的一类事物。如苹果类有名字、甜度、品种等等
  • 因为一个类的事物具有它独特的数据和行为,所以采用 类 来区分不同的事物是自然界最常见的方法。(动物类、电子科技类、衣服类、食物类)
  • 如何定义类? 类是由构造器、成员变量、方法组等组成

类与对象

对象是 类的实体化的表现,例:这个苹果是 苹果类的 对象,是单一独立存在的,独一无二存在的,客观世界就只存在这个苹果

对象只能通过”引用“来访问它们。就像 要访问老板,先通过秘书预约,通过秘书“引用”才能访问到老板。所以创建好一个对象,都需要一个引用变量来访问。

对象的this 引用代表 this.成员变量  或 this.方法。 只能表示是当前类的实例

(使用this有什么好处?:因为在同一个类中,无需在重复创建新的对象来访问自己的方法和成员变量,造成内存的浪费)

使用场景:1)构造器中引用该构造器初始化的对象  2)在方法中引用该方法的对象

如何创建对象?

         1)创建一个引用类型变量  ,如 Object  o

         2)使用  new 关键字创建对象本身,如  new Object()  注:实际是使用了Object的构造器创建,保存在堆内存里

         3)使用  ” = “ 将引用变量指向对象。即 Object o = new Object();

类的成员变量定义

  类的成员变量 用于定义该类的实例所包含的属性数据,定义格式为:

   【修饰符】 数据类型  变量名  (=  默认值 )

public class Test()
{
    public String s;
    public int i;
    private double d;
    private char c;
    protected char[] c;
    public int[] arrayi;
    
    
}

成员变量和局部变量

将变量分为成员变量和局部变量两大类。

成员变量包括(static 声明的)类变量、实例变量(在类之中),无需显示初始化

局部变量有在 形参列表中的变量、方法体内的变量、代码块体内的变量,需要显示初始化,否则会报错。

注:成员变量和局部变量 根据变量的位置 ,其生命周期不同,例:

成员变量的类变量声明需修饰符,随着类销毁而销毁,实例变量随着实例销毁而销毁

局部变量声明无需三大修饰符,随着方法体结束而结束、代码块体结束而结束

成员变量和局部变量的初始化  ,内存中的运行机制

)当系统加载类或创建该类对象时,JAVA系统自动为成员变量分配内存空间(堆区),自动为成员变量指定初始值。

)当局部变量赋初始值时,系统才会为局部变量分配内存(栈区),并将初始值保存到这块内存中。局部变量总是保存在其所在方法的栈内存中

if(局部变量    =    基本数据类型)
{
    直接将 值 保存在变量内存中
}
else if(局部变量    =    引用数据类型)
{
    通过 地址 引用到 相对应 实际的对象堆区 或数组
}

如何正确使用合适的变量?

原则:变量在内存停留的时间越短,程序运行的性能就越好。

先谈谈差异:

【成员变量适用场景】

)描述某个对象或类的固有信息。(如人的身高、体重等信息),如果再判断自然界固定的事实,如人有两个眼睛,太阳升起方向是东边, 这类事实 应使用 类变量。多变的固有信息使用实例变量即可

)用来保存类或实例一直运行的状态信息。(如红绿灯不断切换的灯色,棋盘棋子一直变化的位置)

)某信息用于类内多个方法的共同使用的信息()

【局部变量使用场景】

)算术数据处理

待补充

局部变量 通常只存放基本数据类型值或对象的引用,所占内存区较小,而内存停留的时间短,性能越好。

 

类的方法定义和详解

类的方法 是对类的行为特征的抽象描述,用来表达类或对象的功能。所以方法要么属于类,要么属于对象。,由static 关键字来决定。如果该方法用static 修饰则是类方法,否则就是对象实例的方法 。定义格式为:

【修饰符】 返回类型 方法名 (形参列表)

public class Test{
    //通过对象实例访问的方法
 
    public void test(){}

    //通过类直接访问的方法
    public static void alltest();

}

方法的参数传递:值传递

  方法只有一种参数传递方式:值传递。值传递是 将实际参数值的副本 复制传入到方法内,而实际参数 本身并不发生改变。

例如: 像忍者一样,实参 产生了 影分身,这个影分身 在方法体内做过什么都不关本体的事,仅仅是复制品,有本体的数据和实际数值罢了

1)基本数据类型的值传递

输出结果: 9,6 

                   6,9

swap方法传入的是  (6,9)的副本,执行完成后,并不影响其原有的基本数值。

public class Test()
{

    public swap(int sa, int sb)
   {
       int temp    =    sa;
        sa    =    sb;
        sb    =    temp;
        System.out.println("执行swap 方法后的a 的值"+ a +",b 的值为:"+ b);
     }
    
      public static void main(String[] a)
    {

            int a= 6;
            int b= 9;
            swap(6,9)
            System.out.println("执行swap 交换后的 a,b 值为"+ a+","+b);
        }
}

 

2)引用数据类型的值传递

    如果一个方法的形参是 引用类型 ,如  public void test(Object o),它的实参传进来是实际把Object 对象的地址值也传进来了,操作的始终是所引用的 对象堆区内的数据

public class TransTest{


public static void swap (DataWrap dw)
{
        int tmp = dw.a;
        dw.a    = dw.b
        dw.b    = tmp;
        System.out.println("swap方法里,a 成员变量值为:"+dw.a +",b 的值为"+dw.b);
}

public static void main(String[] args)
{
        DataWrap dwa = new DataWrap();
        dwa.a = 6;
        dwa.b = 9;
        swap(dwa);
        System.out.println("交换结束后的a值为:"+ dwa.a +"交换后的b值为:"+dwa.b;
}


class DataWrap{

        int a; 
        int b;
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值