Java中的对象

Java中的对象

一、面向对象的编程语言

1.封装性

面向对象的核心思想之一就是就是将数据和对数据的操作封装在一起。
数据即类中的成员变量。
对数据的操作即类中的方法。
类就是对现实事物对象在计算机内存中的抽象,调用时需要new来实例。

2.继承

继承是先进的编程模型,子类可以继承父类的属性与行为,继承父类的成员变量与方法,又可以添加子类独有的数据和数据上的操作。

3.多态

(1)操作名称上的多态
相同的类或不同的类中可以有多个相同的方法名,相同的类中通过方法参数来区分不同的方法,不同的类中可new不同的类来调用。
(2)继承上的多态
指不同的类继承同一个父类,不同的类对父类的方法进行不同的重写,如cat与dog类都继承animal类,因为叫声方法不同,对父类叫声方法进行不同的重写。

二、类体

1.属性

指类中的成员变量
成员变量的类型
基本数据类型
引用数据类型:数组、对象和接口。

2.行为

指类中的方法,方法可以放回Java中任意一种数据类型。

3.注意点

(1)局部变量只在方法内有效,而且与声明的位置有关;方法的参数在整个方法内有效,方法内的局部变量从他的声明位置之后开始有效。其实方法与C语言中函数类似。
(2)如果在方法以内标明成员变量,使用this关键字。
(3)Java默认局部变量没有默认值,需要给局部变量初始值,而成员变量Java自动赋默认值。

三、创建对象

1.构造方法

构造方法无参数,无返回类型,一个类只有一个构造方法。在Java中,没有编写构造方法,会使用默认的构造方法。

2.创建对象

使用new运算符和类的构造方法为声明的对象分配对象,即创建对象。

3.对象的内存模型

(1)类对象放在电脑内存的堆中
(2)如下所示的一个类

class Zhubaijie{
    int height;
    int weight;
    int head;
    int ear;
}

new 运算符和构造方法需要做两件事:
①为各个成员变量分配内存,然后执行构造方法里的语句。而系统为成员变量赋默认值,浮点型为0.0,boolean型默认为false,整型默认为0,引用型默认为null。
②再分配内存后,计算出所有整合所有成员变量的引用值,并将引用赋给Zhubaijie类。Java系统分配的height、weight、head、ear属于对象Zhubajie的实体。
③创建对象就是为对象分配变量,并获一个引用,以确保这些变量由对象来操作管理。
④实例多个对象时,是再一次分配新的引用。

4.对象的实例

类所声明的变量称为对象,对象变量负责存放引用。
(1)空对象
没有实体的对象(即没有分配内存),空对象不能调用成员变量、方法,否则报错。
由于对象可以以动态地分配实体,所以Java编译器对空对象不做检查。
(2)相同的引用
一个类的两个对象如果具有相同的引用,二者就具有相同的变量(实体)。
在Java中,可以进行的类的赋值语句。

object2=object1;

这样,object2拥有的变量与object1完全一样。
(3)垃圾机制
这种机制周期的检测某个实体是否已不在被任何对象所拥有的(引用),如果发现这样的实体,就释放实体占用的内存。
例如:

Point p1=new Ponit(5,15);
Point p2=new Ponit(8,18);

p1=p2;

则系统会取消原来分配给p1的内存。
与C++不同,Java语言中,雷友构造方法,但没有折构方法,Java运行机制环境有"有垃圾回收"机制,因此不必像C++那样自己管理内存,因此Java很少出现“内存泄漏”问题。

5.类与程序的基本结构

(1)编译
将.java文件保存在相同的目录中(包),分别通过编译,得到.class文件。
(2)运行主类
Java会编译主类需要的源文件。

6.参数传值

(1)参数
参数属于局部变量,当对象调用方法时,参数被分配存储空间,并要求调用者向参数传递值。
(2)传值机制
①方法中参数变量的值是调用者指定的值的拷贝。如果方法改变了参数值,不会影响向参数传值的变量的值。参数得到的值类似于生活中的原件的复印件,无论如何改变复印件,都不会改变原件。
②基本数据类型传递参数时,可以高精度的向低精度的传参,但不可以低精度往高精度传参。如int型参数不可传递float值,但可以往double类型传递float型。
③引用型数据传参时,传值是变量存放的引用,而不是变量所引用的实体。如何改变参数变量所引用的实体,就会导致改变原变量的实体,就会导致原变量的实体发生变化。改变参数中存放的引用不会影响向传值的变量的引用,因为方法中参数是形式参数。

7.可变参数

即不确定参数参数的个数,但要保证参数的类型是相通的。

public void f(double y,int ... x)

其中,x是方法f的参数列表中的可变参数的’参数代表’,参数列表的第一个为y,x[0],x[1]为第二第三个参数,参数链表最后一个参数必为参数代表。所以int … x在参数括号内之后。

8.对象的组合

如下

public class Circle{

}

public class Circular{
    Circle bottom;
}

当实例Circular时,也同时给bottom分配内存。

四、实例成员与类成员

成员变量又可分为实例变量与类变量。

class Dog{
    float x;                    //实例变量
    static int y;               //类变量、静态变量
}

实例变量互不相同,互不干扰,使用不同的内存空间。
而类变量属于共享数据,所有Dog类共同使用一个y值,只分配一个内存空间,如果一个类中调用方法修改y值,所有类中的y值均会改变。而且类变量不需new来实例,可以直接使用Dog.y,系统为它分配内存。

注意:当类创建对象时,不同的实例变量分配不同的内存。而类变量不再重新分配内存,直到程序运行完后,才释放内存。因此类变量不仅可以通过对象访问,也可以通过类名直接访问。

五、实例方法与类方法

类方法也称静态方法

class A{
    public void a(){

    }

    static int b(){

    }
}

类方法也可以通过类名直接调用,Java类库中许多方法定位类方法,不需实例,直接调用。如Math类。

六、重载

由于“方法=方法名+参数”,虽然方法名可以相同,但可以由于参数不同,可以设计实现不同功能的方法。

class Number{
    int calculate(int a){
       return a*a;
    }

    int calculate(int a,int b){
       return a+b;
    }
}

如上,这便是calculate方法重载。同时也要避免重载的歧义调用。如下

class Dog{
    static void cry(double m,int n){
        System.out.println("小狗");
    }

    static void cry(int n,double m){
        System.out.println("small dog");
    }
}

调用时:

Dog(10,10)

会报编译错误,Java不知执行哪个方法。

七、this关键字

1.在类方法中

在类方法中不能使用关键字this,因为类方法可以直接使用类名调用,但这是无对象产生。

2.在构造方法与实例方法中

在方法中,可以实例成员变量前加this,也可省略;但实例成员变量与方法某一变量重名时,必须使用this。
而类变量采取另外种格式:

class A{
    int x;
    static int y;
    void f(){
        this.x=100;
        A.y=200;
    }
}

同时,y前面的类名也可以省略的。

八、包

1.包与目录

如果主类上的包名为tom.jiafei,那么主类的字节码一定放在…\tom\jiafei目录下,需要到tom的父目录下运行主类。(这是在cmd中操作,在IDEA中,直接建包运行即可)。

2.包的意义

包是专门找一个二级目录来储存类,在二级目录的父目录上运行。方便日后导入调用。及该类从属于该包下,建成类库。

3.导入包
import java.util.Date;

这样可实现导入包中的Date类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有几何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值