Java筑基-面向对象

在这里插入图片描述


Java-面向对象

  • 一、类和对象
    • 1、类和对象的关系
    • 2、创建类
    • 3、创建对象
    • 4、成员变量与局部变量
    • 5、构造器
      • 5.1、创建对象的过程
      • 5.2、构造器的格式
      • 5.3、构造器和方法的区别
      • 5.4、构造器的作用
      • 5.5、构造器的重载
    • 6、this关键字用法:
      • 6.1、this可以修饰属性
      • 6.2、this可以修饰方法
      • 6.3、this可以修饰构造器
    • 7、static
      • 7.1、static修饰属性
        • 7.1.1、static静态域示意图
        • 7.1.2、static修饰属性的应用创建
      • 2、static修饰方法
    • 8、代码块
      • 8.1、代码块执行顺序:

一、类和对象

1、类和对象的关系

万事万物皆对象
对象就是具体的事物,具体的实体,具体的实例,模板下具体的产品。
类:类是抽象的,是一个模板。

2、创建类

package com.company.TestOOP;

public class Person {
    //名词——》属性——》成员变量——》放在类中,方法外
    String name;
    int age;
    double weight;
    double height = 175;

    //动词——》方法
    //吃饭
    public void eat() {
        int num = 20; //局部变量,放在方法中,必须进行初始化
        System.out.println("吃饭");
    }

    public void sleep(String address) {
        System.out.println("我在睡觉地点在:" + address);
    }

    //自我介绍
    public String interduce() {
        return "我的名字是:" + name + ",我的年龄" + age + ",我的身高是:" + height + ",我的体重是:" + weight;
    }

}

3、创建对象

第一次加载类的时候,会进行类的加载,初始化创建对象的时候,对象的属性没有给赋值,有默认的初始化的值。
再次创建对象时,就不会进行类的加载了,类的加载只在第一次需要的时候加载一次。
不同的对象,属性有特有的值,但是方法都是调用类中通用的方法。
对象的属性是独立的方法;
各个对象的方法是共享的。

package com.company.TestOOP;

public class Test {
    public static void main(String[] args) {
        //创建一个人类的具体的对象/实例:
        //Person属于引用数据类型
        //创建一个对象,对象的名字叫zs
        //第一次加载类的时候,会进行类的加载,初始化创建对象的时候,对象的属性没有给赋值,有默认的初始化的值
        Person zs = new Person();
        zs.name="kobe";
        zs.age=19;
        zs.height=180;
        zs.weight=170;


        //再次创建对象时,就不会进行类的加载了,类的加载只在第一次需要的时候加载一次。
        Person ls = new Person();
        ls.name="james";
        ls.age=19;
        ls.height=180;
        ls.weight=170;

        System.out.println(ls.name);
        System.out.println(zs.name);

        //不同的对象,属性有特有的值,但是方法都是调用类中通用的方法。
        //属性,各个对象的属性是独立的
        //方法:各个对象的方法是共享的
        ls.eat();
        zs.eat();
        zs.sleep("酒店");
        String s = ls.interduce();
        System.out.println(s);
    }
}

james
kobe
吃饭
吃饭
我在睡觉地点在:酒店
我的名字是:james,我的年龄19,我的身高是:180.0,我的体重是:170.0

4、成员变量与局部变量

区别:
1、代码中位置不同:
成员变量:在类中,方法外。
局部变量:方法中定义的变量,代码块中定义的变量
2、代码的作用范围
成员变量:当前类的很多方法
局部变量:当前一个方法(当前代码块)
3、是否有默认值
成员变量:有
局部变量:无
在这里插入图片描述
4、是否要初始化
成员变量:不需要,不建议初始化,后续使用的时候再赋值即可。
局部变量:一定需要,不然使用的时候直接报错。

5、内存中位置不同
成员变量:堆内存
局部变量:栈内存

6、作用时间不同
成员变量:当前对象从创建到销毁
局部变量:当前方法从开始执行到执行完毕

5、构造器

5.1、创建对象的过程

1、第一次遇到Person的时候,进行类的加载(并且只加载1次)
2、创建对象,为这个对象在堆中开辟空间
3、为对象进行属性的初始化动作

new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)。
调用构造方法的时候,如果你的类中没有写构造器,那么系统会默认分配一个构造器,只是我们看不到罢了。
可以自己显示的将构造器编写出来。

