java入门第三节

news2024/11/27 18:26:20

java入门第三节 

一.什么是oop

1.pop与oop

(1).面向过程编程:(POP:Procedure Oriented Programming)

1.步骤清晰简单,第一步做什么,第二步做什么,按照顺序;

2.代码线性,严格按着顺序,侧重解决步骤

3.适合处理一些简单的问题


(2).面向对象编程:(OOP:Object Oriented Programming)

1.物以类聚,分类的思维方式,首先站在更高的层次看待事物,解决那些问题需要分类,然后对这些分类进行单独思考并规划和设计,最后才对某个分类下的细节进行面向过程的思考;(如.制定学习计划,先分科目,如英语,数学,再对每个科目怎么学进行思考,最后按计划依次执行)

2.明确目标,对象就是目标,目标就是对象

3.面向对象适合处理一些复杂的问题,适合处理多人协作的问题;(如.学校里面有很多老师,每个老师教的课程是不一样的,所有进行了分类,协作教育学生)

2.关于OOP的一些基本概念

(1).面向对象编程的本质:以类的方式组织代码,以对象的组织(封装)数据;

(2).三大特性:封装,继承,多态

(3).从认识论角度考虑是先有对象后有类。对象,是具体的事物(如.人)。类,是抽象的,是对对象的抽象(如.一个组织);

(4).从代码运行角度考虑是先有类后有对象,类是对象的模板;(如.印钞必须先有钞票的模板才能印钞)

3.类与对象的关系 

Java 对象和类 | 菜鸟教程 (runoob.com)

(1).类:类是一种抽象的数据类型,它是对一类事物整体描述/定义,但是并不能代表一个具体的事物;(如.动物,手机,电脑,公司,等等)

(2).对象:对象是抽象的具体实例;

(3).实例:显示生活中的一个东西,对抽象的东西(对象)进行表示出来的产物,是一个活生生存在的事物,他是唯一的。对象 >= 实例;(如.张大爷家的狗,路上的一个行人)

(4).属性:类中的变量和方法总称为属性,属性包括共性与特性;

可以简单理解为类是一个模板,对象是一个具体的实例;

4.对抽象的理解 

抽象是指将具体的事物抽象出来;

其实说白了,抽象---》抽出相同特征的对象(实例), 他和具体又是相对的。

如.吃盖饭抽象的说就是吃饭,吃饭具体的说就是吃什么。人类具体的说就是分女人和男人,人类抽象的说就是动物;

二.提出问题养狗社区 

面向过程(C语言)面向对象(Java)
流水线(步骤)模块化(分类)
一件事"该怎么做"一件事"该让谁来做"
狗饿了,狗吃了食物属性:狗、食物、饿;动作:狗吃食物
强调的是“吃”,“狗”只是一个参数强调的是“吃”,“狗”只是一个参数

如果使用C语言写会非常麻烦,因为它是按照顺序来的,但是每一只狗的作息是不一样的,使用C语言的话每一只狗都要写一遍非常麻烦;

如果使用Java写,我们只需要把这些狗的共性和特性提取出来,形成一个个模块(如.吃,睡觉,等等),让狗主人自己填写狗的作息;

使用我们使用Java写养狗社区;

package com.microsoft.bean;
 
// 狗类(狗属性)
public class Dogs {
 
// 狗的状态
    // 下面每一个狗的状态,都是类中的一个成员,它们是类的重要组成部分;
    // 成员变量:它们组成和构成了类,所有我们这么命名
 
    // 狗名字
    public String name;
 
    // 狗种类
    public String variety;
 
    // 狗的年龄
    public int age;
 
    // 狗的食物
    public String food;
 
 
// 狗的行为(就是狗的动作,在类中被称为行为)
    public void eat() {
        System.out.println(this.name+"狗吃饭");
    }
 
    public void sleep() {
        System.out.println(this.name+"狗睡觉");
    }
 
    public void run() {
        System.out.println(this.name+"狗正在奔跑");
    }
 
}
 

 一个项目只能有一个main方法,所以我们要定义一个测试文件为Application

