类与对象
1.什么是类?
类是一组相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述此类事物
2.什么是对象
一类事物的具体体现,对象是类的一个实例,必然具备该类事物的属性和行为。
3.类与对象的关系
类是对一类事物的描述,是抽象的
对象是一类事物的实例,是具体的
类是对象的模板,对象是类的实体
类的定义
事物与类的对比
现实世界的一切事物,
属性:事物的信息状态;行为:事物能够做什么
java 中用class 描述事物也是如此
成员变量:对应事物的属性,成员方法:对应事物的行为
类的定义格式
public class className{
//成员变量
//成员方法
}
定义类:就是定义类的成员,包括成员变量和成员方法
成员变量:和以前定义的变量完全一样,只不过是位置发生了改变,在类中方法外。
成员方法:和以前定义方法几乎是一样的,只不过是把static 去掉
类定义的格式举例
public class Student{
//成员变量
String name;
int age;
//成员方法
public void study(){
System.out.println("好好学习");
}
public void eat(){
System.out.println("好好吃饭");
}
}
对象的使用
对象的使用格式
创建对象
类名 对象名 = new 类名();
使用对象访问类中的成员方法及成员变量
对象名.成员变量;
对象名.成员方法();
对象的使用举例格式
public class Test_Student{
public static void main(String[] args){
Student s = new Student();
//直接输出成员变量
System.out.println(s.name);
s.name("张俊杰");
s.age(18);
//调用成员方法
s.study();
s.eat();
}
}
成员变量的默认值
类与对象的练习
定义手机类
public class Phone{
String brand;// 品牌
int price; // 价格
String color ; 颜色
//成员方法
//打电话
public void call(String name){
System.out.println("给"+name+"打电话");
}
//发短信
public void sendMessage(){
System.out.println("发短信");
}
}
定义测试类
public class Test02Phone{
public static void main(String[] args){
//创建对象
Phone p= new Phone();
// 输出成员变量的值
System.out.println(p.brand);
System.out.println(p.price);
System.out.println(p.color);
p.brand="锤子";
p.price=12.9;
p.color="橙色";
//调用成员方法
p.call();
p.sendMessage();
}
}
对象的内存图
两个对象,调用同一方法的内存图
成员变量和局部变量的区别
1.定义的位置不同
- 成员变量:类中,方法外
- 局部变量:方法中,或者方法声明上(形式参数)
2.作用范围不一样
- 成员变量:类中
- 局部变量:方法中
3.初始化值不同
- 成员变量:有默认值
- 局部变量:没有默认值,必须先定义,赋值,最后使用
4.在内存中的位置不同
- 成员变量:堆内存
- 局部变量:栈内存
5.生命周期不同
- 成员变量:随对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
封装
原则:将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。
封装的步骤:
- 使用private 关键字来修饰成员变量
- 对需要访问的成员变量,提供对应的一对getXXX 和setXXX 方法
封装的操作
private 的含义
1.private 是一个权限修饰符,代表最小权限
2.可以修饰成员变量和成员方法
3.被private 修饰后的成员变量和成员方法,只有在本类中才能访问
private 的使用格式
private 数据类型 变量名;
1.使用private 修饰成员变量,代码如下:
public class Student{
private String name;
private int age;
}
2.使用getXXX和setXXX 方法
public class Student{
private String name;
private int age;
public void setName(String n){
name = n;
}
public String name(){
return name;
}
public void setAge(int a){
age = a;
}
public int age(){
return age;
}
}
封装优化关键字this
this代码所在类当前对象的引用(地址值)即对象自己的引用。
方法被哪个对象引用,方法中的this 就代表那个对象,即谁在调用,this就代表谁。
this 的使用格式
this.成员变量名;
使用this修饰方法中的变量,解决成员变量被隐藏的问题,代码如下。
public class Student{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String name(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int age(){
return age;
}
}
方法中只有一个变量名时,默认也是使用this修饰,可以省略不写。
封装优化方法2-- 构造方法
当一个方法被创建的时候,构造方法用来初始化对象,给对象的成员变量赋值初始。
无论你是否自定义构造方法,所有类都有构造方法,因为Java自动提供了一个午餐构造方法,一旦自己定义了构造方法,Java 默认提供的无参构造方法就会自动失效。
构造方法的定义格式
修饰符 构造方法名(参数列表){
// 方法体
}
构造方法的写法上,方法名和它所在的类名相同,它没有返回值,所以不需要返回值类型,甚至不需要void ,使用构造方法后代码如下:
public class Student{
private String name;
private int age;
//无参构造方法
public Student(){ }
//有参构造方法
public Student(){
this.name=name;
this.age=age;
}
}
注意事项
1.如果你提供构造方法,系统会自动提供无参构造方法
2.如果你提供了构造方法,系统将不再提供无参构造方法
3.构造方法是可以重载的,即可以定义参数也可以不定义参数
标准代码
JavaBean 是java 语言编写类的一种规范,符合JavaBean的类,要求类必须是具体的公共的,并且具有无参的构造方法,提供用来操作成员变量的get 和set方法。
编写符合JavaBean 规范的类,以学生类为例,标准代码如下。
public class Student{
//成员变量
private String name;
private int age;
//构造方法
public Student(){}
public Student(String name,int age){
this.name=name;
this.age=age;
}
//成员方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.name=name;
}
public int getAge(){
return age;
}
}
测试类,代码如下
public class TestStudent{
public static void main(String[] args){
//无参数构造的使用
Student s = new Student();
s.setName("张俊杰");
s.setAge(11);
//有参构造的使用
Student s = new Student("张俊杰",18);
}
}