5.2、构造器的格式

 [修饰符] 构造器名字(){

 }

5.3、构造器和方法的区别

1、没有方法的返回值类型
2、方法体内部不能有return
3、构造器的名字很特殊,必须和类名一模一样

5.4、构造器的作用

不是为了创建对象,因为在调用构造器之前,这个对象已经创建好了,并且属性有默认的初始化的值。
调用构造器的目的:是给属性进行赋值操作

注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。
实际上:我们只要保证空构造器的存在就可以了,里面的东西不用写。

package com.msb;

public class Person {
    //属性
    String name;
    int age;
    double height;

    //构造器:没有任何参数的构造器;空参构造器
    public Person(){
        //注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。
//        age = 19;
//        name = "kobe";
//        height = 180;
    }

    //方法
    public void eat(){
        System.out.println("吃饭");
    }
}

package com.msb;

public class Test {
    public static void main(String[] args) {
        //创建一个Person类的具体的对象/实例/实体
        /*
        创建对象的过程:
        1、第一次遇到Person的时候,进行类的加载(并且只加载1次)
        2、创建对象,为这个对象在堆中开辟空间
        3、为对象进行属性的初始化动作

        new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)
        调用构造方法的时候,如果你的类中没有 写构造器,那么系统会默认分配一个构造器,只是我们看不到罢了
        可以自己显示的将构造器编写出来。
        构造器的格式:
        [修饰符] 构造器名字(){

        }
        构造器和方法的区别:
        1、没有方法的返回值类型
        2、方法体内部不能有return
        3、构造器的名字很特殊,必须和类名一模一样

        构造器的作用:不是为了创建对象,因为在调用构造器之前,这个对象已经创建好了,并且属性有默认的初始化的值。
        调用构造器的目的:是给属性进行赋值操作

        注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。
        实际上:我们只要保证空构造器的存在就可以了,里面的东西不用写。
        */

        Person zs = new Person();
        System.out.println(zs.age);
        System.out.println(zs.name);
    }
}

5.5、构造器的重载

当形参名字和属性名字重名的时候,程序有就近原则
在要表示对象的属性前加上this关键字,this表示当前对象;

package com.msb1;

public class Person {
    //属性
    String name;
    int age;
    double height;

    //构造器:没有任何参数的构造器;空参构造器
    public Person() {

    }

    public Person(String name, int age, double height) {
        //当形参名字和属性名字重名的时候,程序有就近原则
        //在要表示对象的属性前加上this关键字,this表示当前对象;
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public Person(String a, int b) {
        name = a;
        age = b;
    }

    //方法
    public void eat() {
        System.out.println("吃饭");
    }
}

1、一般保证空构造器的存在,空构造器中一般不会进行属性的赋值操作。
2、一般我们会重载构造器,在重载的构造器中进行属性赋值操作。
3、在重载构造器以后,假如空构造器忘记写了,系统也不会给你分配默认的空构造器了,那么调用的时候就会出错。

package com.msb1;

public class Test {
    public static void main(String[] args) {
        /*
        1、一般保证空构造器的存在,空构造器中一般不会进行属性的赋值操作。
        2、一般我们会重载构造器,在重载的构造器中进行属性赋值操作。
        3、在重载构造器以后,假如空构造器忘记写了,系统也不会给你分配默认的空构造器了,那么调用的时候就会出错。
         */
        Person zs = new Person("kobe", 20, 180);
        System.out.println(zs.name);
        System.out.println(zs.age);
        System.out.println(zs.height);
    }
}

6、this关键字用法:

1、在第一次遇到一个类的时候,对这个类进行加载,只加载一次。
2、创建对象,在堆中开辟空间。
3、对对象进行初始化操作,属性赋值都是默认的初始值。
4、new关键字调用构造器,执行构造器方法,对对象的属性进行重新赋值。

从上面的效果可以看到,this指代的就是当前对象。内存如下
在这里插入图片描述

6.1、this可以修饰属性

总结:
当属性名字和形参发生重名的时候,或者属性名字和局部变量重名的时候,都会发生就近原则,所以如果我要直接使用变量名字指的是离得近的形参或者局部变量。如果我想要表示属性的话,在前面要加上this.修饰

如果不发生重名问题的话,实际上你要是访问属性也可以省略this.不写

package com.msb2;

public class Test {
    public static void main(String[] args) {
        //创建一个Person类的具体对象
        Person p = new Person(19,"kobe",180);
        p.eat();
    }
}

package com.msb2;

public class Person {
    //属性
    int age;
    String name;
    double height;

