学习

类、实例初始化

代码 #

 public class Son extends Father{
	private int i=test();
	private static int j=method();
	static {
		System.out.print("(6)");
	}
	Son(){
		System.out.print("(7)");
	}
	{
		System.out.print("(8)");
	}
	public int test(){
		System.out.print("(9)");
		return 1;
	}

	public static int method(){
		System.out.print("(10)");
		return 1;
	}

	public static void main(String[] args) {
		Son s1=new Son();
		System.out.println();
		Son s2=new Son();
	}


}
 public class Father {
	private int i=test();
	private static int j=method();
	static {
		System.out.print("(1)");
	}
	Father(){
		System.out.print("(2)");
	}
	{
		System.out.print("(3)");
	}

	public int test() {
		System.out.print("(4)");
		return 1;
	}

	public static int method() {
		System.out.print("(5)");
		return 1;
	}
}

输出:

...

单例设计模式

特点 #

  • 该类只有一个实例
    • 构造器私有化
  • 该类内部自行创建该实例
    • 使用静态变量保存
  • 能向外部提供这个实例
    • 直接暴露
    • 使用静态变量的get方法获取

几大方法 #

饿汉式 #

随着类的加载进行初始化,不管是否需要都会直接创建实例对象

public class Singleton1 {
	public static final Singleton1 INSTANCE=new Singleton1();
	private Singleton1() {
	}

}

枚举 #

枚举类表示该类型的对象是有限的几个

public enum  Singleton2 {
	 INSTANCE
}

使用静态代码块 #

随着类的加载进行初始化

public class Singleton2 {
	public static final Singleton2 INSTANCE;

	static {
		INSTANCE = new Singleton2();
	}

	private Singleton2() {
	}

}

如图,当初始化实例时需要进行复杂取值操作时,可以取代第一种方法 ly-20241212141841430

懒汉式 #

  • 延迟创建对象

    public class Singleton4 {
    	//为了防止重排序,需要添加volatile关键字
    	private static volatile Singleton4 INSTANCE;
    
    	private Singleton4() {
    	}
    
    	/**
    	 * double check
    	 * @return
    	 */
    	public static Singleton4 getInstance() {
    		//2 先判断一次,对于后面的操作(此时已经创建了对象)能减少加锁次数
    		if (INSTANCE == null) {
    			//如果这里不加锁会导致线程安全问题,可能刚进了判断语句之后,执行权被剥夺了又创建好了对象,
    			//所以判断及创建对象必须是原子操作
    			synchronized (Singleton4.class) {
    				if (INSTANCE == null) {
    					//用来模拟多线程被剥夺执行权
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					//如果这个地方不加volatile,会出现的问题是,指令重排 1,2,3是正常的,
    					//会重排成1,3,2 然后别的线程去拿的时候,判断为非空,但是实际上运行的时候,发现里面的数据是空的
    
    					//1 memory = allocate();//分配对象空间
    					//2 instance(memory); //初始化对象
    					//3 instance = memory; //设置instance指向刚刚分配的位置
    					INSTANCE = new Singleton4();
    				}
    			}
    		}
    		return INSTANCE;
    	}
    }
    

使用静态内部类 #

public class Singleton6 {
    private Singleton6(){

    }
    private static class Inner{
        private static final Singleton6 INSTANCE=new Singleton6();
    }
    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }
}
  • 只有当内部类被加载和初始化的时候,才会创建INSTANCE实例对象
  • 静态内部类不会自动随着外部类的加载和初始化而初始化,他需要单独去加载和初始化
  • 又由于他是在内部类加载和初始化时,创建的,属于类加载器处理的,所以是线程安全的

自增变量

题目 #

		int i=1;
		i=i++;
		int j=i++;
		int k = i+ ++i * i++;
		System.out.println("i="+i);
		System.out.println("j="+j);
		System.out.println("k="+k);

讲解 #