import com.microsoft.bean.Dogs;
 
public class Application {
    public static void main(String[] args) {
 
        
        // 张大爷家的狗是狗类中的一个实例
        // // 张大爷,注册APP
        Dogs zhangDog = new Dogs();
  
 
        // 张大爷设置狗的状态
        zhangDog.name = "阿黄";
        zhangDog.variety = "中华田园犬";
        zhangDog.age = 2;
        zhangDog.food = "剩菜剩饭";
 
        // 张大爷设置狗现在的行为
        zhangDog.eat();
    }
}

三.方法与变量的分类

1.非静态变量与非静态方法 

上面定义狗的一些状态与行为,没有使用Static,使用我们可以称为这些为非静态变量与非静态方法;

所以我们要调用时,要先实例化这个对象,所以new关键字

使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中的构造器的调用;(构造器我们后面会讲)

         // 张大爷,注册APP,使用new实例化
        // 格式:对象类型 对象名 = new 对象值;
        Dogs zhangDog = new Dogs();

        // 张大爷设置狗的状态
        zhangDog.name = "阿黄";
        zhangDog.variety = "中华田园犬";
        zhangDog.age = 2;
        zhangDog.food = "剩菜剩饭";
        
        // 调用非静态变量:对象名.变量名
        System.out.println("张大爷家狗的名字: " + zhangDog.name);
        
        // 张大爷设置狗现在的行为
        // 调用非静态方法:对象名.方法名
        zhangDog.eat();

2.静态变量与静态方法

有Static关键字修饰的变量与方法,我们叫静态变量与静态方法;

 // 狗所在的小区
    public static String plot = "希望小区";

    // 狗名字
    public String name;

    // 狗种类
    public String variety;

    // 狗的年龄
    public int age;

    // 狗的食物
    public String food;


    // 我们要给所以狗打疫苗
    public static void injection(){
        System.out.println("所以的狗,月底打疫苗");
    }
        // 张大爷,注册APP,使用new实例化
        Dogs zhangDog = new Dogs();

        // 张大爷设置狗的状态
        zhangDog.name = "阿黄";
        zhangDog.variety = "中华田园犬";
        zhangDog.age = 2;
        zhangDog.food = "剩菜剩饭";

       // 调用静态变量使用:类名.变量名
        // 原因静态变量是属于整个类的,不属于某个对象
        System.out.println("张大爷的狗所在小区" +Dogs.plot);

        // 调用静态方法属于:类名.方法名
        // 原因静态方法是属于整个类的,不属于某个对象
        Dogs.injection();

四.注销账号和null空指针异常 

        // 张大爷,注册APP
        Dogs zhangDog = new Dogs();
 
        // 张大爷家的狗是狗类中的一个实例
 
        // 张大爷设置狗的状态
        zhangDog.name = "阿黄";
        zhangDog.variety = "中华田园犬";
        zhangDog.age = 2;
        zhangDog.food = "剩菜剩饭";
 
        // 张大爷注销账号
        zhangDog = null;
 
        // 注销后就不能在调用否则会出现空指针异常
        System.out.println("张大爷家狗的名字: " + zhangDog.name);

 NullPointerException

原因:指针原本指向张大爷家的狗,注销账号后指向一个空白的区域 

 五.简单内存分析

 第一步:加载Application类与静态方法(从这里可以看出静态变量与方法与类一起加载,所有对象都可以使用),进入main函数

第二步:加载Dogs类

第三步:张大爷注册app,使用Dogs zhangDog = new Dogs();,在栈生成引用变量名,对象生成在堆里,堆里的对象是通过Dogs类为模板生成,引用变量名指向它在堆中的地址;

 第四步:赋值

六.OOP封装

问题: 

pubilc 公有的,公共的-------用户可以随意修改(如.上面张大爷注册账号时可以随意填写狗的信息,如果在里面的东西与钱挂钩的话,那么用户也可以随意修改)

解决:

