Java中类的定义与实例化详解

类的定义

面向对象的程序设计中,类可以看作是我们自定义的数据类型,那么,如何能更加优美,更加高效地定义它就显得尤为重要。

类中的成员有很多,每一部分都是十分关键的,毕竟“面向对象”在Java学习中真的很重要,许许多多的Java开发者定义出来的类等待着我们去使用,加油!攻克它!

直接上代码:

package com.my.pac02;
/**
 * @author Summerday
 * @date 2019/11/26 21:40
 */
 //类名和文件名一致,且包含main方法
public class CatTest{
  //程序入口
  public static void main(String[] args) {
    //创建对象
    Cat cat = new Cat();
    //为对象的属性赋值
    cat.name = "sink";
    cat.isMale = true;
    //通过对象调用方法
    cat.sleep();
    cat.jump();
    cat.laughAt("Susan");
    System.out.println(cat.isNotMale());
    //打印引用变量的值
    System.out.println(cat);
    //创建一个新的引用变量并指向原先的对象
    Cat otherCat = cat;
    System.out.println(otherCat);
    System.out.println(otherCat.name);//"sink"
    //将cat和实际对象之间的引用消除
    cat = null;
  }
}
//定义一个Cat类
class Cat{
  //构造方法
  Cat() {
    System.out.println("cat is cute.");
  }
  //成员变量
  String name;
  int age;
  boolean isMale;
  String color = "Blue";
  //方法
  void sleep(){
    System.out.println(name+"is sleeping---");
  }
  public void jump() {
    System.out.println(name+"is jumping---");
  }
  public void laughAt(String otherName)
  {
    System.out.println(name+"is laughing at "+otherName);
  }
  //返回boolean类型的方法
  boolean isNotMale() {
    return !isMale;
  }
}

定义一个简单的类

[修饰符] class 类名
{
    (零个到多个)构造器...
    (零个到多个)成员变量(属性)...
    (零个到多个)方法...
}

[修饰符]修饰类时可以是上面代码中的public,或者final,abstract,也可以省略不写,但不建议使用private和protected。

参考:Java的外部类为什么不能使用private、protected进行修饰:

对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。

如果类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。当一个内部类使用了private修饰后,只能在该类的外部类内部使用。

上面这些都是平时使用司空见惯的,但是为什么是这种情况呢?

可以想一下,一个java项目是不可能在一个class里面完成的。mvc模式中,是把类分为三层,一层层调用类。如果定义为私有的和受保护的就无法调用。换句话说,对于一个java文件,要么就是自己单独运行,要么就是被其他程序作为库调用,如果一个java文件的类被private修饰,那么是不是其他的程序或是类是无法使用它的,那么他作为一个单独的文件就没啥用了。如果它作为单个文件运行,类加载怎么找到它呢,因为它对外不可见。同时,也失去了类的存在意义。因此,类只有public和默认修饰符。

类名命名规范:要见名知义,意思是需要多个有意义的英文单词组成,每个单词首字母大写,规范这种东西,建议遵守!养成好习惯。

上面三种成员(构造器,成员变量,方法)都可以定义零个或多个,但是都是零个就变成了空类,没啥意义。

定义一个成员变量

[修饰符] 类型 成员变量名 [=默认值];
//例如
boolean isMale;
String color = "Blue";

成员变量包括实例变量和类变量,static修饰的成员变量称作类变量,关于static之后再细讲。

定义一个方法

[修饰符] 返回值类型 方法名(形参列表)
{
  零条到多条可执行语句组成的方法体...
}
//例如
void sleep(){
System.out.println(name+"is sleeping---");
}
public void jump() {
System.out.println(name+"is jumping---");
}
public void laughAt(String otherName)
{
System.out.println(name+"is laughing at "+otherName);
}
//返回boolean类型的方法
boolean isNotMale() {
  return !isMale;
}

定义一个构造器

