Java杂谈之类和对象 封装 构造方法以及代码块详解

目录
  • 1. 类和对象的初步认知
  • 2. 类的实例化
  • 3. 类的成员
    • 字段(属性/成员变量)
    • 方法
    • static 关键字
      • 修饰字段
      • 修饰方法
      • 修饰代码块(暂不讲)
      • 修饰类(暂不讲)
  • 4. 封装
  • 5. 构造方法
  • 6. this 用法
  • 关于引用的几个注意事项:
  • 7. 代码块

Java当中的类和对象

1. 类和对象的初步认知

java 是一门面向对象的语言,所谓面向对象有别于面向过程,面向对象是只需对象之间的交互即可完成任务,但是面向过程的话,需要我们将每一个步骤都详细地做出来。比如,以洗衣服为例,如果是面向过程来袭衣服,那么我们首先需要衣服,然后放入盆中,之后加水,放洗衣粉,最后搓揉。但是如果面向对象的话,第一步只需要找对象,找出衣服,洗衣粉,洗衣机,水这些对象,然后全部放到洗衣机里面就行了。这就是对象之间的交互。

java 当中的类是对象的综合,大打个比方,对象是房子,那么类就是设计图纸,每一个对象都是类具体的个体。

2. 类的实例化

总之,通过上面的分析,我们不难得出这样的结论:类似对象的统称,对象就是这个类的具体化实例,一个类可以产生无数个对象。那么但我在写代码的是就要进行类的实例化,即从类(也就是模板)中抽出一个具体的对象(相当于实物)。

基本语法:

//创建类
class <class_name> {
    field;//属性
    method;//成员方法
}
//实例化一个对象
<class_name> <对象名> = new <class_name>();

class 为定义类的关键字,ClassName 为类的名字,{}中为类的主体。(注意:java的类的命名是使用大驼峰,此处附上 java 组成部分的命名规则)

在类中 但是在成员方法外面 的元素可以称其为:字段 / 属性 / 成员变量(三种皆可)。

类中的函数称为:成员方法。

类的实例化方法:

class Person {
    public int age; //字段
    public String name;
    public String sex;
    public void eat() { //方法
        system.out.println("吃饭");
    }
    public void sleep() {
        system.out.println("睡觉");
    }
}

3. 类的成员

字段(属性/成员变量)

class Person { //创建一个类
    public String name; //成员变量
    public int age;
    public void eat() {
        int a = 0;//局部变量
        System.out.println("吃饭");
    }
}
class Test { //创建一个类
    public static void main(String[] args) {//主函数
        Person person = new person();
        //实例化出来一个具体对象
        System.out.println(person.name);//打印出来
        System.out.println(person.age);
        person.eat();
    }
}
//执行结果
null
0

注意事项:

  • 如上图的第 13 行和第 14 行代码,使用点号可以访问实例化对象里面的字段
  • 如果成员变量没有赋初始值

那么引用类型默认是 NULL,基本类型默认是0

如果是boolean类型的,默认是false

如果是char 类型的,默认是 “\u0000”(其实就是空)

  • 访问既包含了读也包含了写,读,即可以用点号找到成员变量 ,写,即可以给他赋值(本人认为这是一句废话,但是教科书看到了就bb一句)
  • 此外,如果将引用设为null 那么后面再用点号来引用的话就会发生空指针异常,代码就会报错。(如下图所示)

  • 第 11 行实例化时person 是一个引用变量,此时会在计算机的栈空间里面开辟一块空间用于存放 person,在堆上开辟一块空间用于存放对象,person 引用的就是 栈空间上面的对象。
  • 同样地,第五行中的 a 因为它处在函数之中所以说它是一个局部变量,所以它是被存到了栈空间当中的。

方法

java 中的方法说白了就是函数,本质上就是 对象做出的一种行为

class Person {
    public int age = 18;
    public String name = "张三";
    public void show() {
        System.out.println("我叫 + name,今年 + age + 岁");
    }
}
class test {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}