private 私有的------用户不能随意修改,我们给一个用户能设置,能获取,但不能随意设置,使用getset关键字,快捷方式Alt+insert

 

Ctrl+a全选,然后回车 

 

 this表示:本身调用者这个对象

package com.microsoft.bean;


public class Dogs {

    // 狗所在的小区
    public static String plot = "希望小区";

    // 狗名字
    private String name;

    // 狗种类
    private String variety;

    // 狗的年龄
    private int age;

    // 狗的食物
    private String food;

    // 约束
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        if (name.length() < 20) {
            this.name = name;
        }else {
            System.out.println("你的狗名字过长");
        }
    }

    public String getVariety() {
        return variety;
    }

    public void setVariety(String variety) {
        this.variety = variety;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0 && age <30){
            this.age = age;
        }else {
            System.out.println("你的狗年龄错误");
        }
    }

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    
    // 我们要给所以狗打疫苗
    public static void injection(){
        System.out.println("所以的狗,月底打疫苗");
    }

    // 狗的行为(就是狗的动作,在类中被称为行为)
    public void eat() {
        System.out.println(this.name+"狗吃饭");
    }

    public void sleep() {
        System.out.println(this.name+"狗睡觉");
    }

    public void run() {
        System.out.println(this.name+"狗正在奔跑");
    }

}

​
import com.microsoft.bean.Dogs;

public class Application {
    public static void main(String[] args) {

        // 张大爷,注册APP,使用new实例化
        Dogs zhangDog = new Dogs();

        // 张大爷设置狗的状态
        // 输入使用set
        zhangDog.setName("阿黄");
        zhangDog.setVariety("中华田园犬");
        zhangDog.setAge(10);
        zhangDog.setFood("剩菜剩饭");

        // 输出使用get
        System.out.println(zhangDog.getAge());
    }
}

​

 出现问题,每一个成员变量都要写getset非常麻烦,所有出现了一个架包

下载完插件后,我们要下载架包 

架包网站:Maven Repository: org.projectlombok » lombok (mvnrepository.com)

选择版本,点进去,然后jar下载 

引入架包 

然后将架包拖进去,接着选择作用范围 

第一个表示全局,第二个表示这个项目,第三个表示模块  

 如果想使用结包还要启用注解

使用:特殊的可以单写,这个叫方法的重写,我们后面会讲

package com.microsoft.bean;

import lombok.Getter;
import lombok.Setter;


// 也可以写在一个成员变量后,只对一个成员变量起作用
@Getter
@Setter

public class Dogs {

    // 狗所在的小区
    public static String plot = "希望小区";

    // 狗名字
    private String name;

    // 狗种类
    private String variety;

    // 狗的年龄
    private int age;

    // 狗的食物
    private String food;


    // 方法的重写
    public void setName(String name) {
        if (name.length() < 20) {
            this.name = name;
        }else {
            System.out.println("你的狗名字过长");
        }
    }
    public void setAge(int age) {
        if (age > 0 && age <30){
            this.age = age;
        }else {
            System.out.println("你的狗年龄错误");
        }
    }
    
    // 我们要给所以狗打疫苗
    public static void injection(){
        System.out.println("所以的狗,月底打疫苗");
    }

    // 狗的行为(就是狗的动作,在类中被称为行为)
    public void eat() {
        System.out.println(this.name+"狗吃饭");
    }

    public void sleep() {
        System.out.println(this.name+"狗睡觉");
    }

    public void run() {
        System.out.println(this.name+"狗正在奔跑");
    }

}

七.toString 

        // 张大爷设置狗的状态
        zhangDog.setName("阿黄");
        zhangDog.setVariety("中华田园犬");
        zhangDog.setAge(10);
        zhangDog.setFood("剩菜剩饭");
 
        // 如果我们想要输出张大爷家的狗所有信息需要写四条输出语句
        // 如果使用toString,我们只需写一条输出语句

 

