较完整的类和对象基本总结(Java)

较完整的类和对象基本总结(Java),第1张

较完整的类和对象基本总结(Java)

对类和对象的理解,是理解面对对象的第一步。

目录
    • 类的对象的概念
    • 类的实例化
    • 类的组成
      • 字段
      • 方法
    • 与类相关的关键字
      • 静态修饰static
      • this关键字和static关键字
      • 访问修饰限定符
        • 访问修饰限定符修饰类成员时
            • 拓展:当访问修饰限定符修饰类时
    • 对象的初始化
      • 字段的初始值
      • 构造方法
        • 默认构造方法
        • 构造方法的方法名和返回值
        • 在构造方法里调用构造方法

类的对象的概念

类和对象的关系:简单来说,类就是一个对象的图纸,而对象就是类的实例。一个类可以创建很多对象,就像一份建筑图纸可以建很多座房子那样。

深入:之前我的博客如何深入理解你的第一个Java程序里有提到类的概念。那篇文章提到,类的本质是抽象,而抽象的最大特征就是没有实体。也就是说,任何没有实体的事物,理论上都可以作为一个类。也许你觉得这用的定义有点抽象,这样的定义是为了考虑不同的情况,因为在实际的编程过程中,你总会设计一些类时,不会创建这个类所对应的对象。此时为了逻辑自洽,你大可把类理解为一种没有实体的事物,或许有实例,或许没有。

类的实例化

类的实例化,即以某个类为模板创建该类的对象,语法为

new Dog();

其中new是实例化的关键字,表示要新建一个对象。Dog是要实例化的类,后面加一个括号表示调用与Dog类同名的构造方法。这个语句将会返回一个Dog类的对象,一般会使用Dog的引用类型进行接收。

Dog dog = new Dog();

这里dog是Dog类的引用类型,通过dog变量可以向一个dog对象发送消息。
你可以向dog对象发送消息以调用dog对象的属性或方法。
若你没有定义一个引用变量接受该对象的引用,即此时你没有对该对象的引用进行“命名”,这种定义对象的方式也叫做匿名对象。由于你没有存储实例化返回的引用,你将无法再通过引用找到这个对象,这意味着你只能使用这个对象一次。当你只使用一次对象时,可以考虑定义一个匿名对象。

类的组成

类的基本组成为字段和方法,都可以统称为类的成员。

字段

字段,也可以叫做属性或者成员变量。

字段即属性或者参数,用于描述目前对象的状态。可以是任何数据类型,基本数据类型,引用数据类型均可。
定义方式:在方法的外部,类的内部直接定义。
调用方式:对象引用.字段名

方法

也可以叫做函数。

方法即行为,用于描述目前对象的行为。最基本的组成结构为返回值,参数和方法名和参数列表,方法体。一般的方法的方法名不可以与类名雷同(构造方法除外),方法体用于说明方法的具体实现。
定义方式:在类的内部单独定义
调用方式:对象引用.方法名(方法参数)

与类相关的关键字 静态修饰static

static基本语法:可以修饰类中的字段、方法。被static修饰后的类成员将不依赖于具体的对象,而依赖于类本身。

staitc的内部实现:从内存的角度看,被static修饰的字段和所有的方法(不管有没有static修饰,都以字节码的形式)被存放在方法区中。存在方法区中意味着有且只有一份,不依赖于具体的对象(new出来对象都存在堆里,允许存在多份),这意味着static修饰的字段和所有方法被所有对象所共用,或者说只依赖于类。

静态字段和方法的调用方式:类名.静态字段或静态方法(也可以使用具体的实例来调用静态字段和方法,但并不建议)

易错点:允许使用static修饰局部变量吗?

答:不允许。Java并没有定义static修饰局部变量的语法,也就是说被static修饰的变量还是会放在方法区里,但是Java又定义局部变量是存放在栈上的,因此这个变量的存储位置就出现了矛盾。

this关键字和static关键字

this关键字的含义是:当前对象的引用。

this有以下三种用法:
1this() 调用当前的构造方法,只能放在构造方法中,且必须是第一行。构造。(构造方法在后面会介绍)
2this.字段 表示访问当前对象的字段
3this.方法 表示访问当前对象的方法

this存在的意义为了防止当前对象的字段名和其他临时变量发生冲突或者其他需要利用到当前对象引用的情况。

this的内部实现:this一般用于实例方法或构造方法中。从内部实现来看,Java在调用一个非静态方法时,除了传递显示声明的参数外,还会隐式地传递当前对象的引用到该方法中,以便于后续的 *** 作。
那么问题就出现了,你怎么调用当前对象的引用呢?怎样才能避免当前对象的引用和其他的变量的命名冲突呢?于是Java提供了一个关键字this,用于表示当前对象的引用。

在你理解了this的内部实现之后,此时你可以进一步理解static关键字了。static修饰的方法,就是没有this的方法。

访问修饰限定符 访问修饰限定符修饰类成员时