    //空构造器
    public Person() {

    }

    //有参构造器
    public Person(int age, String name, double height) {
        this.age = age;
        this.name = name;
        this.height = height;
    }

    public void eat() {
        int age = 10;
        System.out.println(age);  // 就近原则10
        System.out.println(this.age); //这里指代的是属性的age
        System.out.println("吃饭");
    }

}

6.2、this可以修饰方法

总结:在同一个类中,方法可以互相调用,this.可以不写

package com.msb2;

public class Test {
    public static void main(String[] args) {
        //创建一个Person类的具体对象
        Person p = new Person(19,"kobe",180);
        p.eat();
    }
}

package com.msb2;

public class Person {
    //属性
    int age;
    String name;
    double height;

    //空构造器
    public Person() {

    }

    //有参构造器
    public Person(int age, String name, double height) {
        this.age = age;
        this.name = name;
        this.height = height;
    }

    public void eat() {
        int age = 10;
        System.out.println(age);  // 就近原则10
        System.out.println(this.age); //这里指代的是属性的age
        System.out.println("吃饭");
    }

    public void play() {
        this.play1();  //this可以省略不写
        System.out.println("吃饭");
        System.out.println("学习");
        System.out.println("睡觉");
    }

    public void play1() {
        System.out.println("学习");
    }


}

6.3、this可以修饰构造器

总结:同一个类中的构造器可以相互用this调用,注意,this修饰构造器必须放到第一行。

package com.msb2;

public class Person {
    //属性
    int age;
    String name;
    double height;

    //空构造器
    public Person() {

    }

    //有参构造器
    public Person(int age, String name, double height) {
        this.age = age;
        this.name = name;
        this.height = height;
    }


    //有参构造器
    public Person(int age, String name) {
        this(age);
        this.name = name;
    }


    //有参构造器
    public Person(int age) {
        this.age = age;
    }

    public void eat() {
        int age = 10;
        System.out.println(age);  // 就近原则10
        System.out.println(this.age); //这里指代的是属性的age
        System.out.println("吃饭");
    }

    public void play() {
        this.play1();  //this可以省略不写
        System.out.println("吃饭");
        System.out.println("学习");
        System.out.println("睡觉");
    }

    public void play1() {
        System.out.println("学习");
    }


}

7、static

static可以修饰:属性、方法、代码块、内部类

7.1、static修饰属性

package com.mas_static;

public class Test {
    //属性
    int id;
    static int sid;

    public static void main(String[] args) {
        //创建对象
        Test t1 = new Test();
        t1.id = 10;
        t1.sid = 10;

        Test t2 = new Test();
        t2.id = 20;
        t2.sid = 20;

        Test t3 = new Test();
        t3.id = 30;
        t3.sid = 30;

        //读取属性的值
        System.out.println(t1.id);
        System.out.println(t2.id);
        System.out.println(t3.id);

        System.out.println(t1.sid);
        System.out.println(t2.sid);
        System.out.println(t3.sid);

    }
}
7.1.1、static静态域示意图

在这里插入图片描述
在这里插入图片描述
一般官方的推荐访问方式:类名.属性名
static修饰总结:
1、在类加载的时候一起加载入方法区中的静态域中
2、先于对象存在
3、访问方式:对象名.属性名 类名.属性名

7.1.2、static修饰属性的应用创建

某些特定的数据,想要在内存中共享,只有一块——》这个情况下,使用static修饰。

package com.mas_static;

public class MSBStudent {
    String name;
    int age;
    static String school;

    public static void main(String[] args) {
        MSBStudent.school = "qh";
        MSBStudent s1 = new MSBStudent();
        s1.name = "kobe";
        s1.age = 20;
//        s1.school = "qh";

        MSBStudent s2 = new MSBStudent();
        s2.name = "kobe";
        s2.age = 20;
//        s2.school = "qh";
        System.out.println(s2.school);
    }
}

属性:
静态属性(类变量、类属性)
非静态属性(实例变量、实例属性)

2、static修饰方法

1、static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都可以
2、在静态方法中不能访问非静态的属性
3、在静态方法中不能访问非静态的方法
4、在静态方法中,不能使用this关键字
5、非静态的方法可以使用对象名.方法名去调用
6、静态的方法可以使用 对象名.方法名去调用 也可以用类名.方法名去调用

package com.mas_static;

public class Demo {
    int id;
    static int sid;