快捷方式Alt+insert,然后全选,生成 

 @Override
    public String toString() {
        return "Dogs{" +
                "name='" + name + '\'' +
                ", variety='" + variety + '\'' +
                ", age=" + age +
                ", food='" + food + '\'' +
                '}';
    }

  也可以直接使用架包引入

 
import lombok.ToString;
 
// 也可以写在一个成员变量后,只对一个成员变量起作用
@ToString

 效果

补充: 补充如果要使用图中三个方法,可以引入架包@Date 

八.构造方法 

 问题:

张大爷想要在注册账号时,填写狗的基本信息

解决:

使用构造函数,初始化对象(实例);

  /*
    类中的构造器也称为构造方法,是在进行创建对象(new)的时候必须调用的;
    构造器有两大特点:
    1.必须和类的名字相同
    2.必须没有返回值类型,也不能写void
     */


    // 无参数构造函数(无参构造器),每创建一个类,都会有一个无参构造器;
    // 如果是系统自带的类会默认创建,要是自己引入的类需要自己,手动创建;
    public Dogs() {
    }

    // 有参数的构造函数(有参构造),一但定义有有参构造,无参构造就必须定义;
    // 有参构造使用了方法的重载
    public Dogs(String name, String variety, int age, String food) {
        this.name = name;
        this.variety = variety;
        this.age = age;
        this.food = food;
    }
import com.microsoft.bean.Dogs;

public class Application {
    public static void main(String[] args) {


        // 张大爷,注册APP,并设置狗的基本信息
        Dogs zhangDog = new Dogs("阿黄","中华田园犬",10,"剩菜剩饭");

        System.out.println("张大爷家的狗所有信息" +zhangDog);
    }
}

总结:在创建对象时是有调用构造器来初始化值,无参构造默认存在,有参构造是方法重载; 

快捷方式Alt+insert,然后选择初始化对象

 

九.垃圾回收机制 

ava自动会进行垃圾回收,所有我们不用管

如果需要手动,使用:

 System.gc();

 十.关键字Static

问题:

静态变量与方法加private,会出现输出不了的问题;

 解决:

public static String getPlotInstance(){
        return plot;
    }

静态不用写set 

  System.out.println("张大爷家狗住的小区:" +Dogs.getPlotInstance());

1.Static单例设计模式 

单例设计模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例;

简单来说就是:不提供new的方法,只提供对外操作的方法;

package com.microsoft.bean;

public class Earth {

    // new 一个新的地球,自己new自己,只有Earth类内可以修改
    private static Earth earthInstance = new Earth();

    // 外部无法new新的Earth
    private Earth() {
    }

    // 提供外部操作方法
    public static Earth getEarthInstance(){
        return earthInstance;
    }

    public void showMessage(){
        System.out.println("Hello Earth!");
    }
}
        // 获取唯一可用的对象
        Earth object = Earth.getEarthInstance();

        // 显示消息
        object.showMessage();

2.静态代码块

package com.microsoft.bean;

public class Earth {

    {
        System.out.println("匿名代码块");
    }


    static {
        System.out.println("静态代码块");
    }

    public Earth() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        System.out.println("第一次调用");
        Earth temp = new Earth();
        System.out.println("\n第二次调用");
        Earth tempTwo = new Earth();

    }
}

原因:Static关键字是与类一起加载所有首先调用,接着是类中的匿名代码块,然后构造方法,

还有值得注意的是静态代码块只调用一次; 

3.静态导入包 

导入前调用方法:类名.方法

System.out.println(Math.random());

导入后调用方法:方法

import static java.lang.Math.random;


 System.out.println(random());

十一.内部类

1.成员内部类 

package com.microsoft.bean;

public class Earth {

    // 外部类

    public class Sun{
        // 内部类
        public void fuck() {
            System.out.println("这是内部类");
        }
    }

}
        // 创建内部类对象:可以在外部类中创建内部类的对象
        Earth earth = new Earth();
        Earth.Sun sun = earth.new Sun();
        // 调用
        sun.fuck();

2.静态内部类 

package com.microsoft.bean;

