一、类与对象的概念
1.类
- 类是对具有共性事物的抽象描述,是在概念上的一个定义,是人类实际抽象出来的结果,实际上是不存在的。比如(成绩管理系统:学生类、班级类、课程类、成绩类,这是人类通过智慧定义的名字,是抽象的名字)
2.对象
//某一个类的对象
学生---jack
班级---3年2班
课程---J2SE
成绩---jack成绩
- 以上“jack”、“3年2班”、“J2SE”和“jack成绩”他们是具体存在的,称为对象,也叫实例。也就是说一个类的具体化或者说成实例化(学生类对应jack对象,班级类对应3年2班对象,课程类对应J2SE对象,成绩类对应jack成绩对象),就是对象或者说是实例
- 对象与对象之间具有共同特征,每个特征对应的具体值不一样(比如,姚明和身高正常的人,有高度这个共同特征,高度所对应的具体值不一样,所以要想访问高度这个属性,不能通过人这个类直接去访问,而是通过先有对象才能访问高度这个属性)
3.总结
- 一般来说,从类到对象是实例的过程,从对象到类的过程是抽象的过程
- 因为一波对象的存在,这一波对象的共同特征进行抽象这种概念叫做类
- 类经过实例化、经过具体化就形成了对象,对象是实际存在的个体
二、类的定义
1.语法
public class 类名{
//属性
// 方法
}
- 一个类就是一个数据类型,定义一个类就是创建了一种类型,该类型为引用类型
- 一个文件(xxx.java)可以定义多个类,但是只能有一个public修饰的类,并且此类名与文件名相同
2.属性
- 属性来源于类的特征(比如学生类属性可以是名字,性别,地址,这些属性都是静态的)
- 定义方法:
数据类型 属性名;
- 命名要规范,可以使用驼峰命名法
3.方法
- 方法来源于行为(比如学生类可以唱,跳,打篮球)
- 定义方式:
public 返回类型 方法名(参数 ){
具体代码
}
4.总结
- 类 = 属性 + 方法
三、对象的创建和使用
1.创建对象
- 创建对象语法:
类型 对象名 = new 类型();
2.程序案例
- 主程序
package 类与对象;
public class Test {
//一个类可以创建N个对象,成员变量只属于当前的对象(只属于对象,不属于类),
// 只有通过对象才可以访问成员变量,通过类不能直接访问成员变量
public static void main(String[] args) {
//1.创建Student类型的对象
//new Student()创建对象,stu1是一个局部变量,这个局部变量的类型是Student类型,也就是一个引用类型
//stu1该局部变量称作引用,引用中保存了对象在堆中的内存地址
//通过”引用.“去间接访问堆中的对象
Student stu1 = new Student();
//一个类可以创建多个对象
Student stu2 = new Student();
//2.使用对象
//访问成员变量,必须使用“引用.”
//name是成员变量,对象相关,必须先有对象才能访问,必须使用“引用.”
//包装类的默认值都为null
//读取过程
System.out.println("id=" + stu1.getId());
System.out.println("name=" + stu1.getName());
System.out.println("sex=" + stu1.getSex());
System.out.println("age=" + stu1.getAge());
System.out.println("address=" + stu1.getAddress());
//赋值
stu1.setId(1001);
stu1.setName("tom");
stu1.setSex(true);
stu1.setAge(20);
stu1.setAddress("江苏-xxx");
System.out.println("----------------------");
System.out.println("id=" + stu1.getId());
System.out.println("name=" + stu1.getName());
System.out.println("sex=" + (stu1.getSex()?"男":"女"));
System.out.println("age=" + stu1.getAge());
System.out.println("address=" + stu1.getAddress());
}
}
- Student类
package 类与对象;
import java.util.Date;
//定义现实世界中的学生类型
//Student是一个类,一种引用类型
//概念上的一个定义,现实世界中不存在,是人类自己定义的类的名字
public class Student {
//属性
//成员变量(实例变量),非静态变量
//id是对象的级别的,必须先有对象才能访问,不能使用类直接访问
//private修饰的数据只能在本类中访问
private Integer id;
private String name;
private Boolean sex;
private Integer age;
private String address;
public Student() {
}
public Student(Integer id, String name, Boolean sex, Integer age, String address) {
//id是属性中的私有id,this.id是该构造方法中Integer id的值,两个值不一样
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
}
public Integer getId() { //成员方法,实例方法,非静态方法
//成员方法必须使用”引用.“的方法进行访问
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 输出结果
id=null
name=null
sex=null
age=null
address=null
----------------------
id=1001
name=tom
sex=男
age=20
address=江苏-xxx
3.执行流程原理及图示
- new出来的东西统一在堆内存中开辟空间来存储,开辟的这个空间属于Student类型的空间,Student对象就有了
- Student这个对象在堆内存中有它自己的内存地址,这个内存地址赋给了局部变量stu1,所以stu1有可能存储的是0x1234这样的内存地址
- 这个stu1局部变量保存的内存地址0x1234指向堆中的这个对象,将来我们想访问这个对象中的数据,是通过内存地址去访问它,所以通常情况下我们是通过地址去访问对象里面的属性和方法(比如你去故宫,肯定是顺着地址去找故宫)
4.额外补充知识点
- stu1这个局部变量专业术语被称为引用,引用中保存的是内存地址
- java中new出来的数据都被放到堆中,在堆中开辟空间,程序员无法对堆中的数据直接操作,只能通过内存地址间接操作它,stu1保存的内存地址指向堆中的这个对象
- 学生对象创建出来以后,里面有成员变量,是对象相关的。成员变量在堆中的对象中存储。局部变量在栈中如Student stu1 = 0x1234;
- 成员变量如果没有手动为它们赋值,系统则会默认赋值(包装类的默认值都为null)
- 局部变量是在方法里面定义的
5.总结
- 必须先有对象才能访问成员变量,必须使用“引用 .”的形式
- 程序员无法对堆内存中的数据直接操作,只能通过内存地址间接操作
四、面向对象的封装性
1.什么是对象的封装
- 将类中的属性封装在类中,不允许在类的外部直接访问,保证数据安全性
- 只能通过特定的方法才能对数据进行访问
- 类的基本原则就是封装
2.实现方式
- 将属性私有化,使用private修饰属性
- 对外提供公开set和get方法,用来对对象属性进行赋值和取值
- 一般使用快捷键自动生成 set和get方法
- 贴其中的一个属性的set和get方法
public Integer getId() { //成员方法,实例方法,非静态方法
//成员方法必须使用”引用.“的方法进行访问
return id;
}
public void setId(Integer id) {
this.id = id;
}
3.总结
- 通过上面Student类的代码,可以看出
- 属性中的(id,name,sex.age.address)是对象的级别的,必须先有对象才能访问,不能使用类(Student)直接访问
- private修饰的数据只能在本类中访问
- 在Student类的有参构造方法中,id是属性中的私有id,this.id是该构造方法中Integer id的值,两个值不一样
以上是在学习过程中总结的,若有不正之处,请多多谅解并欢迎批评指正,不甚感激