Java类和对象怎么定义?新手必看的类与对象创建教程

 更新时间:2026年08月25日 10:43:36   作者:haozigegie  
还在为Java类和对象发愁?本文用最接地气的方式讲透类定义、对象创建、内存分配、public/private/protected封装区别,以及构造方法和this关键字的使用,帮你快速掌握Java面向对象基础

对象和类

类的定义

  • Java程序至少由一个或一个以上的类构成,但只有一个公有类,即使用public关键字修饰的类的名称必须跟和程序文件名称一致。
  • 类是由方法成员和数据成员组成

使用类创建对象

创建对象

 创建对象的内存分配

实例

/*

定义类,一个Java程序可以定义多个类,但只能定义一个与程序名称相同的公有类
[修饰符] Class 类名{
	
	数据成员;
	.
	.
	.
	方法成员;
	.
	.
	.
	
}
 
*/
class Student{
	int age;
	String name;
	char gender;
	double score;
	
	void msgPrintf(){
		System.out.println("name is " + name);
		System.out.println("age is " + age);
		System.out.println("gender is " + gender);
		System.out.println("score is " + score);
	}
} 


public class Demo1 {
	public static void main(String[] args) {
		
		//创建对象
		//方式1:先声明再使用new关键字创建
		Student s1;  //声明某个对象属于某个类:类名 对象名;
		s1 = new Student();  //使用new关键字创建对象
		
		s1.age = 20;
		s1.name = "jiangxiaoya";
		s1.gender = '女';
		s1.score = 99.9;
		s1.msgPrintf();
		System.out.println();
		
		//方式2:声明对象的同时并使用new关键字创建对象
		Student s2 = new Student();
		s2.age = 21;
		s2.name = "haozige";
		s2.gender = '男';
		s2.score = 66.6;
		s2.msgPrintf();
		System.out.println();
		
		//方式3:不声明对象,直接使用new关键字,该方式无法向方法传参
		new Student().age = 18;
		new Student().name = "zhutoucai";
		new Student().gender = '女';
		new Student().score = 88.8;
		new Student().msgPrintf();
	}	
}

类的成员封装

public公有封装

  • 定义类时,类的数据成员或方法成员使用public关键字修饰
  • 这种封装下的成员允许任何类访问 

private私有封装

  • 定义类时,类的数据成员或方法成员使用private关键字修饰
  • 这种封装下的成员只允许自身所在的类进行访问,其他类不能访问

protected保护封装

  • 定义类时,类的数据成员或方法成员使用protected关键字修饰
  • 这种封装下的成员只允许自身所在的类或者继承自身类的子类或者同一个包中的类进行访问,其他类不能访问

不进行封装

  • 定义类时,类的数据成员或方法成员不使用任何关键字修饰
  • 同一个包中的类能进行访问

实例

class Student{
	//private关键字,只有该类才能访问,私有成员
	//public关键字,该类或非该类均可以访问,公有成员
	//protected关键字,该类及其子类的成员可以访问,同一个包中的类也可以访问
	//默认,同一个包中的类可以访问
	
	private int age;  //私有成员
	protected String name;  //保护成员
	char gender;
	double score;
	
	void msgPrintf(){
		System.out.println("name is " + name);
		System.out.println("age is " + age);
		System.out.println("gender is " + gender);
		System.out.println("score is " + score);
	}
	
	void inputAge(){
		age = 21;
	}
} 


public class Demo1 {
	public static void main(String[] args) {
		
		Student s2 = new Student();
		//s2.age = 21;  由于Student类中的数据成员age是私有成员,因此不能直接访问它
		s2.inputAge();  //间接访问私有成员
		s2.name = "haozige";  //同一个包中的类也能访问保护成员
		s2.gender = '男';
		s2.score = 66.6;
		s2.msgPrintf();
		System.out.println();
		

	}	
}

构造方法

构造方法主要用于在使用new关键字创建对象时同时传递参数进行数据成员的初始化

定义构造方法

构造方法在定义类中定义
类名称(参数列表){
       赋值语句;
}

使用构造方法

类名称 对象名 = new 类名称(参数列表)

实例

class Student{
	private int age;  //即使是私有成员,在创建对象时一样能进行初始化
	String name;
	char gender;
	double score;
	