public class Earth {

    public static class Sun{
            public void fuck() {
                System.out.println("这是静态内部类");
            }
        }

  }
          // 创建内部类对象:可以直接通过类名创建静态内部类的对象
        Earth.Sun temp = new Earth.Sun();

        temp.fuck();

 3.局部内部类

package com.microsoft.bean;
public class Earth {

    public static void main(String[] args) {
        
        class drop{
            public void man() {
            }
        }
    }
    
}

4.匿名内部类

这个要学完接口后,再回来看

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 TEE

参考文献&#xff1a; Sabt M, Achemlal M, Bouabdallah A. Trusted execution environment: what it is, and what it is not[C]//2015 IEEE Trustcom/BigDataSE/Ispa. IEEE, 2015, 1: 57-64. “U.S. government protection profifile for separation kernels in environment…

svn软连接和文件忽略

软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行

CentOS 7 Nacos 设置开机自动重启

一、说明 Nacos如果是手动启动的话&#xff0c;在服务器宕机或者重启后&#xff0c;没有自动运行&#xff0c;影响很多业务系统&#xff0c;需要每次手动执行命令 startup.sh -m standalone&#xff0c;才能启动 Nacos 服务&#xff0c;不能像docker服务一样&#xff0c;使用 …

「Vue|网页开发|前端开发」01 快速入门:快速写一个Vue的HelloWorld项目

本文主要介绍如何用vue开发的标准化工具vue-cli快速搭建一个符合实际业务项目结构的hello world网页项目并理解vue的代码文件结构以及页面渲染流程。 文章目录 一、准备工作&#xff1a;安装node.js二、项目搭建创建项目目录全局安装vue-cli使用Webpack初始化项目启动项目学会…

Prometheus关于微服务的监控

在微服务架构下随着服务越来越多,定位问题也变得越来越复杂,因此监控服务的运行状态以及针对异常状态及时的发出告警也成为微服务治理不可或缺的一环。服务的监控主要有日志监控、调用链路监控、指标监控等几种类型方式,其中指标监控在整个微服务监控中比重最高,也是实际生…

支持库和应用条

每个Android新版本都会引入一些新特性&#xff0c;不过并不是每个人都能做到Android一推出新版本就升级到那个最新版本&#xff0c;实际上&#xff0c;大多数人都至少落后一个版本。而支持库允许在老版本的Android上使用新特性。 Andriod支持库提供了对Android老版本的向后兼容…

模块化与组件化:开发中的双剑合璧

引言&#xff1a;模块化与组件化的重要性 在现代软件开发中&#xff0c;随着项目规模的增长和技术的复杂性增加&#xff0c;如何有效地组织和管理代码变得越来越重要。模块化与组件化作为两种主要的代码组织方法&#xff0c;为开发者提供了有效的工具&#xff0c;帮助他们创建…

小白带你学习linux的LNMT和动静分离(三十九)

目录 一、LNMT 1、部署tomcat 2、部署nginx 3、部署Mariadb 4、配置Nginx 二、Nginx高级配置 1、location 2、rewirte 三、动静分离 1、修改nginx配置文件 2、重启服务&#xff01;&#xff01;&#xff01; 一、LNMT L是linux&#xff0c;N是nginx &#xff0c;M是…

8.28作业

定义一个基类 Animal&#xff0c;其中有一个虚函数 perform()&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std; class Animal { public:Animal() {}virtual void perform(){} }; class Monkey:public Animal { public:Monkey() {…

普通制造型企业,如何成就“链主品牌

“链主品牌”通常掌握产业链主导地位&#xff0c;对于普通制造型企业看起来是遥不可及的事情&#xff0c;事实上并非如此。从洞察穿越周期的“链主品牌”规律来看&#xff0c;做螺丝起家的伍尔特、做宠物牵引绳的福莱希等小企业也可以成为“链主品牌”。另外&#xff0c;由于新…

如何用大模型解决产业场景实战问题?案例精讲教程来了!