    public void a(){
        System.out.println("------a");
        System.out.println(id);
        System.out.println(sid);
    }

    //1、static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都可以
    public static void b(){
//        System.out.println(this.id); //在静态方法中,不能使用this关键字
//        a();     //在静态方法中不能访问非静态的方法
        System.out.println("------b");
//        System.out.println(id);  //在静态方法中不能访问非静态的属性
        System.out.println(sid);
    }

    public static void main(String[] args) {
        //非静态的方法可以使用对象名.方法名去调用
        Demo d =new Demo();
        d.a();
        //非静态的方法可以使用  对象名.方法名去调用  也可以用类名.方法名去调用
        Demo.b();
        d.b();
    }

}

8、代码块

代码块分为:普通块、构造块、静态块、同步块(多线程)
总结:

8.1、代码块执行顺序:

最先执行静态块,并且只在类加载的时候只执行一次,所以一般一九实战写项目:创建工厂、数据库初始化信息,一般用于执行全局性的初始化操作。
再执行构造块。(不常用)
再执行构造器。
再执行方法中的普通块。

package com.msb3;

public class Test {
    //属性
    int a;
    static int sa;

    //方法
    public void a(){
        System.out.println("a");
        {
            //普通块限制了局部变量的作用范围
            System.out.println("这是普通块");
            int num = 1;
            System.out.println(num);
        }
    }
    //静态方法
    public static void b(){
        System.out.println("b");
    }

    //构造块
    {
        System.out.println("这是构造块");
    }
    //静态块
    static {
        //在静态块中只能访问静态方法,静态属性
        System.out.println("这是静态块");
        System.out.println(sa);
        b();
    }

    public Test(){
        System.out.println("这是空构造器");
    }

    //构造器
    public Test(int a){
        this.a=a;
    }