对于操作数栈和局部变量表的理解 #

  • 对于下面的代码

    		int i=10;
    		int j=9;
    		j=i;
    

    反编译之后,查看字节码

    0 bipush 10
    2 istore_1
    3 bipush 9
    5 istore_2
    6 iload_1
    7 istore_2
    8 return
    

    如下图,这三行代码,是依次把10,9先放到局部变量表的1,2位置。
    之后呢,再把局部变量表中1位置的值,放入操作数栈中
    最后,将操作数栈弹出一个数(10),将数值赋给局部变量表中的位置2

    ly-20241212141840576 ly-20241212141840888 如上图,当方法为静态方法时,局部变量表0位置存储的是实参第1个数

    (当方法为非静态方法时,局部变量表0位置存储的是this引用)

  • 对于下面这段代码

    		int i=10;
    		int j=20;
    		i=i++;
    		j=++j;
    		System.out.println(i);
    		System.out.println(j);
    

    编译后的字节码

    ...

19-26_git_尚硅谷

介绍 #

使用代码托管中心(远程服务器) ly-20241212142124425

  • 团队内写作 push–clone–push— –pull ly-20241212142124625
  • 跨团队写作 fork(到自己的远程库)—clone ly-20241212142124707

创建远程库&创建别名 #

  • 官网:https://github.com
  • 现在yuebuqun注册一个账号 创建一个远程库git-demo,创建成功 ly-20241212142124787
  • 创建远程库别名 git remote -v (查看别名) 为远程库创建别名 git remote add git-demo https://github.com/lwmfjc/git-demo.git 别名创建成功 fetch和push都可以使用别名 ly-20241212142124868

推送本地库到远程库 #

  • 推送master分支 切换git checkout master
  • 推送 git push git-demo master ly-20241212142124947

拉取远程库到本地库 #

  • git pull git-demo master 结果 ly-20241212142125028

克隆远程库到本地 #

  • git clone xxxxxxx/git-demo.git ly-20241212142125111 clone之后有默认的别名,且已经初始化了本地库

团队内写作 #

  • lhc修改了git-demo下的hello.txt
  • 之后进行git add hello.txt
  • git commit -m “lhc-commit " hello.txt
  • 现在进行push git push origin master 出错了 ly-20241212142125194
  • 使用ybq,对库进行设置,管理成员 ly-20241212142125275
  • 添加成员即可 输入账号名 ly-20241212142125354
  • 将邀请函 ly-20241212142125433 发送给lhc ly-20241212142125516
  • 现在再次推送,则推送成功 ly-20241212142125598

团队外合作 #

  • 先把别人的项目fork下来 ly-20241212142125682

    ...

09-18_git_尚硅谷

命令 #

  1. 命令-设置用户签名

    • 查看 git config user.name git config user.email
    • 设置 git config --global user.name ly001 git config --global user.email xxx@xx.com
    • git的配置文件查看 ly-20241212142119718
    • 作用:区分不同操作者身份,跟后面登陆的账号没有关系
  2. 初始化本地库

    • git init

      ly-20241212142119957 多出一个文件夹 ly-20241212142120049

  3. 查看本地库状态

    • git status ly-20241212142120138 默认在master分支
    • 新增一个文件 vim hello.txt ly-20241212142120222
    • 此时查看本地库的状态 ly-20241212142120310 untracketd files 未被追踪的文件,也就是这个文件还在工作区
  4. 添加暂存区

    • git add hello.txt ly-20241212142120403 LF 将会被替换成 CRLF,windows里面是CRLF,也就是说

      这个换行符自动转换会把自动把你代码里 与你当前操作系统不相同的换行的方式 转换成当前系统的换行方式(即LFCRLF 之间的转换)

      这是因为这个hello.txt是使用vm hello.txt在git bash里面添加的,如果直接在windows文件管理器添加一个文件(hello2.txt),就会发现没有这个警告,因为他已经是CRLF了 (为了和视频保持一致,git rm –cached hello2.txt 后删除这个文件) ly-20241212142120487

    • 查看当前状态,绿色表示git已经追踪到了这个文件

      文件已经存在于暂存区 ly-20241212142120577

      ...

01-08_git_尚硅谷

概述 #

课程介绍 #

  1. Git - git介绍–分布式版本控制+集中式版本控制 - git安装–基于官网,2.31.1 windows - 基于开发案例 详细讲解常用命令 - git分支—特性、创建、转换、合并、代码合并冲突解决 - idea集成git
  2. Github
    • 如何创建远程库
    • 推送 push
    • 拉取 pull
    • 克隆 clone
    • ssh免密登录
    • idea github集成
  3. Gitee码云
    • 码云创建远程库
    • Idea集成Gitee
  4. Gitlab
    • gitlab服务器的搭建和部署
    • idea集成gitlab
  5. 课程目标:五个小时,熟练掌握git、github、gitee

