JavaSE——类和对象 重点梳理

ced485cbb11e458d81a746890b32cf3f.gif

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧  

文章目录

1. 面向对象和面向过程

2. 类的注意事项

3. 类的实例化

4. this 引用

5. 构造方法

6. 封装

7. 包


1. 面向对象和面向过程

面向过程:分析出解决问题所需要的各个步骤,然后用许多函数实现这些步骤

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素
缺点:没有面向对象易维护、易复用、易扩展

面向对象:把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程

面向对象就是高度实物抽象化、面向过程就是自顶向下的编程

面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。面向过程就好像是传统的洗衣服的方式,整个过程少了一个环节都不能完成这个问题,按照该种方式来写代码,将来扩展或者维护起来会比较麻烦,而面向对象更像是现代的洗衣服过程,我们可以抽象出来四个对象,分别是:人、衣服、洗衣粉、洗衣机,洗衣服的过程是由四个对象之间交互完成的,人不用关心洗衣服的过程

面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景

Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象

2.类的注意事项

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等)

类的定义格式:

class ClassName{
    field; //字段(属性)或者成员变量
    method; //行为或者成员方法
}

class为定义类的关键字,ClassName为类的名字,{}中为类的主体

类中包含的内容称为类的成员

属性主要是用来描述类的,称之为类的成员属性或者类成员变量

方法主要说明类具有哪些功能,称为类的成员方法

注意事项:

类名注意采用大驼峰

定义成员前写法统一为public

一般一个文件当中只定义一个类

main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)

 public修饰的类必须要和文件名相同

不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改

3.类的实例化

认识实例化:

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象

new 关键字用于创建一个对象的实例

使用.来访问对象中的属性和方法

同一个类可以创建多个实例

类和对象说明:

1. 类是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员

2. 类是一种自定义的类型,可以用来定义变量

3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

4. 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

4. this 引用

this.成员变量

this.访问成员变量

this();访问构造方法

来看个问题: 

形参名不小心与成员变量名相同:

public class Test {
    public int year;
    public int month;
    public int day;
    public void setDay(int year,int month,int day){
        year = year;
        month = month;
        day = day;
    }
    public void printDay(){
        System.out.println(year+"-"+month+"-"+day);
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.setDay(2022,7,25);
        test.printDay();
    }
}

 已经在main 方法中调用了setDay方法并且传参,printDay没有打印出日期,这是因为局部变量优先,只是形参自己给自己赋值了,没有赋值到成员变量中。这时候要用到this

public class Test {
    public int year;
    public int month;
    public int day;
    public void setDay(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void printDay(){
        System.out.println(year+"-"+month+"-"+day);
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.setDay(2022,7,25);
        test.printDay();
    }
}

500

 this引用:

指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

this引用的特性:

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

2. this只能在"成员方法"中使用

3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收,如图:

5. 构造方法

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间

特性:

1. 名字必须与类名相同

2. 没有返回值类型,设置为void也不行

3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法),下面两个构造方法名字相同,参数列表不同,因此构成了方法重载

public class Test {

    public int year;
    public int month;
    public int day;

    //无参构造方法
    public Test(){
        this.year=1900;
        this.month=1;
        this.day=1;
    }
    //带有三个参数的构造方法
    public Test(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

5. 如果用户没有显式定义,编译器会生成一份默认的构造方法生成的默认构造方法一定是无参的

public class Test {

    public int year;
    public int month;
    public int day;
    //带有三个参数的构造方法
    public Test(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void printDate(){
        System.out.println(year+"-"+month+"-"+day);
    }

    public static void main(String[] args) {
        //报错
        Test t = new Test();
        t.printDate();
    }
}

注意:一旦用户定义,编译器则不再生成

如果编译器会生成,则生成构造方法是无参的,此处创建的对象也能通过编译,实际情况是报错,因此一旦用户定义,编译器则不再生成默认的构造方法

 6. 构造方法中,可以通过this调用其他构造方法来简化代码

this();访问构造方法

public class Test {

    public int year;
    public int month;
    public int day;

    public Test() {
        //调用本类中的其他构造方法        
        this(2022,8,4);
        System.out.println("不带参数的构造方法");
    }

    //带有三个参数的构造方法
    public Test(int year, int month, int day) {
        System.out.println("带参数的构造的方法");
        this.year = year;
        this.month = month;
        this.day = day;
    }
    
    public static void main(String[] args) {
        Test t = new Test();

    }
}

 注意:

this(...)必须是构造方法中第一条语句,放在其他行就会报错

不能形成环,循环调用会报错

public Date(){
    this(1900,1,1);
}
public Date(intyear,intmonth,intday){
    this();
}
/*无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器
形成构造器的递归调用编译报错:Error:(19,12)java: 递归构造器调用*/

7. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

6.封装

面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。

封装的概念:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用

Java中提供了四种访问限定符:

No

范围 private default protected public
1 同一包中的同一类  ✔
2 同一包中的不同类
3 不同包中的子类
4 不同包中的非子类

public(公共的):具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式

default(默认的):什么都不写时的默认权限,任何处于本包下的类、接口、异常等,都可以相互访问

protected(受保护的):protected修饰符,它主要的作用就是用来保护子类的

private(私有的):访问权限仅限于类的内部,是一种封装的体现,例如,大多数的成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问

private修饰name后,只能同一包中的同一类进行调用,否则会报错

如果想在其它类中调用,需要设置方法,通过方法使用

public class Person {
    private String name;
    public int age;
    public void setName(String name){
        this.name = name;
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("hahaha");
    }
}

注意:一般情况下成员变量设置为private,成员方法设置为public

 get,set方法可以用编译器自动生成:

7. 包

为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。

包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可

 自定义包:

1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包

2. 在弹出的对话框中输入包名

3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可

4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来

5. 同时我们也看到了, 在新创建的Test.java文件的最上方, 就出现了一个 package 语句

 常见的包

1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入

2. java.lang.reflect:java 反射编程包

3. java.net:进行网络编程开发包

4. java.sql:进行数据库开发的支持包

5. java.util:是java提供的工具程序包(集合类等) 非常重要

6. java.io:I/O编程开发包

祝大家七夕快乐!!还有我和小王也快乐!

 “ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

ced485cbb11e458d81a746890b32cf3f.gif

猜你喜欢

转载自blog.csdn.net/chenchenchencl/article/details/126159789