一般来说Java的访问修饰限定符一般用在类的成员和类本身。这里先讨论的是访问修饰限定符对类成员的情况。

Java有四种访问修饰限定符,分别是

  • private:该成员只能在类的内部调用
  • protected
  • 默认(没有访问修饰限定符,表示包访问权限)
  • public:该成员在任何类中都能调用

其中protected和默认访问权限需要包和继承的知识,这里先不进行讨论。

以下是几个关于访问修饰限定符语法的常见问题、

public访问修饰限定符放在哪里?对谁起作用?

答:放在你要进行访问权限控制的类成员或类的正前方,仅对紧跟着访问修饰限定符的事物有访问控制效果。

为什么要有访问修饰限定符?

答:这是一个非常重要的问题。为了制定类的创建者和使用者的界线,制定这个界线有以下好处:

1.降低类使用者的使用成本
举个例子,当你使用洗衣机时,你无需知道洗衣机的内部工作原理,你只要会使用洗衣机的功能即可,这将降低使用洗衣机的成本。就算你要打开洗衣机研究内部的工作原理,头疼的也会是洗衣机的制造者,因为当你打开内部结构时,你可能会损坏洗衣机的使用功能。

2.方便使用者的代码重构
这也是最关键的一点,在类的创建者在对类进行维护时,不至于要让到类的使用者大量修改代码。
一般来说,类的创建者和使用者有一个约定,当一个类提供了公共的方法后,就不会轻易的修改这个公共方法的名字和实现的功能。类的创建者可以仅仅提供那些想要让使用者使用的部分,而将具体的实现进行封装,这样在重构内部的实现时,就可以减小对类使用者的影响。
反过来讲,若不存在访问修饰限定,则会出现什么现象?类的创建者在重构类时将会处处受限。因为从类的创建者角度来看,由于类的内部是完全公开的,无法得知哪些成员被类的使用者调用了,因此也不知道自己可以修改哪些部分,哪些部分不能修改,很难不对类的使用者造成影响。

拓展:当访问修饰限定符修饰类时

类的访问修饰限定符只有两种:public和包访问权限。

类的包访问权限:若你具有Java的包的知识,这里仅需要注意一点,没有明确指定装包的.java文件,将会被放在当前路径的默认包中。

public修饰类:
public修饰类时,有如下的限制:

  • 一个.java文件仅有一个public类
  • .java文件名必须与文件里的public类名相同
  • 特例:.java文件里可以没有public类,此时的.java文件可以任意命名,但为了避免混淆,尽量不要乱命名。

此外,若你不想要任何人使用你的类,也就是想要实现一个类似private的类(注意,没有protected和private类),可以使用private修饰类的构造方法。你可以定义一个静态方法返回一个该类对象的引用。

类的包访问

对象的初始化 字段的初始值

在Java中,若你想要使用变量,你必须初始化你的临时变量,但却不用初始化字段也可以直接使用,这些字段会用一个默认值,这是另很多人迷惑的点。
从内存的角度上来看,临时变量和字段本就不在同一个内存区域中。临时变量存在栈上,字段存在堆或方法区中(静态字段)。字段之所有有初始值是因为JVM在实例化一个对象时,会为对象开辟一块确定大小的空间,并为这块空间赋以对应的0值,以下是各种数据类型所对应的默认值也就是0值。
对于静态字段,是存放在方法区中的,在首次实例化对象或由此调用该类的任何静态成员时,JVM就会为所有的静态成员赋予默认值。

构造方法
new Dog();

在实例化时,要在类名后加一个括号,这有什么用意?若你知道对象的实例化过程,你就能理解为什么这么写了。

对象的实例化过程:

  1. 为对象开辟空间,并赋予对应的0值(与字段的初始化相匹配)
  2. 使用构造方法初始对象

构造方法的存在,正是为了保证对象的初始化。

默认构造方法

之前介绍了对象的实例化过程,有时你并没有使用写构造方法,但为什么也可以进行对象的实例化呢?因为在你没有写任何构造方法的时候,系统会为你提供一个默认的无参构造方法。注意:若你有提供构造方法,系统将不会再为你提供构造方法了。

构造方法的方法名和返回值
class Dog {
	String name;
	public Dog(String name) {
		this.name = name;
	}
}

构造方法的方法名与类名相同,这是为了防止命名冲突,因为一个类的方法只有一个,此时定义类名就是构造方法名就可以保证构造方法的方法名是独一无二的。

构造方法无返回值,这是Java的基本语法,不必深究。

在构造方法里调用构造方法

你可以使用在构造方法中使用使用this();调用另一个构造方法,但请注意,只能在构造方法里用this调用另一个构造方法,且只能放在构造方法的第一行,一个构造方法只能调用其他的构造方法一次。在调用完其他的构造方法后,会继续执行当前的构造方法。

疑问:允许嵌套调用其他构造方法吗?即在一个构造方法里调用另一个构造,在另一个构造方法再调用其他的构造方法?

答:可以。只要保证this调用的构造方法的语句都放在第一行,且代码不出现死循环。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4687300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存