欢迎来到南方有乔木的博客!!!
博主主页:点击点击!戳一戳!!
博主名:南方有乔木呀
博主简介:
一名在校大学生,正在努力学习Java语言编程。穷且意坚,不坠青云之志,希望能在编程的世界里找到属于自己的光。
跪谢帅气or美丽的朋友们能够帮我点赞! 请对文中内容请多多指教!!!
目录
前言
本次博客内容为类和对象,博主在学习过程中对类与对象进行了总结,跟随博主来看看类和对象吧!!
众所周知,语言有面向对象和面向过程之分,Java属于一门面向对象的语言,那么什么是面向对象呢?本文将详细阐述对于Java中的类和面向对象作详细的描述与编程用法。
一.面向对象
1.面向对象概念
面向对象是是解决问题的一种思想,利用事物对象之间的交互来解决问题,更符合人们对于事物的认知,对于程序的扩展和维护也非常友好。
2.面向对象与面向过程
面向对象注重的是对象之间的交互,而面向过程注重的是完成一件事情的过程,比如,就洗衣服这件事而言,用面向对象的思想来解决,用洗衣机这件事主要有四个对象,人,洗衣机,洗衣服粉,衣服。面向对象通过这四个对象之间的交互来完成洗衣服这件事情,但不关心衣服到底具体是怎么洗的,只需要人把衣服洗衣粉放进洗衣机完成事物之间的交互即可。
而用面向过程的思想来解决洗衣服这件事,它主要注重的是洗衣服的过程,比如人怎么拿衣服,怎么放进洗衣机,洗衣机怎么洗,怎么甩干,人怎么用洗衣粉搅拌等等这些过程。
这些就是面向对象与面向过程的区别。
二.类的总结
什么是类?要完成面向对象之间的交互,Java中把同一类事物划分为一个类。
类的概念:类是具有相同属性或者行为的对象的统称,可以用来描述每一个具体的对象。
比如,人类,鸟类,狗类等。
在一个Java类中有:
class 类名 {
字段/属性/成员变量
行为/功能/成员方法
}
示例
洗衣机
属性(字段/成员变量):
品牌 型号 尺寸 外观颜色
功能(行为/成员方法):
洗衣功能 甩干功能 定时功能 干洗功能
类的成员:类的成员分为普通成员变量和静态成员变量
- 静态成员变量不属于任何一个对象,由所有的对象共享,不依赖对象,属于类
- 静态成员变量可以通过类名访问,也可以通过对象访问,但我们一般是通过类名访问。
- 静态成员变量不在堆区,而是在方法区,普通成员变量在堆区
- 普通的方法里面,不能定义静态的变量
- 静态的方法里面,也不能定义静态的变量
静态成员变量
访问示例:
public class Student {
public String name;
public String gender;
private int age;
private double score;
public static String classRoom="三栋305";//教室属于每个学生对象共享
//但又不属于任何一个对象 用static修饰为静态成员变量
public Student(String name, String gender, int age, double score) {
this.name = name;
this.gender = gender;
this.age = age;
this.score = score;
}
public static void main(String[] args) {
System.out.println(Student.classRoom);//静态成员变量通过类名访问
Student stu1=new Student("张三","男",18,4.5);
Student stu2=new Student("李四","男",19,3.9);
Student stu3=new Student("王五","女",20,4.8);
System.out.println(stu1.classRoom);//静态成员变量可通过每个对象访问
System.out.println(stu2.classRoom);//静态成员变量由三个对象共享
System.out.println(stu3.classRoom);
}
}
成员方法也一样,分为静态成员方法和普通成员方法。
静态成员方法也称类方法,也可通过类名访问。
静态方法内部不能调用普通方法
普通方法里可以调用静态方法
三.类的语法格式
在Java中类的定义要使用到class关键字。
示例
class className{
filed //字段/属性/成员方法
method //行为/功能/成员变量
}
class是定义类的关键字,className是类的名字。一个具体的对象,具有属性和功能,像洗衣机有品牌,颜色等属性,还有洗衣,甩干,定时等功能,字段/属性/成员变量 加上行为/功能/成员方法,就可以用来描述一个具体的对象。
四.类的使用
1.使用示例一
定义一个狗类:
//定义一个狗类
class PetDog {
public String name;//名字 这里属于字段/属性/成员变量
public String color;//颜色
public String gender;//性别
public static void barks() //这里是行为/功能/成员方法
{
System.out.println("汪汪汪!");
}
public static void wag()
{
System.out.println("摇尾巴!");
}
}
2.使用示例二
定义一个学生类:
public class Student { //public表示公共类
public String name; //字段/属性/成员变量
public short age;
public String gender;
public double score;
public void doClass() //行为/功能/成员方法
{
System.out.println("按时上课!");
}
public void doHomework()
{
System.out.println("按时做家庭作业!");
}
public void eaxm()
{
System.out.println("按时考试!");
}
}
类使用的总结
1.类的命名使用大驼峰命名法
2.类的成员方法使用小驼峰命名法
3.public修饰的类必须要和文件名相同(即类名必须要和文件名相同)
4.一般我们在一个.java源文件中只定义一个类,如果一定要在一个文件中定义多个类,那么,只能有一个public类型的类,其他的可以是default类型。
5.类就是一种自定义类型,同时也是引用数据类型
六.类的实例化
概念:类是一种自定义类型,用来描述对象有哪些属性,可以用来实例化对象,就像是一个模具一样。
用类创建对象的过程,叫做类的实例化。类的实例化相当于按照房子图纸造出相应的房子,或者按照模具造出相应的物品。
public class PetDog {
public String name;
public String color;
public void barks() {
System.out.println(name+"汪汪汪!");
}
public void wag() {
System.out.println(name+"摇尾巴!");
}
public static void main(String[] args) {
PetDog petdog=new PetDog();
//实例化出了一个petdog对象
}
}
类属于引用数据类型,如果用类实例化了一个对象,比如:
Person person =new Person();
person是一个变量,里面保存的是一个地址。
类的实例化需要使用关键字new,一个类可以实例化出多个对象
Person person1 =new Person();
Person person2=new Person();
- 每实例化一个对象都要用到关键字new。
- 使用new关键字以后会在堆上给对象开辟空间
- 类本身不占据空间,实例化出的对象占据空间。
表示这个引用不指向任何对象:
Person person=null;
此外:
Person person=null ;
Person person =new Person();
Person person2=person;
person2这个引用指向person引用指向的对象,最终person 和person2都是指向同一个对象
一个引用不可以同时指向多个对象。
七.对象初始化
在创建对象以后可以对对象进行初始化
对象初始化示例:
public class PetDog {
public String name;
public String color;
public void barks() {
System.out.println(name+"汪汪汪!");
}
public void wag() {
System.out.println(name+"摇尾巴!");
}
public static void main(String[] args) {
PetDog petdog=new PetDog();
petdog.name="旺财";//初始化名字为旺财
petdog.color="棕色";//初始化颜色为棕色
petdog.barks();
petdog.wag();
}
}
八.this引用
概念:
this引用的是当前调用成员方法的对象
作用:当构造方法里成员变量与形参同名,可以使用this引用,并且可以指向当前对象,知道是哪个对象调用了成员方法
this的三种用法:
- this.成员属性 调用当前对象属性
- this.成员方法 调用当前对象方法
- this(x) 调用当前对象的其他构造方法
代码示例:
//this引用
public class Date {
public int year;
public int month;
public int day;
public void setDay(Date this,int year,int month,int day)//默认有一个参数this(Date this,int year,int month,int day)
{
this.year=year;
this.month=month;
this.day=day;
}
public void printDate()
{
System.out.println(this.year+"/"+this.month+"/"+this.day);
}
public static void main(String[] args) {
Date d=new Date();
d.setDay(2023,2,20);
d.printDate();
}
}
总结:
- 在静态方法中不能使用this引用
- 因为,静态方法没有第一个隐藏的this引用参数。
- 如果使用this()调用当前对象的构造方法,
- 那么在该方法里this()前不能有其他的代码,如果有其他的代码,就会报错。this()必须放到第一行。
- this()只能放在构造函数中
- this引用是每一个成员方法隐藏的第一个参数,在编译之后编译器会自动还原,我们平时在编写代码时一般不会写,因为代码编译后编译器会自动生成。
- this只能引用当前对象,不能引用其他对象。
九.构造方法(构造器)
概念:构造方法是一种特殊的成员方法,可以用来初始化成员变量,名字必须和类名相同,没有返回值类型,就算返回值类型甚至不能是void。
作用:构造方法是用来初始化对象的
public class Date {
public int year;
public int month;
public int day;
public Date(int year,int month,int day)
{
this.year=year;
this.month=month;
this.day=day;
System.out.println("Date方法被调用了!");
}
public void setDate()
{
System.out.println(year+"/"+month+"/"+day);
}
public static void main(String[] args) {
Date d=new Date(2022,7,21);
d.setDate();
}
}
构造方法总结:
- 构造方法是在创建对象的时候由编译器自动调用。
- 构造方法可以重载,重载时可以根据编程的需求设置不同的参数
- 如果编程时一旦手动编写构造方法,那么,编译器将不会再自动生成构造方法。
- 构造方法在创建对象时由编译器自动调用,且在对象的整个生命周期中只调用一次。
- 如果编程时没有显示定义构造方法,那编译器将会自动生成构造方法,但是,生成的构造方法一定是无参的。
- 在构造方法中,可以使用this调用其他构造方法来简化代码,但是,this引用必须是构造方法的第一条语句,但是,在构造方法中,this引用之前,不能有其他代码,否则就会编译报错。
就地初始化
概念:在声明成员变量之后,直接就给成员变量赋值
代码编译完成之后,编译器会自动的将这些成员变量赋值的语句添加到构造方法中。
使用示例:
public class Date {
public int year=2022;//就地初始化
public int month=7;
public int day=30;
public Date() {
}
public Date(int year,int month,int day)
{
}
public static void main(String[] args) {
Date date1=new Date();
Date date2=new Date(2000,1,30);
}
}
默认初始化
概念:在使用new创建对象之后,对象里的成员已经由编译器自动赋给了默认值。
使用代码示例:
public class Date {
public int year;
public int month;
public int day;
public Date(int year, int month, int day) {
this.year = year;//成员变量会默认初始化,所以不会像下面的a一样
this.month = month;
this.day = day;
}
public static void main(String[] args) {
Date date=new Date(2022,7,30);
// int a;如果这里是int a则不能编译通过 ,因为没有初始化
}
}
编程时没有给成员变量赋值,不会报错,因为创建对象之后编译器会自动赋给成员变量默认值,但是在main方法里的局部变量在声明之后如果没有给它赋值,就会报错,显示未对变量初始化,因为main里的局部变量声明时不会被自动被赋给默认值。
各个数据类型赋给的默认值如下:
十.封装
概念:
封装属于Java的三大特性(封装,继承,多态)之一,将数据和操作数据和方法有机结合,隐藏对象的属性和细节,仅对外公开接口来和对象来实现交互。
访问限定符
Java中主要依靠类和访问限定符来实现封装。
类的作用:将数据和操作数据的方法结合在一起,更符合人类对事物的认知。
访问限定符:用来控制成员变量或者成员方法能否直接在类外使用。
Java中的提供了四种访问限定符:
- public : 全局范围内都可访问
- protected :不同包中的子类内都可以访问
- default :同一包中的不同类内都可访问
- private:同一包中的同一类内可以访问
- 使用default时我们在编程时可以不写default,它属于默认权限。
- 使用封装可以让类内的成员信息更加安全,但需提供对外的接口。
- 如果使用private实现对成员变量的封装,那么可以提供public修饰的接口,用来在其他类里访问封装的成员变量