Java中类的定义与实例化详解
作者:sumerday 发布时间:2022-10-25 23:18:43
类的定义
面向对象的程序设计中,类可以看作是我们自定义的数据类型,那么,如何能更加优美,更加高效地定义它就显得尤为重要。
类中的成员有很多,每一部分都是十分关键的,毕竟“面向对象”在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讲义》
来源:https://www.cnblogs.com/summerday152/p/11954197.html
猜你喜欢
- 前言有时候我们会在属性注入的时候添加@Lazy注解实现延迟注入,今天咱们通过阅读源码来分析下原因一、一个简单的小例子代码如下:@Servic
- 首先,必须要强调的一点,MD5不是加密算法,而是消息摘要算法,具有不可逆性。字符串通过MD5处理后会生成128位的二进制串。我们通常会将其转
- 错误Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就
- 概述Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,
- idea手动刷新git分支相信很多小伙伴都遇到过这样的问题,在git上新建的分支却在idea的git分支中找不到又不知在哪里刷新,博主最近也
- java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。理论先拙劣的表达一下jvm虚拟内存分布:程序计数器是j
- 数组array和集合的区别:(1) 数值是大小固定的,同一数组只能存放一样的数据。(2) java集合可以存放不固定的一组数据(3) 若程序
- 本文实例讲述了java和c#使用hessian通信的方法,是非常实用的技巧。分享给大家供大家参考。具体分析如下:首先,hessian主页为:
- SpringBoot web项目启动后立即关闭我们在写spring boot web项目时,有时会遇到启动后立即关闭的情况,或者是无法加载某
- 本文实例为大家分享了java实现人员信息管理系统的具体代码,供大家参考,具体内容如下实现增删改查.java入门的练手小程序1.Person类
- 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制
- 1.封装分页Page类package com.framework.common.page.impl;import java.io.Seria
- 这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 前文本章是关于Java流程控制语句的最全汇总,本篇为汇总上篇。流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事。比如出
- 一、简介Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将
- 注:作者使用IDEA + Gradle注:需要有一定的java SpringBoot and SSM+Springcloud基础程序测试错误
- 去公司面试,对方一口一个controller,一口一个service,dao,搞得我很紧张。其实都是很简单的东西,只是自己当时不知道罢了,接
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系
- 背景:本人不是Java开发人员,经过四年多的历练,可以说是一枚BI攻城师了吧,最近粗糙的写了一个Portal来集成cognos报表,下面就入
- 一、解决的痛点 1、免搭建后端开发环境。 &n