官网介绍 #

  1. git是免费的开源的分布式版本控制系统
  2. 廉价的本地库
  3. 分支功能 ly-20241212142118069
  4. Everything is local

版本控制介绍 #

  1. 记录文件内容变化,以便将来查阅特定版本修订记录的系统
  2. 如果没有git ly-20241212142118196
  3. 为什么需要版本控制(从个人开发过渡到团队合作) ly-20241212142118292

分布式版本控制VS集中式版本控制 #

  1. SVN,单一的集中管理的服务器,保存所有文件的修订版本。其他人都先连到这个中央服务器上获取最新处理是否冲突 ly-20241212142118383
  • 缺点,单点故障,如果某段时间内故障了,那么就没法提交
  1. Git,每台电脑都是代码库 ly-20241212142118467
    • 如果远程库挂了,本地还是可以做版本控制的,只不过不能做代码推送而已
    • 每个客户端保存的都是完整的项目(包括历史记录)

发展历史 #

  1. linux系统版本控制历史
    • 1991-2002 手动合并
    • 2002 BitKeeper授权Linux社区免费使用(版本控制系统)
      • 社区将其破解
    • 2005 用C语言开发了一个分布式版本控制系统:Git 两周开发时间
    • 2008年 GitHub上线

工作机制和代码托管中心 #

ly-20241212142118560

...

01-21 maven多模块管理_动力节点

场景介绍 #

  • 业务依赖 ly-20241212142142250
  • 多模块管理 版本管理 ly-20241212142142435

第1种方式 #

创建父工程 #

  • 先创建一个空项目 ly-20241212142142506

  • 在这个空项目下,创建一个module当作maven父工程 ly-20241212142142569

  • 结构 ly-20241212142142631

  • pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjpowernode.maven</groupId>
        <artifactId>001-maven-parent</artifactId>
        <version>1.0.0</version>
        <!--
         packaging 标签指定打包方式,默认为jar
        -->
        <!--
            maven父工程必须遵守以下两点要求
            1、packaging标签的文本内容必须设置为pom
            2、把src删除
        -->
    
    
    </project>
    

介绍pom文件 #

pom 项目对象模型,project object model,该文件可以子工程被继承 maven多模块管理,其实就是让它的子模块的pom文件来继承父工程的pom

创建maven java子工程 #

  • 新建一个module

    注意路径,002在IDEA-maven的目录下 ly-20241212142142693

  • 查看pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!--指向父工程的gav坐标-->
        <parent>
            <artifactId>001-maven-parent</artifactId>
            <groupId>com.bjpowernode.maven</groupId>
            <version>1.0.0</version>
            <!--相对路径-->
            <relativePath>../001-maven-parent/pom.xml</relativePath>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>002-maven-java</artifactId>
    
    
    </project>
    

创建maven web子工程 #

  • 创建新模块 ly-20241212142142754

    ...

31-43 maven基础_动力节点

idea中设置maven #

  • 和idea集成maven ly-20241212142146614

创建普通的j2se项目 #

  • 使用idea创建空白项目 ly-20241212142146810

  • 新建一个module ly-20241212142146873

  • 使用模板创建普通java项目 ly-20241212142146930

  • 输入gav ly-20241212142146987

  • 设置maven信息 ly-20241212142147048

  • 标准的maven工程 ly-20241212142147103

    • 与创建网站有关,删掉即可

      <?xml version="1.0" encoding="UTF-8"?>
      
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
      
        <groupId>com.bjpowernode</groupId>
        <artifactId>ch01-maven-j2se</artifactId>
        <version>1.0</version>
      
        <!--设置网站,注释掉即可-->
      <!--  <name>ch01-maven-j2se</name>
        <!– FIXME change it to the project's website –>
        <url>http://www.example.com</url>-->
      
        <properties> <!--maven常用设置-->
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
      
        <dependencies>
          <dependency><!--单元测试-->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
          </dependency>
        </dependencies>
      
        <build>
          <!--插件版本的配置,无特殊指定则删除-->
          <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
              <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
              <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.1.0</version>
              </plugin>
              <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
              <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
              </plugin>
              <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
              </plugin>
              <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
              </plugin>
              <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
              </plugin>
              <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
              </plugin>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
              </plugin>
              <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
              <plugin>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7.1</version>
              </plugin>
              <plugin>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>3.0.0</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>
      </project>
      