    public static void main(String[] args) {
        Test t= new Test();
        t.a();

        Test t1= new Test();
        t1.a();
    }


}

这是静态块
0
b
这是构造块
这是空构造器
a
这是普通块
1
这是构造块
这是空构造器
a
这是普通块
1

Process finished with exit code 0


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/673753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——Python实现PAT甲级1046 Shortest Distance(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 优点 改进建议 时间复杂度分析 空间复杂度分析 总结 我要更…

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践

传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…

HTML5常用标签表单from

form表单标签 <!-- form表单其实就是一种&#xff1a;客户端和服务端数据交流一种方式机制。1&#xff1a; 服务端&#xff0c;提供数据接受地址&#xff08;gin/beego/inris&#xff09;比如&#xff1a;http://localhost:8080/toLogin2: 因为浏览器&#xff0c;在提交数据…

sql server数据库连接不上

我遇到了一个问题&#xff0c;本地sql server怎么都连接不了 我按照网上的方法都试了一遍&#xff0c;发现都错了 后来我把tcp/ip禁用了就好了 或者说把tcp/ip改成动态端口 之后需要重启sql server&#xff0c;右键选中的地方&#xff0c;重启

C++ 左值、右值、左值引用、右值引用

前言 本文介绍C11的各种引用的概念&#xff0c;理解清楚各种引用的概念&#xff0c;非常有助于理解基于c11引用的各种操作。 左右值概念 C 里有左值和右值&#xff0c;但C按标准里的定义实际更复杂&#xff0c;规定了下面这些值类别&#xff08;value categories&#xff09…

使用busybox快速创建rootfs系统(硬件:atk-dl6y2c)

目录 概述 1 编译busybox 1.1 配置Makefile 1.2 需改参数 1.3 配置busybox 1.4 编译busybox 2 完善 rootfs下文件 2.1 rootfs 的“/lib”目录添加库文件 2.2 rootfs 的“usr/lib”目录添加库文件 2.3 创建其他目录 3 完善其他文件 3.1 完善etc/init.d/rcS 3.2 完善…

11.4 插入排序

目录 11.4 插入排序 11.4.1 算法流程 11.4.2 算法特性 11.4.3 插入排序的优势 11.4 插入排序 插入排序&#xff08;insertion sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理与手动整理一副牌的过程非常相似。 具体来说&#xff0c;我们在未排…

片上电控系统集成技术

一、背景 片上电机控制系统集成技术&#xff08;On-Chip Motor Control System Integration&#xff09;是一种先进的电子工程技术&#xff0c;它主要聚焦于将复杂的电机控制算法和硬件组件整合到单一集成电路&#xff08;IC&#xff09;中&#xff0c;以便于高效、精确地管理…

C基础-标准库下

上:http://t.csdnimg.cn/qj5uA 目录 七. math.h 八. setjmp.h 九. signal.h 十. stdarg.h 十一.stddef.h 十二. stdio.h 十三. stdlib. 十四. string.h 十五. time.h 七. math.h 定义了各种数学函数和一个宏。 宏和函数描述 序号宏 & 描述1HUGE_VAL 当函数的结…

C++11 lambda表达式和包装器

C11 lambda表达式和包装器 一.lambda表达式1.lambda表达式的引入2.基本语法和使用1.基本语法2.使用1.传值捕捉的错误之处2.传引用捕捉 3.lambda表达式的底层原理4.lambda的特殊之处5.lambda配合decltype的新玩法 二.function包装器1.概念2.包装函数1.包装普通函数2.包装成员函数…

【Oracle篇】rman全库异机恢复:从RAC环境到单机测试环境的转移(第四篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

odoo10 编写审批拒绝弹窗

前言 在日常中有很多审批场景&#xff0c;例如请销假。审批拒绝的时候应该给出原因&#xff0c;此时&#xff0c;在form界面点击拒绝的时候应该弹出输入窗口。如下图所示。 编写模型 模块的目录下&#xff0c;新建wizard文件夹&#xff0c;然后直接创建一个models.py和views.p…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时&#xff0c;Python作为一种强大的编程语言&#xff0c;也提供了多种与MySQL交互的库&#…

中国人工智能区域竞争力研究报告(2024)

来源&#xff1a;赛迪顾问 近期历史回顾&#xff1a;2024年NoETL开启自动化数据管理新时代白皮书.pdf 创新引领用户“换新生活”-从AWE2024看家电及消费电子行业发展趋势报告&#xff08;精简版&#xff09;.pdf 2024智能网联汽车“车路云一体化”规模建设与应用参考指南&#…

字节裁员!开启裁员新模式。。

最近&#xff0c;互联网圈不太平&#xff0c;裁员消息此起彼伏。而一向以“狼性文化”著称的字节跳动&#xff0c;却玩起了“低调裁员”&#xff0c;用一种近乎“温柔”的方式&#xff0c;慢慢挤掉“冗余”的员工。 “细水长流”&#xff1a;裁员新模式&#xff1f; 不同于以往…

FreeRTOS基础(九):FreeRTOS的列表和列表项

今天我们将探讨FreeRTOS中的一个核心概念——列表&#xff08;List&#xff09;和列表项&#xff08;List Item&#xff09;。在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;任务的管理和调度是至关重要的&#xff0c;而FreeRTOS使用列表来实现这一功能。列表可以说…

城市低空经济“链接力”指数报告(2024)

来源&#xff1a;城市进化论&火石创造 近期历史回顾&#xff1a;2024年NoETL开启自动化数据管理新时代白皮书.pdf 创新引领用户“换新生活”-从AWE2024看家电及消费电子行业发展趋势报告&#xff08;精简版&#xff09;.pdf 2024智能网联汽车“车路云一体化”规模建设与应用…

鬼刀画风扁平化粒子炫动引导页美化版

源码介绍 分享一款引导页,响应式布局&#xff0c;支持移动PC 添加背景图片&#xff0c;美化高斯模糊 &#xff0c;删除蒙版人物部分&#xff0c;更图片人物画风更美好 删除雪花特效 替换字体颜色 添加底备案号 预留友情连接 效果预览 源码下载 https://www.qqmu.com/3381.h…

总结2024/6/3

省流&#xff0c;蓝桥杯国优&#xff0c;还是太菜了&#xff0c;听说都是板子题但是还是写不出来&#xff0c;靠暴力好歹没有爆0&#xff0c;还是得多练&#xff0c;明年加油了