科技爆炸&#xff0c;大模型赋能千行百业 生成式 AI 正以惊人的势头改变着我们的世界&#xff0c;新的浪潮席卷着全球各个行业&#xff0c;同时&#xff0c;也赋予企业前所未有的创新力量。大模型通过海量数据和复杂算法&#xff0c;刻画出AI世界的精妙法则&#xff0c;让企业…

【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部

问题 现在有一个需求&#xff0c;在中文环境下textView没有超过底层的组件限制&#xff0c;但是一切换到英文环境就超出了&#xff0c;这个如何解决呢&#xff1f;有啥例子吗&#xff1f; 就像这样子的。 解决 全部代码如下&#xff1a; <?xml version"1.0"…

解决无公网IP的微信公众号开发调试问题,利用内网穿透的实践经验分享

文章目录 前言1. 配置本地服务器2. 内网穿透2.1 下载安装cpolar内网穿透2.2 创建隧道 3. 测试公网访问4. 固定域名4.1 保留一个二级子域名4.2 配置二级子域名 5. 使用固定二级子域名进行微信开发 前言 在微信公众号开发中&#xff0c;微信要求开发者需要拥有自己的服务器资源来…

多线程(二)

一.关于线程的常用操作 1.启动线程 run(): 对于run方法的覆写只是指定线程要做的任务清单&#xff0c;而不是真正的启动线程 start()&#xff1a; start()方法才是真正的在底层创建出一个线程&#xff0c;并且启动 2.中断线程 1.通过共享的标记来中断 package demo; impor…

参加校招面试测试岗位一次次被刷,耗时一个多月经常偷偷在晚上哭

前言 前两天有粉丝联系我&#xff0c;说他软件工程专业&#xff0c;大厂校招屡次被刷&#xff0c;有一个已经到了三面&#xff0c;还是被刷了&#xff0c;感觉很绝望&#xff0c;不想找工作了。邮箱里也有很多信息&#xff0c;初试都没有过&#xff0c;找工作太难了&#xff0…

财务软件的必要性与优势:为什么企业需要投资财务管理工具?

财务管理是每家企业的核心&#xff0c;可以说财务管理如何关系到企业是否顺利运行。随着企业业务规模的扩大及其复杂性的增加&#xff0c;手工处理财务数据和流程变得越来越困难和难以控制。因此越来越多的企业选择配备一款好用的财务软件来帮助自己进行财务管理。 财务管理的作…

QT初学者该安装qt creator哪个版本?

对于Qt初学者&#xff0c;建议安装最新版本的Qt Creator。Qt Creator是Qt官方提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Qt应用程序。每个Qt版本都会配套提供对应的Qt Creator版本&#xff0c;确保兼容性和稳定性。同时&#xff0c;选择合适的Qt版本也…

因果推断(六)基于微软框架dowhy的因果推断

因果推断&#xff08;六&#xff09;基于微软框架dowhy的因果推断 DoWhy 基于因果推断的两大框架构建&#xff1a;「图模型」与「潜在结果模型」。具体来说&#xff0c;其使用基于图的准则与 do-积分来对假设进行建模并识别出非参数化的因果效应&#xff1b;而在估计阶段则主要…

芯片 半导体 晶圆

芯片&#xff08;chip&#xff09;就是半导体元件产品的统称&#xff0c;是 集成电路&#xff08;IC&#xff0c; integrated circuit&#xff09;的载体&#xff0c;由晶圆分割而成。 半导体集成电路是将很多元件集成到一个芯片内, 以处理和储存各种功能的电子部件。由于半导…

动态场景建图 Removert(offline) 和 DynamicFilter(online)前端部分对比

1.Removert 简单来说2020年的REMOVERT是针对动态环境下的建图进行优化的一篇很好的作品。 针对的主要问题&#xff1a;若是采用点云特征进行匹配的话&#xff0c;动态障碍物在预处理阶段也会被剔除。那么&#xff0c;另一个方面&#xff0c;动态障碍物对点云地图的构建的影响在…