如上,就是说张三这个对象他有一个要执行的动作叫做 show

但是若想要想创建一个其他对象,再用show打印的话,需要 person 用点号来引用类里面的相关属性

Person person2 = new Person();
person2.name = "李四";
person2.age  = 20;
person2.show();

但是要注意的是,此处的代码最上面 那个Person 类在示例化的时候就已经给成员变量赋初值了,这其实是不对的,因为上面已经说过了,类其实是一切对象的总和,他是不可以这样被具体化的(简单来讲其实就是不可能所有人都叫张三)。

注意事项:在真正开发的时候我们总不可能每当要打印的时候都去写show 函数的,所以是有快捷方法的,那就是 toString 方法,鼠标右键点击一下找到generate 点击之后然后就会跳转,之后就可以找到了。

其实原理就是 println 的打印酒气本源其实是调用了一个叫做 object 的类 里面的 toString 方法,这里我们的操作就是重写该方法,这样改完之后下面的代码再用 println 打印的时候就可以直接打出我们想要的效果了。

如上图两处红色的方框便是我们更改的,那么之后每次打印代码输出我们想要的效果。如下图,上面一行是 show()函数输出的结果,而下面一行是 重写 toString 输出的效果

static 关键字

(static 可以修饰的有:字段、方法、代码块、类)

被 static 修饰的东西不需要实例化对象,用对象去点xx 来访问,他是可以直接用类名点xx 来访问。

修饰字段

静态的成员变量(或称:类变量)是独立放在方法区的,只有一份,以下面的例题为例

class TestDemo{
   public int a;
   public static int count;
}
public class Main{
   public static void main(String[] args) {
   TestDemo t1 = new TestDemo();
   t1.a++;
   TestDemo.count++;
   System.out.println(t1.a);
   System.out.println(TestDemo.count);
   System.out.println("============");
   t2 = new TestDemo();
   t2.a++;
   TestDemo.count++;
   System.out.println(t2.a);
   System.out.println(TestDemo.count);
  }
}

所以由a 和count 的存储方式就可以很容易得出答案,每当我们新实例化一个对象,a 就会随之重创,所以a 是会变的,但是 count只有一份,只存于方法区,所以 当重新 new 一个对象的时候,count 会继承上一次的值。

修饰方法

  • 静态方法还是开辟栈帧的
  • 静态方法是可以直接被调用的,不需要像普通方法那样想实例化对象再用对象来引用。也因此主函数的前面是要加 static的 ,因为static 是可以让主函数直接通过jvm 来调用的,如果不用这种方式的话那么将必须在主函数里面 new 一个对象,让对象来调用主函数,但是主函数目前的问题是,new 对象必须在主函数里面,但问题是我现在主函数进都进不来,要想进来就必须调用主函数,要调用就必须在主函数里面 new 对象,很明显,这是一个自相矛盾的事情,要想解决这个矛盾就必须给主函数加上 static。
  • 非静态方法可以直接调用静态方法和非静态方法(就是直接在其内部写上函数名加括号就代表调用),但是静态方法不可直接调用非静态方法,能直接调用的只有静态方法,也就是说主函数要想直接调用其他方法,那就必须要让其他函数加上 static ,不然的话还要再创建对象,就很麻烦。

修饰代码块(暂不讲)

修饰类(暂不讲)

4. 封装

本质上是使用private 和 public 和这两个关键字来实现函数的封装。因为我们之前写的代码都是就直接用 public 来修饰的,这样的,我们就必须要特地去了解类里面的情况,这会让代码写起来非常麻烦,并且如果类的创建者篡改了原来类里面成员变量的名字,那么后面的代码也要跟着改,安全系数很低。所以只要我们用 private 来封装成员变量,让使用者不能直接和成员变量产生联系,而是和类里面的函数产生联系。如果成员变量产生变更,类的调用者不需要做出任何修改。