	void msgPrintf(){
		System.out.println("name is " + name);
		System.out.println("age is " + age);
		System.out.println("gender is " + gender);
		System.out.println("score is " + score);
	}
	
	//构造方法1
	Student(int newage,String newname,char newgender,double newscore){
		age = newage;
		name = newname;
		gender = newgender;
		score = newscore;
	}
	
	//构造方法一样可以进行方法重载
	Student(int newage,String newname){
		age = newage;
		name = newname;

	}
}

public class Demo3 {
	public static void main(String[] args) {
		
		//创建对象时想同时传递参数进行数据成员的初始化时可以使用构造方法
		Student s1 = new Student(21,"haozige",'男',66.6);  //对应定义类Student的构造方法1
		s1.msgPrintf();
		System.out.println();
		
		Student s2 = new Student(20,"jiangxiaoya");  //对应定义类Student的构造方法2
		s2.msgPrintf();
	}
}

this关键字

  • this关键字调用本类数据成员或者方法
  • this关键字在构造方法首条语句调用其他构造方法
  • this关键字解决方法中数据成员变量命名冲突的问题
  • this关键字看作一个变量时,值为调用此方法的对象 

实例

class Student{
	int age;
	String name;
	int sex;
	double sorce;
	
	//构造方法1
	Student(){
		System.out.println("我是构造方法1");
	}
	
	//构造方法2(方法重写)
	Student(int age,String name,int sex,double sorce){
		this();  //在构造方法中使用this关键字调用其他构造方法
		
		//this关键字解决形参同名的问题
		this.age = age;
		this.name = name;
		this.sex = sex;
		this.sorce = sorce;
	}

	void msgPrintf(){
		System.out.println(this.age);  //this关键字调用本类的数据成员或者方法
	}
	
	void myPrintf(){
		
		this.msgPrintf();  //this关键字调用本类的数据成员或者方法
		
		//this关键字看作一个变量,值为为调用此方法的对象
		Student stutmp = this; 
		System.out.println(stutmp.name);
		
	}
}

public class Text {
	public static void main(String[] args) {
		Student stu1 = new Student(20,"jiangxiaoya",0,99.5);
		
		stu1.myPrintf();
		
	}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • StringUtil.isEmpty()与StringUtil.isBlank()的区别及说明

    StringUtil.isEmpty()与StringUtil.isBlank()的区别及说明

    文章介绍了Apache Commons Lang库中的StringUtils类,详细说明了isEmpty()、isNotEmpty()、isBlank()和isNotBlank()四个方法的区别和使用场景,并强调了在实际开发中,isBlank()方法最为常用,同时建议了解每个方法的原理和适用情况
    2025-10-10
  • Spring Cloud Stream实现数据流处理

    Spring Cloud Stream实现数据流处理

    Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处理,本文给大家介绍了Spring Cloud Stream实现数据流处理,需要的朋友可以参考下
    2024-11-11
  • Java的异常处理体系详解

    Java的异常处理体系详解

    这篇文章主要介绍了Java的异常处理体系,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中的动态代理使用

    Java中的动态代理使用

    这篇文章主要介绍了Java中的动态代理使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring mvc AJAX技术实现原理解析

    Spring mvc AJAX技术实现原理解析

    这篇文章主要介绍了Spring mvc AJAX技术实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • mybatis <foreach>标签动态增删改查方式

    mybatis <foreach>标签动态增删改查方式

    这篇文章主要介绍了mybatis <foreach>标签动态增删改查方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅谈spring中scope作用域

    浅谈spring中scope作用域

    这篇文章主要介绍了浅谈spring中scope作用域,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringCloud+RocketMQ实现分布式事务的实践

    SpringCloud+RocketMQ实现分布式事务的实践

    分布式事务已经成为了我们的经常使用的。所以我们来一步一步的实现基于RocketMQ的分布式事务。感兴趣的可以了解一下
    2021-10-10
  • Spring Boot定时+多线程执行过程解析

    Spring Boot定时+多线程执行过程解析

    这篇文章主要介绍了Spring Boot定时+多线程执行过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java递归算法详解(动力节点整理)

    Java递归算法详解(动力节点整理)

    Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相关知识,感兴趣的朋友一起学习吧
    2017-03-03

最新评论