类和对象
什么是类
类是一组相关属性和行为的集合,可以看作是一类事物的模板,比如说:无论中年人、老年人还是小孩,都有身高、体重(这是属性),都会吃饭、睡觉(这是行为),那么我们就可以抽取出这些共有的属性和行为,封装为一个类。类由两部分组成:
- 属性:事物的状态信息
- 行为:事物能够做啥
什么是对象
对象是某类事物的具体体现,对象是类的一个实例,比如说:一株蒲公英是植物类的具体实例。
对象和类的关系
- 类是对象的抽象
- 对象是类的具体
类的定义
格式
修饰符 class关键字 类名{
//成员变量(属性)
//成员方法(行为)
}
定义类
public class Student{
String name;//姓名
int age;//年龄
//吃饭
public void eat(){
System.out.println("吃饭");
}
}
Student是类名,name和age是成员变量(属性),定义的方式和声明普通变量一样;eat是成员方法(行为)。
创建和使用对象
格式
类名 对象名=new 类名();
public static void main(String[] args){
//创建Student类实例
Student s=new Student();
//使用成员变量
System.out.println(s.name);//null
System.out.println(s.age);//0
//调用eat方法
s.eat();
}
成员变量的默认值
如果没有对成员变量进行赋值的话,那么将会使用它们的默认值
public class Student {
int age;
float weight;
char sex;
boolean isMan;
String name;
public void eat(){
System.out.println("吃饭");
}
public static void main(String[] args) {
Student s=new Student();
System.out.println(s.age);//0
System.out.println(s.weight);//0.0
System.out.println(s.isMan);//false
System.out.println(s.name);//null
System.out.println(s.sex=='u0000');//true
}
}
局部变量
局部变量在方法内部定义
public class Student {
int age;
public void say(){
//定义局部变量a
int a=1;
System.out.println(a);
}
//形参也是局部变量
public void hel(int a){
System.out.println(a);
}
}
成员变量和局部变量的区别
-
在类中的位置不同
成员变量定义在类中、方法外
局部变量定义在方法中或方法声明上(形参)
-
作用范围不同
成员变量作用范围是整个类
局部变量的作用范围是它所在的方法
public class Student { int age; public void say(){ //定义局部变量a int a=1; System.out.println(age); System.out.println(a); } public void hel(){ System.out.println(age); //System.out.println(a); 无法访问到a } }
-
是否有默认值
成员变量有默认值
局部变量没有默认值,必须定义赋值,然后使用
public void say(){ int a; //System.out.println(a); 未赋值无法使用 }
-
在内存的位置
成员变量在
堆内存
中局部变量在
栈内存
中 -
生命周期不同
成员变量随着对象的创建而存在,随着对象的消失而消失
局部变量随着方法的调用而存在,方法调用完毕它便消失
封装概述
封装是指将数据和操作数据的方法绑定起来,对数据的访问只能通过定义的接口。我们在类中编写的方法就是对实现细节的一种封装;我们编写的类就是对数据和数据操作的封装。
封装步骤
-
使用
private
修饰符将变量修饰为私有变量(只有本类中可以访问) -
对外提供公有的可以访问私有变量的方法,如getXXX()方法和setXXX()方法
public class Test1 { public static void main(String[] args) { Person p=new Person(); //System.out.println(p.name); 无法直接访问 System.out.println(p.getName());//null 只能通过对外提供的接口进行访问 } } class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
注意
一个.java文件中可以定义多个类,但是只能有一个类使用public修饰符
this关键字代表正在操作的那个对象,this.name表示该对象的成员变量name,区别于局部变量name
构造方法
我们知道,想要使用对象内的东西,必须要先使用new关键字创建对象,那么它是怎么创建出来的呢?答案就是构造方法,可是我们的类中没有定义构造方法啊?虽然没有定义,但是我们每个类都有一个默认值的无参构造方法,我们在new对象的时候就会调用构造方法。那么我们该如何定义自己的构造方法呢?
格式
【修饰符】 类名(【参数列表】){
//代码
}
注意点
- 构造方法的名字必须和类名一致
- 构造方法没有返回值(其实是省略了,因为构造方法只能返回本类的类型)
- 一旦自己DIY了构造方法,那么默认的无参构造方法就无效了
- 没有参数列表的是无参构造方法,有参数列表的是有参构造方法
- 我们可以在一个类中定义多个构造方法
public class Test1 {
public static void main(String[] args) {
//使用无参构造创建对象
Person p1=new Person();
//使用有参构造创建对象
Person p2=new Person("张三");
}
}
class Person{
private String name;
private int age;
//无参构造方法
public Person(){
System.out.println("我是无参构造方法");
}
//我是有参构造方法
public Person(String name){
System.out.println(name);
System.out.println("我是有参构造方法");
}
}
执行结果:
我是无参构造方法
张三
我是有参构造方法
使用构造实现封装
前面通过编写setXXX
方法和getXXX
方法以及私有化成员变量实现封装,这里我们通过构造方法实现封装
class Person{
private String name;
private int age;
//无参构造方法
public Person(){
System.out.println("我是无参构造方法");
}
//我是有参构造方法
public Person(String name,int age){
System.out.println("我是有参构造");
this.name=name;
this.age=age;
}
}
public class Test1 {
public static void main(String[] args) {
//使用无参构造创建对象
Person p1=new Person();
//使用有参构造创建对象
Person p2=new Person("张三",23);
}
}
我们无法访问对象的成员变量(属性),只能通过构造进行访问
JavaBean
JavaBean是java语言编写类的一种
标准规范,符合
JavaBean`的类必须要满足以下条件:
- 类必须是具体和公开的(使用public修饰)
- 类必须有无参构造方法(有参构造建议加上)
- 必须要有操作成员变量的
setXXX
方法和getXXX
方法
class Person{
private String name;
private int age;
//无参构造方法
public Person(){
System.out.println("我是无参构造方法");
}
//我是有参构造方法
public Person(String name,int age){
System.out.println("我是有参构造");
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
最后
感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!