总而言之,当被 private 修饰之后它的权限就被降低了,只能在当前类里面使用。被 private 修饰的只能用类名来引用。

  • getter 和 setter

但是当我们修改自己的封装的字段的时候,不可能每次都把 getName()和setName ()写出来,所以就可以直接使用快捷的方式,鼠标右击 选中generate 再选中 自己要操作的项即可。(以下为示例),还有 this 表示当前所在对象的引用。

5. 构造方法

构造方法特点:没有返回值,方法的名字和类名是相同的。

//以下为一个无参数的构造方法示例
public Person() {

}

构造方法的作用是用来初始化对象的,即在对象还未创建的时候为对象的成员变量赋初值,因为对象的创建是要分两步走的,先为对象分配内存,再为对象分配合适的构造方法,也就是说当我们想要在构造方法当中提前给对象赋值的时候是可以用 this的,而且由于 this 本质上是在对象创建后 jvm 给该对象分配的相应的指针,但是也正是也因为this 可以在构造函数之中使用(此时的对象还没有完全创建好)这就可以说明 this 其实是对象的引用,并非对象本身。

在我们实例化对象的时候,编译器会默认携带一个无参数构造方法,但是如果同一个类里面已经有了其他构造方法,那么就不会自动携带这种方法。以下三段代码皆为构造方法,并且他们的关系是重载。

6. this 用法

this. 成员变量

this. 成员方法

this ( ) 用 this 来调用构造函数,构造函数里面有几个参数 this 的括号里面就有几个参数(注意,this 调用构造方法必须放在第一行)

另外,之所以说 this 是一个引用对象而不是对象是因为,对象的产生要分两步走,第一步是为对象分配内存,第二步是调用合适的构造方法,这两步完成了之后才能说我们的对象被创建了,但是,如果说我们的 this 在一个构造方法之中创建的,就可以很明显看出 this 不是对象而是引用对象,因为此时的 this 还在构造函数的代码中,也就是说 this 使用时构造函数对象还没有被创建出来,所以说这个时候的 this 仅仅只是对象的引用。
大多数时候类里面使用 this 的时候,对象还没有被创建出来,这里的 this 就是当前类的对象的引用。

此外,静态方法当中不能出现 this (静态只能靠类名来引用)。

关于引用的几个注意事项:

  • 引用是否只能存在于栈上?

答:不一定,因为当你在类里面创建一个成员变量是数组的时候,在你的对象实例化之后,数组的那个引用变量就会被放到对象上面,但是数组的引用变量本质上还是引用它会指向自己数组里面的元素的。

class Person {
    private String name;
    private int age;
    private int[] elem = new int[10];
}//以下为原理图

  • 引用可以指向引用吗?

答:不可以,引用只能指向对象。

Person person = new person();
person1 = new person();
person1 = new person();
person1 = new person();
person1 = new person();

从上面这串代码可以明显看出,person1 这个引用指向的对象一再被赋予新的对象,但是尽管如此这并不意味着 person1 就同时指向了多个对象,最终有效的对象只有第五行,也就是说,person1 指向了第五行的那个对象,其他的都没用了。

一个引用被赋值null 代表它不指向任何对象

person = null;//示例

7. 代码块

代码块分为

  • 本地代码块(定义在方法里面的)//非重点
  • 实例代码块(构造代码块)
{
    this.age = 19;
}//用于初始化成员变量
  • 静态代码块
static {

}//用于提请准备数据
  • 同步代码块(暂不讲)

在程序执行的时候,执行顺序为:静态代码块先执行(即便放在最后面也是如此),之后实例代码块再执行,最后执行构造方法。还有,就是在一个类之中,静态的代码只执行一次。

并且当一段代码之中只有相同类型的,就会安从上往下的顺序执行。例如,如果一个类之中既有静态的字段,又有静态代码块,那么谁在前面,谁先执行。
(构造代码块)

{
    this.age = 19;
}//用于初始化成员变量
  • 静态代码块