[修饰符] 构造器名 (形参列表)
{
  (零条到多条可执行语句组成的构造器执行体...
}
//例如
//构造方法
Cat() {
  System.out.println("cat is cute.");
}
  • 构造器用于构造类的实例,也就是创建某个类的对象时会自动调用构造方法,之后会讨论。
  • 构造器名一定要和类名相同!
  • 没有定义构造器的话,系统会提供默认的构造器。

设计类时的具体细节,接下来将会一一展开,还有未涉及到的内部类和代码块部分,之后将会进行学习,暂且从这三个部分展开探究。

类的实例化

通过类构造属于该类对象的过程就叫做类的实例化。对象是具体存在的事物,也称作实例,可以调用类中定义的实例变量以及方法。(不考虑static修饰变量的情况下)

创建对象及使用对象:

//使用Cat类创建了Cat类型的对象
//并调用Cat类的构造器,返回Cat的实例,赋值给变量cat
Cat cat = new Cat();
//访问cat的实例变量name和isMale,并为他们赋值
cat.name = "sink";
cat.isMale = true;
//调用cat的方法
cat.sleep();
cat.jump();
cat.laughAt("Susan");
//输出isNotMale()方法的返回值
System.out.println(cat.isNotMale());
  • 如果访问权限允许的情况下(访问权限涉及到private等关键字,暂且不谈),类中定义的方法和成员变量都可以通过类或实例来调用。
  • 创建对象:类型 实例名 = new 类型(参数列表);例如:Cat cat = new Cat();
  • 调用类成员变量或方法:类.类变量或类.方法或实例.实例变量或实例.方法,类变量涉及static关键字,也是暂且放一边,之后继续回顾。
    可以这么理解:定义类就是为了创建许许多多该类的实例,这些实例具有相同的特征。

创建对象的过程在内存中的表现

类是一种引用数据类型:也就是说,在栈内存里的引用变量并不是真正存储对象的成员变量,而是它的引用,实际的成员变量藏在堆内存中,这一点类似于前面提到过的数组类型。而且,可以知道,栈内存中存储的是实际对象在堆内存中的地址值,可以直接打印引用变量cat的值验证。

创建对象

//创建对象,并初始化
Cat cat = new Cat();

访问实例变量

//访问实例变量
cat.name = "sink";
cat.isMale = true;

Java不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。

另外,堆内存中的同一个对象可以由栈内存中多个引用变量所指向。例如:

//把引用变量cat赋值给另一个引用变量otherCat
Cat otherCat = cat;

这时,cat和otherCat都在栈内存中被创建,且他们都指向了原先cat所指向的那块堆内存,所以他们操作的是同一个实际对象。

堆内存的对象没有任何变量指向时,就会在一段时间内作为“垃圾”被Java的垃圾回收机制回收,释放对象所占用的内存区。
所以想让他提前释放,直接给引用变量赋值为null。

参考书籍:《疯狂Java讲义》

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • java 实例化类详解及简单实例

     Java 实例化类的方法 Java中,类的实例化方法有四种途径: 1)使用new操作符 2)调用Class对象的newInstance()方法 3)调用clone()方法,对现有实例的拷贝 4)通过ObjectInputStream的readObject()方法反序列化类 1.ClassInstance.java import java.io.*; class ClassInstance implements Cloneable, Serializable { private String s

  • Java类初始化和实例化中的2个“雷区”

    在考虑类初始化时,我们都知道进行子类初始化时,如果父类没有初始化要先初始化子类.然而事情并没有一句话这么简单. 首先看看Java中初始化触发的条件: (1)在使用new实例化对象,访问静态数据和方法时,也就是遇到指令:new,getstatic/putstatic和invokestatic时: (2)使用反射对类进行调用时: (3)当初始化一个类时,父类如果没有进行初始化,先触发父类的初始化: (4)执行入口main方法所在的类: (5)JDK1.7动态语言支持中方法句柄所在的类,如果没有初始化

  • Java实例化类详解

    Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢? 经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉. 怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢? 本文试图从几段鲜活的代码入手,给大家呈现不一样的 Java 实例化类. 下面代码取自 com.google.zxing 源码实现: public BitMatrix encode(String contents, BarcodeFormat format, int width, int h

  • Java子类对象的实例化过程分析

    本文实例讲述了Java子类对象的实例化过程.分享给大家供大家参考,具体如下: 一 点睛 子类对象在实例化时,子类对象会默认先调用父类中的无参构造函数,然后再调用子类构造构造方法. 二 实战 1 代码 class Person { String name ; int age ; public Person() // 父类的构造方法 { System.out.println("***** 父类构造:1. publicPerson()") ; } } class Student extend

  • 简单了解java类的初始化以及类的实例化

    前言 上一篇我们知道了一个类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载. 当初始化完成以后,一个类所有的类变量(被static修饰的变量)都被赋值.但是未被static修饰的成员变量又是何时被赋值的呢? 一个类何时会被初始化 一个类何时被初始化可以分为以下几类: 1.创建类的实例(new). 2.访问某个类或接口的静态变量,或者对该静态变量赋值. 3.调用类的静态方法. 4.通过反射方式执行以上三种行为. 5.初始化子类的时候,会触发父类的初始

  • 浅谈Java中类的实例化步骤

    就个人的一些看法简单的 谈谈static. 就java 工程师来说,static非常容易在面试的时候被问到. 言归正传,书面上说static是静态的.其实我把它理解为"全局的".什么叫全局的?全局的属性,全局的方法,全局的代码块. 全局属性,全局方法,比较好理解就是这个类所有的对象都共有的属性和方法.因为是整个类共有的,所以可以通过声明直接调用.我把它理解为"单例模式"的属性和方法.所谓单例模式就是指这个类声明的所有对象共享这些属性和方法.一个对象对这个属性进行了修

  • Java实例化一个抽象类对象的方法教程

    前言 最近在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然有构造方法,又不可以通过new来创建,那么抽象类在没变成具体类的时候究竟可不可以实例化呢? 在Java 中抽象类是不能直接被实例化的.但是很多时候抽象类的该特点成为一个比较麻烦的阻碍.例如如果我想使用动态代理来给一个抽象类赋予其执行抽象方法的能力,就会有两个困难:1. 动态代理只能创建实现接口的一个代理对象,而不能是一个继承抽

  • Java中类的定义与实例化详解

    类的定义 面向对象的程序设计中,类可以看作是我们自定义的数据类型,那么,如何能更加优美,更加高效地定义它就显得尤为重要. 类中的成员有很多,每一部分都是十分关键的,毕竟"面向对象"在Java学习中真的很重要,许许多多的Java开发者定义出来的类等待着我们去使用,加油!攻克它! 直接上代码: package com.my.pac02; /** * @author Summerday * @date 2019/11/26 21:40 */ //类名和文件名一致,且包含main方法 publ

  • Java中类赋值的解释实例详解

    Java中类赋值的解释实例详解 Java是面向对象的存储语言,进行的是信息的传递,也就是类的赋值,实际上他们占用的是同样的存储空间: 下面上一个自己写的例子: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • Java 方法的定义与调用详解

    目录 1.方法概述 2.方法的定义和调用 2.1 方法定义 2.2 方法调用 2.3 方法的调用过程 2.4 方法练习 3.带参数方法的定义和调用 3.1带参数方法定义 3.2带参数方法调用 1.方法概述 什么是方法 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有图书功能的代码集 注意: 方法必须先创建才可以使用,该过程称为方法定义 方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用 2.方法的定义和调用 2.1 方法定义 格式: public stat

  • Java对象数组定义与用法详解

    本文实例讲述了Java对象数组定义与用法.分享给大家供大家参考,具体如下: 所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组里面的每一个对象都是null值,则在使用的时候数组中的每一个对象必须分别进行实例化操作. 对象数组的声明 先定义,再开辟空间 类名称 对象数组名[] = null; 对象数组名 = new 类名称[长度]; 定义并开辟数组 类名称 对象数组名[] = new 类名称[长度]; 在声明对

  • java泛型类的定义与使用详解

    本文为大家分享了java泛型类的定义与使用的具体代码,供大家参考,具体内容如下 当类中要操作的引用数据类型不确定时,可以定义泛型类完成扩展.下面是程序演示. package packB; class Student { //定义学生类 public String st = "student"; } class Worker { //定义工人类 public String wo = "worker"; } //定义泛型类 class Operate<type&g

  • Java中类的定义和初始化示例详解

    类的定义 类的定义格式 //创建类 class ClassName{ field ://成员属性/字段 method://方法 } class为定义类的关键字,ClassName为类的名字,{ }为类的主体: 例如: class Person{ public String name ; //成员属性 public int age; public void eat(){ // 方法 System.out.println("吃饭!"); } } 类的成员 类的成员包含,字段(成员变量),方

  • Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解

    本文实例讲述了Python面向对象程序设计中类的定义.实例化.封装及私有变量/方法.分享给大家供大家参考,具体如下: 1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def __func1(self): print("MyClass类的私有方法被调用!") def print_data(self): s

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java开发中synchronized的定义及用法详解

    概念 是利用锁的机制来实现同步的. 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问.互斥性我们也往往称为操作的原子性. 可见性:必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致. 用法 修饰静态方法: //同步静态方法 public synchronized

  • Java带返回值的方法的定义和调用详解

    目录 带返回值的方法练习 方法的注意事项 方法注意事项 方法通用格式 带返回值的方法练习 需求: 设计一个方法可以获取两个数的较大值,数据来自于参数 思路: 1. 定义一个方法,用于获取两个数中的较大数 public static int getMax(int a,int b){ } 2.使用分支语句分两种情况对两个数的大小进行处理 if (a>b) { }else{ } 3. 根据题设分别设置两种情况下对应返回值结果 if (a>b) { return a; }else{ return b;

随机推荐