单元测试 #

  • 关于idea颜色 ly-20241212142147158

    ...

17-30 maven基础_动力节点

本地仓库的设置 #

  • 远程仓库–>本地仓库

  • maven仓库

    • 存放maven工具自己的jar包
    • 第三方jar,比如mysql驱动
    • 自己写的程序,可以打包为jar,存放到仓库
  • 分类

    • 本地仓库(本机):位于自己计算机中,磁盘中某个目录

      • 默认位置 登录操作系统的账号目录/.m2/repository C:\Users\ly.m2\repository

      • 可修改 比如放在d盘中

        英[rɪˈpɒzətri] D:\software\apache-maven-3.8.6\repository 备份并编辑 ly-20241212142145669 改成左斜杠的方式

        <settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
          <!-- localRepository
           | The path to the local repository maven will use to store artifacts.
           |
           | Default: ${user.home}/.m2/repository
          <localRepository>/path/to/local/repo</localRepository>
          -->
           <localRepository>D:/software/apache-maven-3.8.6/repository</localRepository>
        
      • 把之前user下的repository的文件都拷贝到 D:/software/apache-maven-3.8.6/repository 下 然后再对Hello项目进行编译 mvn compile 发现不会下载任何文件,且user下的repository也不会再进行下载

      • 下面的资源是从maven中下载,或者用maven打包的 ly-20241212142145849

    • pom.xml来说明某个项目需要怎么处理代码、项目结构

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjpowernode</groupId>
        <artifactId>ch01-maven</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <properties>
        		<java.version>1.8</java.version>
        		<maven.compiler.source>1.8</maven.compiler.source>
        		<maven.compiler.target>1.8</maven.compiler.target>
        </properties>
        <dependencies>
        		<dependency>
        				<groupId>mysql</groupId>
        				<artifactId>mysql-connector-java</artifactId>
        				<version>5.1.9</version>
        		</dependency>
        </dependencies>
    
    </project> 
    
    • mvn命令需要在pom.xml所在的目录下执行 ly-20241212142145908

仓库的工作方式 #

ly-20241212142145966

...

01-16 maven基础_动力节点

课程介绍 #

  • maven 自动化构建–>开发–编译–运行-测试–打包–部署 (m ei ’ ven)

maven的作用 #

  • 软件是一个工程
  • 软件中重复的操作(开发阶段)
    • 需求分析
    • 设计阶段
    • 开发阶段(编码),编译,测试
    • 测试阶段(专业测试),测试报告
    • 项目打包,发布,给客户安装项目
  • maven
    • 项目自动构建,清理、编译、测试、打包、安装、部署
    • 管理依赖:项目中需要使用的其他资源

Maven中的概念 #

  • 没有使用maven,管理jar,手动处理jar,以及jar之间的依赖
  • maven是apache 【əˈpætʃi】基金会的开源项目,使用java语法开发
  • maven是项目的自动化构建工具,管理项目依赖
  • maven中的概念
    • POM
    • 约定的目录
    • 坐标
    • 依赖管理
    • 仓库管理
    • 生命周期
    • 插件和目标
    • 继承 (高级内容)
    • 聚合 (高级内容)

Maven资源的获取与安装,测试 #

  • https://maven.apache.org/index.html

    • 各种内容 ly-20241212142144318

    • 要求 ly-20241212142144503

    • 视频用的3.6.3 ,这里下载3.8.6 (最新的,不要和电脑原配置冲突,方便学习,后续改回3.8.4)

      • 检查java home ly-20241212142144566

        • 如果没有需要进行配置 ly-20241212142144629
        • ly-20241212142144689
      • 将maven的bin目录配置到path环境变量下(这里使用的是下一节的方法,视频中没有用MAVEN_HOME,而是直接将maven的bin目录路径加到path中) ly-20241212142144751

        ly-20241212142144812

  • maven解压后的目录结构 ly-20241212142144869

另一种安装方式 #

  • 确定JAVA_HOME是否有效
  • 创建M2_HOME(MAVEN_HOME),值为maven的安装目录
  • 在path环境中,加入%M2_HOME%\bin
  • 测试maven安装 mvn -v

约定的目录结构 #

  • 大多数人遵守的目录结构

    ...