static {

}//用于提前准备数据
  • 同步代码块(暂不讲)

在程序执行的时候,执行顺序为:静态代码块先执行(即便放在最后面也是如此),之后实例代码块再执行,最后执行构造方法。还有,就是在一个类之中,静态的代码只执行一次。

并且当一段代码之中只有相同类型的,就会安从上往下的顺序执行。例如,如果一个类之中既有静态的字段,又有静态代码块,那么谁在前面,谁先执行。

到此这篇关于Java杂谈之类和对象 封装 构造方法以及代码块详解的文章就介绍到这了,更多相关Java 类与对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 全面探究 Java 内部类

    目录 一. 实例内部类 1. 定义 2. 如何获取实例内部类这个对象的引用 3. 注意事项 二. 静态内部类 1. 定义 2. 如何获取静态内部类这个对象的引用 3. 注意事项 三. 匿名内部类 1. 定义 2. 常见用法 3. 注意事项 内部类(inner class)是定义在另一个类中的类.为什么要使用内部类呢?主要有两个原因:1.内部类可以对同一个包中的其他类隐藏.2.内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据. 下面,我就来带领大家去学习Java中比较常见的几种内部

  • JAVA回顾:封装,继承,多态

    目录 知识点回顾 封装 继承 super注意点: Vs this: 前提: 构造方法 多态 总结 知识点回顾 封装 封装(有时称为数据隐藏)是与对象有关的一个重要概念.从形式上来看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.对象中的数据称为实例域,操作数据的过程称为方法.对于每个特定的类实例(对象)都有一组特定的实例域值.这些值的集合就是这个对象的当前状态.无论何时,只要向对象发送一个消息,它的状态就有可能改变. 实现封装的关键在于绝对不能让类中的方法直接地访问

  • 你了解Java中的Object类吗

    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承. Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档 Object类中两个重要的方法: boolean equals (Object obj) //判断两个对象是否相等 String toString () //将对象转换成字符串形式 equals方法: 源代码: public boolean equals(Object obj) { return (this == obj); } 作

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

  • Java基础第四篇 封装与接口

    目录 1.封装与接口 2.对象成员的封装 3.类的封装 4.总结 前言: 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对象可以有状态和动作,即数据成员和方法. 到现在为止,数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对象的数据成员和方法. 1.封装与接口 封装(encapsulation)是计算机常见的术语,

  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    目录 类和对象的使用(面向对象思想落地的实现): 子类对象实例化的全过程 1.从结果上看:(继承性) 2.从过程上来看: 1.封装性 2.继承性 继承性的好处: 3.多态性 虚拟方法调用 4.抽象性 1.抽象类的特点: 2.天生的父类:抽象类 3.抽象方法 总结 创建类的对象 = 类的实例化 = 实例化类 类和对象的使用(面向对象思想落地的实现): 1.创建类,设计类的成员 2.创建类的对象 3.通过"对象.属性"或"对象.方法"调用对象的结构 如果创建了一个类的多

  • Java多态性抽象类与接口细致详解

    目录 1.多态性 1.1 向上转型 1.2 向下转型 2.抽象类 2.1 抽象类的基本概念 3.接口 3.1 接口的基本概念 3.2 接口的使用限制 3.3 使用接口定义标准 3.4 抽象类与接口的区别 1.多态性 多态性是面向对象的最后一个特征,它本身主要分为两个方面: ​ 方法的多态性:重载与覆写 ​ 1 重载:同一个方法名称,根据参数类型以及个数完成不同功能: ​ 2 覆写:通一个方法,根据操作的子类不同,所完成的功能也不同. ​ 对象的多态性:父子类对象的转换. ​ 1 向上转型:子类对

  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    目录 1. 类和对象的初步认知 2. 类的实例化 3. 类的成员 字段(属性/成员变量) 方法 static 关键字 修饰字段 修饰方法 修饰代码块(暂不讲) 修饰类(暂不讲) 4. 封装 5. 构造方法 6. this 用法 关于引用的几个注意事项: 7. 代码块 Java当中的类和对象 1. 类和对象的初步认知 java 是一门面向对象的语言,所谓面向对象有别于面向过程,面向对象是只需对象之间的交互即可完成任务,但是面向过程的话,需要我们将每一个步骤都详细地做出来.比如,以洗衣服为例,如果是

  • Java 中桥接模式——对象结构型模式的实例详解

    Java  中桥接模式--对象结构型模式的实例详解 一.意图 将抽象部分与它的实现部分分离,使他们都可以独立的变化. 二.适用性 以下一些情况使用Bridge模式 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能因为,在程序运行时刻实现部分应可以被选择或者切换. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充.这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充. 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译

  • Java  中桥接模式——对象结构型模式的实例详解

    Java  中桥接模式--对象结构型模式的实例详解 一.意图 将抽象部分与它的实现部分分离,使他们都可以独立的变化. 二.适用性 以下一些情况使用Bridge模式 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能因为,在程序运行时刻实现部分应可以被选择或者切换. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充.这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充. 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译

  • Java比较两个对象大小的三种方法详解

    目录 一. 为什么需要比较对象 二. 元素的比较 1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法 1. equals方法比较 2. 基于Comparable接口的比较 3. 基于Comparator接口的比较 4. 三种比较方式对比 一. 为什么需要比较对象 上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常 示例: class Student{ String name; in

  • Java编程中的4种代码块详解

    在Java编程中,代码块就是指用"{}"括起来的代码.下面看一下这四种代码块. 1.普通代码块 就是指类中方法的方法体. public void xxx(){ //code } 2.构造块 下面用"{}"括起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数(包括有参和无参的)执行. 构造块中定义的变量是局部变量. public class Client { {//构造代码块 System.out.println("执

  • Java 多线程的同步代码块详解

    目录 synchronized 同步代码块 同步方法(this锁) 静态同步方法 死锁问题 lock 总结 火车站抢票问题 由于现实中买票也不会是零延迟的,为了真实性加入了延迟机制,也就是线程休眠语句 package test.MyThread.ticketDemo; public class RunnableThread implements Runnable{ private int ticket = 100; @Override public void run(){ while(true)

  • Java多线程之synchronized同步代码块详解

    目录 1.同步方法和同步块,哪种更好? 2.synchronized同步代码块 3.如果同步块内的线程抛出异常会发生什么? 总结 面试题: 1同步方法和同步块,哪种更好? 2.如果同步块内的线程抛出异常会发生什么? 1. 同步方法和同步块,哪种更好? 同步块更好,这意味着同步块之外的代码是异步执行的,这比同步整个方法更提升代码的效率.请知道一条原则:同步的范围越小越好. 对于小的临界区,我们直接在方法声明中设置synchronized同步关键字,可以避免竞态条件的问题.但是对于较大的临界区代码段

  • Java构造方法和方法重载详解

    目录 第一 构造方法的作用 第二 构造方法的特点 方法重载 总结 类的结构包括 : 1. 成员变量 2. 成员方法 3. 构造方法 4. 代码块 5. 内部类 第一 构造方法的作用 主要有以下三方面的作用: (1)在构造方法中为创建的对象初始化赋值 (2)在创建一个对象的时候,至少需要调用一个构造方法 (3)每一个类都有构造方法 一个例子加深对以上三条的理解 public class Car{ String name; String color; float price; } 上一篇文章已经讲解

  • java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的Thread,类似于如下形式: Thread t=new Thread(myRunnable).而最终使线程启动都是执行Thread类的start()方法. 在JAVA中,一个线程一旦运行完毕,即执行完其run()方法,就不可以重新启动了.此时这个线程对象也便成了无用对象,等待垃圾回收器的回收.下次

  • Java实现生产者消费者问题与读者写者问题详解

    1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步:(2)在生产者和消费者之间建立一个管道.第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式.第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强. 同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性.常

随机推荐