精华内容
下载资源
问答
  • Java学习笔记目录索引 (持续更新中)
    万次阅读 多人点赞
    2020-01-15 13:55:52
    博主的其他笔记汇总 : 👉

    MySQL笔记: B站宋红康最新教程 (持续更新中)

    Java学习路线目录索引 👍

    附录 : 👉
    • Github最牛逼的Java知识汇总 : JavaGuide
    • 号称最强的Java知识总结 : ThinkWon

    一、Java基础

    跳转到目录

    1. UML 一 类图关系 (泛化、实现、依赖、关联、聚合、组合)
    2. Java注解详细介绍 (转载)
    3. Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一 (转载)
    4. 枚举类 — 概述、常用方法、自定义枚举类、Enum创建枚举类
    5. 抽象类(abstract class)、接口(interface)
    6. String类 — 概述、String的性质、内存解析、常用API
    7. Java 异常介绍 (转载)
    8. 线程 — 创建方式、常用方法、线程安全问题、通信
    9. Java集合 — Collection、Iterator、List、Set、Map、Collections
    10. Java8集合新增方法 , other
    11. IO流 — 流的分类、InputStream、OutputStream、Reader、Writer等
    12. 反射 — 概述、功能、Class类获取方式、创建运行时类对象、获取运行时类的结构、调用运行时类的指定结构
    13. Lambda表达式及函数式接口
    14. Java值传递机制
    附录 : 👉

    二、MySQL数据库

    跳转到目录

    1. 数据库设计 一 多表关系、三大范式
    2. MySQL 一 概念、DDL、DML、DQL、事务、约束等
    3. MySQL 一 基础入门总结笔记 (转载)
    4. MySQL 一 高级入门总结笔记(上)(转载)
    5. MySQL 一 高级入门总结笔记(下)(转载)
    6. MySQL的索引底层为何使用 B+树?B树和B+树有哪些区别? 硬盘结构介绍、操作系统读取硬盘数据的过程、什么是IO操作?
    7. MySQL高级 一 MySQL结构图、各种索引介绍(索引优化)、Explain性能分析、单表查询优化、排序分组优化、锁机制
    8. MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?
    9. 还不了解 MyISAM 和 InnoDB 的区别?看这里就够了
    10. InnoDB 事务与锁的前世今生 (转载)
    11. 一文带你看懂 InnoDB 中的 MVCC、Undo、Redo 机制 (转载)
    附录 : 👉

    三、JDBC

    跳转到目录

    1. JDBC 一 概述、贾琏欲执事操作、JDBCUtils工具类
    2. JDBC 一 连接池概念、DBCP、C3P0、Druid及其工具类
    3. JDBC 一 DAO组件、设计规范和设计分析
    4. JDBC 一 Spring JDBCTemplate的使用
    5. JDBC 一 DBUtils的使用、JavaBean
    6. JDBC 一 JDBC中的事务、DBUtils使用事务
    7. ThreadLocal 一 ThreadLocal原理、优化转账JDBC案例
    8. ThreadLocal能解决线程安全问题?胡扯!本文教你正确的使用姿势【享学Java】(转载)
    9. SpringBoot — 整合 数据访问、Druid连接池

    四、JavaWeb

    跳转到目录

    1. HTML相关学习 (转载)
    2. CSS — 常用属性
    3. CSS — 选择器及三大特性
    4. CSS — 网页的布局方式
    5. CSS3 一 Flex布局
    6. CSS3 — 过渡、动画、2D/3D转换
    7. CSS系列——前端进阶之路:初涉LessLess中文文档
    8. JavaScript基础–ECMAScript部分 (转载)JavaScript — 语法、基本对象
    9. JavaScript — BOM、DOM、事件
    10. JavaScript — Demo
    11. jQuery — 概述、使用、选择器、DOM操作
    12. jQuery — 动画、遍历、事件绑定
    13. XML — 简介、语法、约束、解析
    14. XML解析 — Jaxp解析器
    15. XML解析 — Jsoup解析器
    16. XML解析 — Dom4j解析器
    17. Tomcat — 简介、安装、Web目录结构等
    18. Tomcat — IDEA & Eclipse部署Web项目
    19. HTTP — 概述、请求和响应、GET和POST请求
    20. JSON — 概述、JSON语法、序列化和反序列化
    21. Servlet — 概述、实现方式、生命周期、ServletConfig类
    22. Servlet — 分析和模拟实现Servlet继承关系
    23. Servlet 一 映射细节、3.0注解配置、Servlet线程不安全问题
    24. Servlet 一 ServletContext对象
    25. Servlet 一 Web之间跳转和信息共享、三大作用域对象
    26. Servlet 一 Request和Response
    27. 会话技术 一 Cookie
    28. 会话技术 一 Session
    29. Session、Cookie和Token的主要区别
    30. 重学TCP/IP协议和三次握手四次挥手 (转载)
    31. 从输入URL到浏览器显示页面的流程 (转载)
    32. JSP — JSP原理、基本语法、三大指令
    33. JSP 一 JSP九大内置对象、四大作用域
    34. EL表达式 — 概述、运算、内置对象
    35. JSTL标签库 一 概述、if标签、for标签
    36. 三层架构和MVC思想
    37. Filter & Listener — 概述、应用、Filter的使用 & 细节
    38. Filter案例 — 请求编码、登录检查、敏感字过滤器
    39. Ajax — 概述、原理、js实现Ajax、jq实现Ajax
    40. Vue入门 — 认识Vue、Vue的指令、生命周期 (转载)

    五、MyBatis & JPA 框架

    跳转到目录

    1. MyBatis — ORM思想、MyBatis概述、日志框架、OGNL
    2. MyBaits — MyBatis的CRUD操作、别名配置、属性配置、查询结果映射、Mapper组件、参数处理、注解开发
    3. MyBatis — 动态SQL、if、where、set、foreach、sql片段
    4. MyBatis — 对象关系映射、延迟加载、关联对象的配置选择
    5. MyBatis — 缓存机制、EhCache第三方缓存
    6. 利用MyBatis自身本地缓存结合Redis实现分布式缓存 (一)
    7. 利用MyBatis自身本地缓存结合Redis实现分布式缓存 (二)
    8. MyBatis — MyBatis Generator插件使用(配置详解)
    9. MyBatis 一 分页插件PageHelper (转载)
      9.1. PageHelper的Github
    10. Spring — 整合MyBatis
    11. SpringBoot — 整合 MyBatis(注解、XML配置)
    12. MyBatis运行原理(一) : 核心组件、SqlSessionFactory的构建过程(源码分析)
    13. MyBatis运行原理(二) : 获取SqlSession的流程、getMapper获取接口代理对象流程 (源码分析)
    14. MyBatis运行原理(三) : 多参数封装Map的流程、查询实现原理 (源码分析)
    15. MyBatis插件开发 : 插件原理、插件开发流程 (前提: 了解上面运行原理知识)
    16. MyBatis拓展知识 :批量执行SQL语句、自定义TypeHandler来处理枚举类型

    1. JPA — ORM概述、JPA入门
    2. JPA — API介绍、完成JPA的CRUD操作、JPQL完成复杂查询操作
    3. Spring Data JPA — 概述、Spring Data JPA的CRUD操作
    4. Spring Data JPA — 原理剖析、Spring Data JPA的四种查询方式
    5. Spring Data JPA — Specifications动态查询
    6. Spring Data JPA — 多表设计、一对多、多对多、多表查询

    六、Spring框架

    跳转到目录

    1. Spring —工厂设计模式 、Spring⼯⼚的底层实现原理 (转载)
    2. Spring — Spring简介、入门、配置 , IoC和DI思想
    3. Spring — IoC核心(基于XML)、DI核心(基于XML)、FactoryBean、Bean的生命周期
    4. Spring — 使用IoC和DI模拟注册案例、注解配置IoC和DI、@Mapper和@Repository的区别
    5. Spring — 静态代理、动态代理、拦截器思想
    6. Spring — AOP思想、AOP开发、Pointcut语法、注解配置AOP
    7. Spring-AOP @AspectJ切点函数导读(全) (转载)
    8. Spring — DAO层、Spring JDBC、Spring事务控制
    9. Spring — XML配置事务、注解+XML、纯注解的配置方式
    10. Spring— 总结之事务和AOP (转载)
    11. Spring整合MyBatis
    12. Spring Java Config — 组件注册相关注解
    13. 【小家Spring】Spring注解驱动开发—向Spring Ioc容器中注册Bean的7种方式 (转载)
    14. Spring Boot – @Conditional注解根据特定的条件装配bean
    15. Spring Java Config — 常用注解
    16. Spring注解驱动开发 (转载)
    附录 : 👉

    七、SpringMVC框架

    跳转到目录

    1. SpringMVC — MVC思想、前端控制器、SpringMVC概述、编写第一个SpringMVC程序
    2. SpringMVC — SpringMVC的执行原理、核心组件、第一个SpringMVC程序(注解版)
    3. SpringMVC — 静态资源访问问题、处理器方法响应类型、请求转发、URL重定向
    4. SpringMVC — 处理器方法参数的处理
    5. SpringMVC — CRUD操作
    6. SpringMVC — 拦截器原理转载)
    7. SpringBoot 中Filter和Interceptor 的使用
    8. SpringMVC — 全局异常处理 @ControllerAdvice(转载)
    9. SpringMVC — JSR-303 Validation后端验证(转载)
    10. SpringMVC — 实现文件上传和下载(转载)

    SpringMVC学习笔记

    八、SpringBoot

    跳转到目录

    1. SpringBoot — 什么是SpringBoot、SpringBoot入门、创建SpringBoot
    2. SpringBoot — SpringBoot配置文件、yaml语法、JSR303校验、多环境切换Profile
    3. SpringBoot — starter启动器、SpringBoot自动配置原理、@Conditional、run方法执行流程图
    4. SpringBoot — 日志框架介绍
    5. SpringBoot — web开发、静态资源处理
    6. SpringBoot — 模板引擎的介绍、thymeleaf模板引擎
    7. SpringBoot — SpringMVC自动配置原理
    8. SpringBoot — 错误处理机制 & 定制错误页面 (源码分析)
    9. SpringBoot — 自定义 Servlet, Filter, Listener 以及替换web服务器的方式 , eg1
    10. SpringBoot — 自定义starter分析
    11. SpringBoot — 整合 数据访问、Druid连接池
    12. SpringBoot — 整合 MyBatis(注解、XML配置)
    13. SpringBoot 一 整合 Redis
    14. SpringBoot — 整合 任务(异步任务、定时任务、邮件任务)
    15. SpringBoot — 整合 SpringSecurity
    16. SpringBoot — 整合 RabbitMQ

    1. ApplicationRunner接口的作用
    2. ApplicationContextAware和BeanFactoryAware使用理解; BeanFactoryAware的使用
    3. Java事件机制; Spring中ApplicationListener
    附录 : 👉

    九、Spring Cloud & Spring Cloud Alibaba

    跳转到目录

    1. SpringCloud — SpringCloud简介、Eureka注册中心的使用
    2. SpringCloud — Ribbon的使用、Hystrix熔断器的使用
    3. SpringCloud — Gateway、Config、Bus的使用
    4. SpringCloud中的Eureka和Zookeeper的区别在哪?(CAP是什么?)
    5. Dubbo — RPC技术、Zookeeper注册中心、Dubbo的配置 (转载)
    附录 : 👉

    十、Redis

    跳转到目录

    1. Redis — NOSQL、Redis概述、通用命令、Redis五大数据类型、三大特殊类型
    2. Redis — Redis持久化机制、RDB持久化、AOF持久化
    3. Redis — Java操作Redis、Jedis连接池、使用Redis缓存不常修改的数据
    4. Redis——SpringBoot整合Redis核心API : redisTemplate.opsForValue/List/Set/Hash/Zset/Geo/HyperLogLog
    5. Redis — Redis事务、watch锁、Redis实现分布式锁、数据的删除策略
    6. 利用MyBatis自身本地缓存结合Redis实现分布式缓存 (一)
    7. 利用MyBatis自身本地缓存结合Redis实现分布式缓存 (二)
    8. Redis — 主从复制简介、工作流程、常见问题
    9. Redis — 哨兵机制 Sentinel
    10. Redis — Redis集群原理、缓存预热、缓存击穿、缓存穿透、缓存雪崩的解决方案
    11. 布隆过滤器解决缓存穿透问题 (转载)

    其他缓存

    附录 : 👉

    十一、Spring Security、Shiro

    跳转到目录

    1. Spring Security — 认证授权的概念、Session, Token的认证区别、授权的数据模型、RBAC实现授权
    2. 基于Session实现认证授权功能
    3. Spring Security — 介绍、简单使用、SpringBoot整合Spring Security
    4. Spring Security — 认证、授权的工作原理
    5. Spring Security — 自定义登录页面、连接数据库进行认证、url授权, 方法授权两种方式
    6. JWT — 概念、认证流程、结构、使用JWT
    7. JWT — SpringBoot整合JWT
    8. 安全框架Shiro — Shiro简介、架构、Quickstart程序
    9. 安全框架Shiro — SpringBoot整合Shiro
    10. 安全框架Shiro — Shiro认证、授权流程

    十二、消息中间件 RabbitMQ

    跳转到目录

    1. RabbitMQ — 消息服务概述、RabbitMQ的概述
    2. RabbitMQ——运行机制、RabbitMQ支持的消息模式
    3. SpringBoot — 整合 RabbitMQ
    4. RabbitMQ — 六种工作模式、原生API、SpringBoot整合RabbitMQ
    附录 : 👉

    十三、ElasticSearch学习目录:(转载系列)

    跳转到目录

    十四、开发工具的使用

    跳转到目录

    1. IntelliJ IDEA 教程 (转载)
    2. Maven基础 — 概述、安装、命令、依赖管理、IDEA创建Maven工程
    3. Maven基础 — 自定义Maven骨架步骤、Maven案例
    4. Linux — 概述、基本命令、vim的使用
    5. Maven高级 — 简介、安装配置、依赖冲突、部署、私服使用 (转载)
    6. Git 一 Git的安装、命令、IDEA使用Git的详解、Github (部分转载)
    7. Swagger 一 介绍、如何生成接口文档
    8. Thymeleaf语法总结 (转载)
    9. 阿里云CentOS安装FastDFS

    vue-json-viewer实现JSON效果【高亮、可折叠、可复制】

    更多相关内容
  • java学习笔记.txt

    2019-07-20 23:04:40
    java学习笔记,java基础知识,只用于个人学习。
  • java学习笔记1

    2018-09-20 15:32:54
    学习java过程中的笔记
  • JAVA学习笔记(全面)

    2018-09-21 22:05:00
    最全面的JAVA课堂笔记,来之不易,希望大家能帮助到刚开始学习JAVA的同学。
  • 阿里P8 架构师整理Java学习笔记 , 499 页, 图文结合, 源码级分析
  • 针对初学者,一些笔记整理,Java的知识就是这 样积少成多啊
  • 韩顺平编写的java学习笔记(全) 包含各种java的基本语法,以及3大项目的详细设计解释以及代码
  • Java学习笔记(必看经典) Java学习笔记(必看经典) Java学习笔记(必看经典)
  • java学习笔记markdown

    2021-03-12 10:11:14
    狂神说java学习笔记,markdown版
  • java学习笔记

    2018-03-23 00:11:43
    java学习笔记java学习笔记java学习笔记java学习笔记个人用
  • 此资源为我跟着B站up主【遇见狂神说】java系列视频中前端入门部分学习过程中所写 大部分和视频保持一致,有一些自己的理解和一些扩展的部分
  • JAVA学习笔记 林信良

    2013-08-19 01:45:36
    林信良的《JAVA学习笔记》电子版,从作者网站中下载
  • Java学习笔记(必看经典)
  • JAVA学习笔记经典版

    2022-04-28 20:56:19
    JAVA小白进阶笔记,大家一起加油呀! JAVA小白进阶笔记,大家一起加油呀!JAVA小白进阶笔记,大家一起加油呀!JAVA小白进阶笔记,大家一起加油呀!JAVA小白进阶笔记,大家一起加油呀!JAVA小白进阶笔记,大家一起加油呀!JAVA...
  • java黑马学习笔记

    2019-02-21 13:21:19
    是我从黑马资源中抓出来的每天教师上课的笔记,对于基础学习者帮助还是很大的,毕竟视频太多了,不可能全部看完,但是笔记就不一样.
  • Java相关课程系列笔记之一Java学习笔记
  • 1.Java_SE基础全程学习笔记.pdf 2.Java开发工作经验高级特性总结.pdf 3.Java数据结构笔记.pdf 4.Java学员总结笔记.pdf
  • Java JDK 9学习笔记》是作者多年来教学实践经验的总结,汇集了学员在学习Java 或认证考试时遇到的概念、操作、应用等问题及解决方案。《Java JDK 9学习笔记》针对Java SE 9 新功能全面改版,无论是章节架构或范例...
  • java学习笔记(详细)

    千次阅读 多人点赞 2019-02-08 16:50:12
    java学习笔记 文章目录java学习笔记1.基本的输入输出2.基本数据类型3.复合数据类型4.程序流程语句5.数组6.字符串7.面向对象* 类的基本知识* 封装性* 继承性* 多态性 1.基本的输入输出 java是纯面向对象的语言,连...

    java学习笔记

    1.基本的输入输出

    • java是纯面向对象的语言,连主函数都写在一个类中,java中没有指针
    • java 用类声明对象的时候 ,实际上,该对象只是一个能够引用对象的简单变量。该声明要创建一个对象的实际的物理拷贝,并把对于该对象的引用赋给该变量。这是通过使用new 运算符实现的。
    • new运算符为对象动态分配(即在运行时分配)内存空间,并返回对它的一个引用。这个引用或多或少的是new分配给对象的内存地址。然后这 个引用被存储在该变量中。这样,在Java 中,所有的类对象都必须动态分配。
    • Scanner 类是用于扫描输入文本
    * nextInt(): 只读取数值,剩下”\n”还没有读取,并将光标放在本行中
    * next():只读空格之前的数据,并且光标指向本行,方法遇见第一个有效字符(非空格,非换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串。
    * nextLine(): 可以扫描到一行内容并作为一个字符串而被获取到。
    public class Nextest 
    {
    	public static void main(String[] args) 
    	{
    		 String s1,s2;  
    	     Scanner sc =new Scanner(System.in);  
    	     System.out.print("请输入第一个字符串:");  
    	     s1=sc.next();  
    	     System.out.print("请输入第二个字符串:");  
    	     s2=sc.nextLine();  
    	     System.out.println("输入的字符串是:"+s1+" "+s2);  
    	}
    }
    请输入第一个字符串:1
    请输入第二个字符串:输入的字符串是:1 
    
    • nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。
    • System.out.println(); 是最常用的输出语句,它会把括号里的内容转换成字符串输出到输出窗口(控制台),并且换行,当输出的是一个基本数据类型时,会自动转换成字符串,如果输出的是一个对象,会自动调用对象的toString();方法,将返回值输出到控制台
    • System.out.print(); 与第一个很相似,区别就是上一个输出后会换行,而这个命令输出后并不换行。
    • System.out.printf(); 这个方法延续了C语言的输出方式,通过格式化文本和参数列表输出。
    • java中没有输入一个字符的方法,如果想输入一个字符就需要用到charAt()方法
    Scanner read = new Scanner(System.in);
    char key1 = read.next().charAt(0);
    把字符串的第一个char值赋值给key1,类似于数组的查找
    charAt(int index)方法是一个能够用来检索字符串特定下标的方法
    str.charAt(str.length()-1)检索字符串的最后一个字符。
    

    2.基本数据类型

    • 逻辑类型:boolean
    • 整数类型:byte(一个字节)、short(两个)、int(四个)、long(八个)
    • 字符类型:char(两个字节)因为java中汉字是两个字节,为了方便使用,将字母和汉字都改为两个字节,对应的是unicode表
    • 浮点类型:float(四个字节)、double(八个字节)
    • java中变量可以用中文表示,其中float型常量必须加f / F,与double区分开

    • 我们平时所说的字符串类型(String),它不是基本类型,而是一个对象类型,Java是将字符串作为对象实现的.

    • java中的标识符:由一个字母或者一串以字母开头由字母、数字或符号组成的字符串(符号只允许下划线_和美元$符号)

    • java中true、false、null都是小写,C++中大写,无 sizeof 运算符,goto和const是Java编程语言中保留的没有意义的关键字。

    3.复合数据类型

    • 用户定义的、由一系列简单数据类型及其运算符合而成。是一种引用模型
    public class Hello 
    {
    	public static void main(String[] args) 
    	{
    		Point p = new Point(1,1);
    		p.show();
    		p.move(2, 3);
    		p.show();
    	}
    }
    class Point
    {
        static String color;
        int x, y;
        Point(int x, int y)
        {
        	this.color = "blue";
        	this.x = x ;
        	this.y = y ;
        }
        public void move(int dx,int dy)
        {
        	x+=dx;
        	y+=dy;
        }
        public void show()
        {
        	System.out.println("color = " +color );
        	System.out.println("x = " + x );
        	System.out.println("y = " + y);
        }
    }
    color = blue
    x = 1
    y = 1
    color = blue
    x = 3
    y = 4
    

    4.程序流程语句

    break 可以跳出指定循环
    outer:  for(int i=0;i<3;i++) 
    		{
    				System.out.print("Pass "+i+": ");
    				for (int j=0;j<100;j++) 
    				{
    					if (j==10) 
    					break outer;
    					System.out.print(j+" ");
    				}
    				System.out.println("This will not print");
            }
    		System.out.println("\nLoops complete.");
    Pass 0: 0 1 2 3 4 5 6 7 8 9 
    Loops complete.
    continue可以跳过指定循环
    

    5.数组

    • 声明一个数组仅为数组指定了数组名和元素的数据类型,并未指定数组元素的个数,系统无法为数组分配存储空间。声明后的数组由初始化来完成上述工作,经过初始化new操作符完成,也可以通过给元素赋初值完成。
    • Java中不允许在声明数组的方括号内指定元素个数
    数组元素类型  数组名字 [];
    数组元素类型  [] 数组名字;
    数组名字 = new 数组元素类型[元素的个数];
    类型标识符  数组名[ ] [ ]=new 类型标识符[行数][列数] ;
    类型标识符 [ ] [ ] 数组名= new 类型标识符[行数][列数];
    获得行数     数组名.length 
    获得列数     数组名[行标].length
    
    
    
    int a[]={1,2,3,4}; 
    float [] b = {84.124F, 78.2F, 61.5F};
    boolean[] c = {true, false, false, true};
    String[] d = {"Zhang", "Li", "Wang"};
    char s[] = new char[10];
    
    String s[ ][ ]=new String[2][ ];
    s[0] = new String[2];
    s[1] = new String[3];
    s[0][0] = new String(“Good”);
    s[0][1] = new String(“Luck”);
    //非矩阵数组
    int twoDim[ ][ ] = new int [4][ ];
    twoDim[0] = new int[2];
    twoDim[1] = new int[4];
    twoDim[2] = new int[6];
    twoDim[3] = new int[8]; 
    
    
    
    char b[] = {'A','B','C'};
    System.out.println(b);
    System.out.println("数组b" + b);
    
    ABC
    数组b[C@3b192d32        
    
    *对于char型数组System.out.println(b)不会输出数组b的引用,而是输出数组b的所有元素的值
    *而要输出引用需要让数组b和字符串做并置运算。
    
    
    • 对于java 复制数组是把元素的值复制到另一个数组中去,如果执行a = b ,两个数组的引用相同,那么指向的同一内存空间,如果a[0]的值发生改变,那么b[0]的值也发生改变,这样就违背了复制数组的概念了。
    //1.arraycopy()方法
    System.arraycopy(a, 0, b, 0, 6);// 原数组,要开始复制的索引值,复制数组,从第几个复制,复制到第几个的索引值
    System.out.println(Arrays.toString(b));//打印数组
    //2.Arrays.copyOf方法
    int d [];
    d = Arrays.copyOf(a, 7);//原数组,新数组的长度,返回的是新数组
    System.out.println(Arrays.toString(d));
    //3.Arrays.copyOfRange()方法
    int e [];
    e = Arrays.copyOfRange(a, 2, 4);//原数组,要复制原数组的起点,要复制原数组的终点,返回的是新数组
    System.out.println(Arrays.toString(e));
    Arrays.sort(a);//对数组升序排序方法
    

    6.字符串

    • 声明 : String 字符串变量;
      初始化: 字符串变量 = new String();
      合并使用 String 字符串变量 = new String();
      *length() 返回字符串长度
      char charAt(int index)返回字符串中第index个字符
      int indexOf(int ch)返回字符串中字符ch第一次出现的位置
      int indexOf(String str,int index)返回值为,从字符串的第index位置开始,子串str第一次出现的位置
      subString(int index1 ,int index2)返回的是从字符串的第index1位置开始到index2位置结束的子串
    String s=new  String();
    s=“I am a student.;
    s.length()的值为15
    s.charAt(7)的值为s
    s.indexOf(‘a’) 其值为2
    注意字符串从0计数
    找不到其值为-1
    s.indexOf(“stu”,0)的值为7,
    s.indexOf(“stu”,9)的值为-1
    s.subString(7,13)的值为“studen”
    
    • 字符串的比较
      字符在计算机中是按照Unicode编码存储的,两个字符串的比较实际上是字符串中对应字符编码的比较。从首字符开始逐个向后比较对应字符,当发现了一对不同的字符或到字符串末尾,两个字符串比较结束。
    • 常用的成员方法
      equals (Object obj)本字符串与obj字符串比较,相等返回true,不等返回false
      equalsIgnoreCase(String str)字符串比较,忽略大小写
      compareTo(String str)返回值为整型,本字符串大于str取正值,小于取负值,相等取0值。
    String s=new String(“student”);
    s.equals(“Student”)的值为false
    s.equalsIgnoreCase(“Student”)
    的值为true
    s.compareTo(“five student”)的值为正
    s.compareTo(“two student”)的值为负
    
    • 字符串与其他数据类型的转化
      在这里插入图片描述
      String.valueOf(基本数据类型)
      如 StringvalueOf(123)的值为“123”
      StringvalueOf(0.34)的值为“0.34”

    7.面向对象

    * 类的基本知识

    默认构造函数:

    • 默认构造函数是与类名相同不带参数的没有返回值的函数,如果不写系统会自动隐含一个内容为空的构造函数。
    • 构造函数是在new 一个对象时调用的。

    static关键字:

    • 在变量和方法中被static修饰的成为类变量或类方法,这些时属于类的,在没有声明对象前,系统已经为其分配内存,这个类的所有对象都的这个变量都公用这一段内存,可以说是对象的共享变量。
    • 类方法只能调用类变量和类方法,不能调用其他方法(因为其他变量和方法在对象没被申请前没有分配内存),而其他方法可以调用类方法和类变量。
      类方法是属于类的可以用类名直接调用。

    this关键字:

    • 当this关键字出现在方法中时,他代表正在调用该方法的对象,this. 可以调用该类的实例方法和对象,所以一般可以省略。
    • this不能出现在类方法中,因为类方法通过类名直接调用,这时可能还没有任何对象产生。

    super关键字:

    • 当子类与父类的变量或方法同名时,子类可以覆盖父类的方法,但是如果想在子类中调用父类的同名方法,就需要用到super关键字,super . 可以操作被隐藏的成员变量和方法

    final关键字:

    • final顾名思义就是最终的,final类不能被继承,即不能有子类。
    • 如果用final修饰一个方法,则这个方法不能被子类重写。
    • 常量:如果成员变量被修饰为final,则就是常量,常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能发生变化

    * 封装性

    在类的定义中设置对对象中的成员变量和方法进行访问的权限。
    提供一个统一供其它类引用的方法。
    其它对象不能直接修改本对象所拥有的属性和方法。

    • 对象变量的四种访问权限
      public protected private 默认

    默认:

    • 假如类或者类成员不含有一个明确的访问说明,说明它具有默认的访问控制特性。默认的访问控制权规定类或者类成员只能被同一个包中的其他代码所访问,在包外不可见。这种访问特性称为包访问性。

    private:

    • 用private修饰的类成员只能被该类中的其他成员所访问,在该类外不可见。

    protected:

    • 使用protected定义的成员变量或方法具有二重性,类本身、子类或包中的方法可以访问它们,而其它类没有访问权限

    在这里插入图片描述


    • 包:一些类可以封装成一个包,其他类可以import这个包使用其中的类
      未设定public或private访问权限, 包内的所有类可以访问它们,包外的无法访问。
      一个Java程序文件只能定义一个public类,而且程序文件必须与它同名。为其它程序共享的类须经过编译进行打包,形成一个包文件,然后用import语句加以引用。

    * 继承性

    子类可以沿用父类(被继承类)的某些特征。子类也可以具有自己独立的属性和操作。但java中子类只能有一个父类

    • 用关键字 extends + 父类名,如果字类和父类在同一个包内,那么子类继承父类的 除 private的所有属性和操作,如果不在同一个包内,那么子类继承父类的protected和public的成员变量和方法,继承之后的访问权限保持不变

    构造方法的继承:

    • 子类可以无条件的继承父类不含参数的构造方法
    • 如果子类没有构造方法,则它继承父类无参数的构造方法作为自己的构造方法;如果子类有构造方法,那么在创建子类对象时,则将先执行继承下来的父类的构造方法,然后再执行自己的构造方法
    • 对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造方法中的第一条语句。
    • 如果父类中没有无参的构造函数,则子类不能调用父类的隐含的构造函数,系统不会自动生成,会报错,这时只能用super调用父类的带参数的构造函数。
    • 当用子类的构造方法创建一个对象时,子类的构造方法总是先调用父类的,因此在创建对象时不仅子类声明的成员变量分配了内存,而且父类的所有成员变量也分配了内存,但只将其中一部分(子类继承的)作为分配给子类的变量

    成员变量的隐藏

    • 子类可以隐藏继承的成员变量,只要子类中声明的成员变量和父类中的重名,子类就隐藏了继承的成员变量,但是子类可以通过第哦调用从父类继承的方法来操作隐藏的成员变量。

    成员方法的重写

    • 子类可以通过重写来隐藏已经继承的父类的方法,但是要求子类的类型与父类的方法类型一致,并且这个方法的名字、参数个数、参数类型和父类的必须完全相同。
      *重写时要注意不能降低父类原来的访问权限。

    * 多态性

    对象的上转型对象:

    • 把子类对象的引用放到父类的对象中,那么称父类的对象是子类对象的上转型对象。
    • 上转型对象不能操作子类新增的成员变量或新增的操作方法,但可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的方法

    多态

    • 当一个类有很多子类,并且这些子类都重写了父类中的某个方法,把这些对象的引用付给父类的对象,就得到了这些对象的上转型对象,那么父类对象就可以调用不同子类的同一方法而产生不同的行为。
    • 多态性指的是父类的某个方法被子类重写时,可以用父类对象各自产生自己的行为功能。

    abstract类和方法

    • 抽象类是专门设计为子类继承的类,抽象类通常都包括一个或多个抽象方法(只有方法说明,没有方法体),抽象方法体中内容,根据继承抽象类的子类的实际情况,有子类完成其抽象方法的代码。
    • abstract类可以有abstract方法,也可以有非abstract方法,如果有abstract方法,则一定是抽象类,不是抽象类不能有abstract方法。
    • final和abstract不能同时使用,因为final所修饰的方法不能被重写,而abstract修饰的必须在子类中被重写,所以矛盾,不能同时使用。
    • abstract类不能用new运算符创建对象,如果一个abstract类是一个abstract类的子类,它可以重写父类的abstract方法,也可以继承这个abstract方法。
      ####* 接口
    • java不支持多继承性,一个类只能继承一个父类,所以为了克服单继承的缺点,java使用了接口,一个类可以有多个接口,用关键字interface来定义一个接口。

    接口体

    • 接口体中只有抽象方法,而且接口体中所有常量的访问权限一定都是public(允许省略public和final)所有抽象方法的访问权限一定是public(允许省略public,abstract)

    接口的使用:

    //A 实现了B,C两个接口
    class A implements B,C
    //B继承A类并且实现C接口
    class B extends A implements C    
    
    • 如果一个类实现了某个接口,那么这个类就必须重写该接口的所有方法,重写接口的方法时,接口中的方法一定是public abstract方法,所以类在重写的时候不仅要去掉abstract修饰符,而且方法的访问权限一定要明显的使用public来修饰,否则就是默认访问权限,这就降低了该方法的访问权限,这时不允许的。
    • 常在接口中定义常用的变量,作为全局变量使用,接口中的变量,本质上都是static,而且是final的 ,无论是否用static修饰,必须以常量值初始化。
    • 一个接口不能继承其它的类,但是可以继承别的接口
    • 类重写的接口方法以及接口中的常量可以被类的对象调用,而且常量也可以通过类名或接口名直接调用。
    • 声明接口是时,如果在关键字interface前加上public关键字,则这个接口可以被任何一个类声明实现,如果不加public,则是默认接口,只能被同一个包内的类所实现。
    • 如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必用implements声明这个接口。
    • 接口也可以被继承,可以通过关键字extends声明一个接口是另一个接口的子接口,由于接口中的常量和方法都是public的所以子接口将继承父接口中的所有常量和方法。
    • 如果一个类声明实现一个接口,但是没有重写接口中的方法,那么这个类必须是abstract类。

    接口回调
    接口回调是指把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法。(当接口变量调用被类重写的接口方法时,就是通知相应的对象调用这个方法)

    展开全文
  • Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
  • 良葛格写的Java学习笔记(完整版), 很适合初,中级java选手,也适合高手查找资料,复习.
  • ——————————————————————————————————————————————
  • 良葛格的Java学习笔记~讲解得非常详细。JDK5.0的~是Java入门的不错选择。
  • 狂神说Java--Java学习笔记(合集)

    万次阅读 多人点赞 2021-04-26 21:49:59
    预科 什么是计算机 名称:Computer,全称电子计算机,俗称电脑。 定义:能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 组成:由硬件和软件组成。 形式:常见显示有台式计算机、笔记本计算机、...

    笔记参考来源狂神说Java视频https://www.bilibili.com/video/BV12J41137hu
    本篇笔记有点长,可以根据目录定位,建议配合视频学习。

    预科

    什么是计算机

    1. 名称:Computer,全称电子计算机,俗称电脑。
    2. 定义:能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。
    3. 组成:由硬件和软件组成。
    4. 形式:常见显示有台式计算机、笔记本计算机、大型计算机等。
    5. 应用:科学计算、数据处理、自动控制、计算机辅助设计、人工智能、网络等领域。

    硬件及冯诺依曼结构

    计算机硬件

    组成:cpu,主板,内存,电源,主机箱,硬盘,显卡,键盘、鼠标,显示器。

    冯诺依曼结构

    在这里插入图片描述

    软件及软件开发

    计算机软件

    Windows常用快捷键

    Alt+f4关闭窗口 Shift+Delete永久删除 ctrl+w自动保存

    死机:任务管理器结束进程

    基本的Dos命令

    打开CMD的方式

    1. 开始+系统+命令提示符
    2. win键+R+输入cmd (推荐使用)
    3. 在任意的文件夹下,按住Shift键+鼠标右击,打开命令行窗口
    4. 在资源管理器地址栏路径前面加 “cmd ”
    5. 管理员运行方式:命令提示符右键以管理员身份运行(最高权限运行)

    常用的Dos命令

    # 盘符切换 E:
    # 查看当前目录下所有文件 dir
    # 切换目录 cd /d E:\idea
    # 返回上一级目录 cd ..
    # 进入同级目录下的下一级目录 cd tmp(该目录下的文件名)
    # 清屏 cls (clear screen)
    # 退出终端 exit
    # 查看电脑当前IP地址 ipconfig
    
    # 打开计算器 calc
    # 打开画图 mspaint
    # 新建记事本 notepad
    
    # 在当前目录新建文件夹 md test(文件夹名)
    # 新建文件 cd> a.txt(文件名)
    # 删除文件 del a.txt(文件名)
    # 删除目录 rd test(目录名)
    
    # ping命令(复制链接进入Dos直接单击鼠标右键粘贴)
    	ping www.baidu.com
    

    计算机语言发展史

    • 第一代语言:机器语言
    • 第二代语言:汇编语言
    • 第三代语言:高级语言

    高级语言

    C、C++、Java、C#、Python、PHP、JavaScript …

    大体上分为:面向过程面向对象两大类

    • C语言是典型的面向过程的语言,C++,Java是典型的面向对象的语言


    Java入门

    Java帝国的诞生

    在这里插入图片描述
    在这里插入图片描述

    Java特性与优势

    • 简单性
    • 面对对象
    • 可移植性
    • 高性能
    • 分布式
    • 多态性
    • 多线程
    • 安全性
    • 健壮性

    Java三大版本

    • Write Once,Run Anywhere
    • JavaSE: 标准版 (桌面程序,控制台开发…)
    • JavaME: 嵌入式开发 (手机,小家电…),已经凉了
    • JavaEE: E企业级开发 (Web端,服务端开发…),JavaSE为基础

    JDK JRE JVM

    • JDK:Java Development Kit (Java开发者工具,包括 JRE,JVM)
    • JRE:Java Runtime Environment (Java运行时环境)
    • JVM:Java Virtual Machine (Java虚拟机,跨平台核心)

    安装开发环境

    卸载JDk

    1. 删除Java安装目录
    2. 删除环境变量JAVA_HOME
    3. 删除path下关于JAVA的目录
    4. Java -version

    安装JDK

    1. 百度搜索JDK8,找到下载地址
    2. 同意协议,下载电脑对应的版本,如64位操作系统下载 jdk-8u281-windows-x64.exe
    3. 双击安装JDK
    4. 记住安装路径
    5. 配置环境变量
      1. 我的电脑-》属性-》系统高级设置-》环境变量
      2. 系统变量 新建–> JAVA_HOME 输入对应的jdk安装路径
      3. path变量–>% JAVA_HOME%\bin
    6. 测试是否成功 cmd–>Java -version


    Java基础

    注释

    1. 单行注释 //
    2. 多行注释 /* */
    3. 文档注释 /** */

    标识符和关键字

    • Java 所有的组成部分都需要名字。类名、变量名、方法名都被称为标识符

    关键字

    在这里插入图片描述

    标识符注意点

    • 所有标识符都应该以 字母、$(美元符)、_(下划线) 开头
    • 首字母之后可以是 字母、$、_ 或数字任何字符组合
    • 关键字不能作为变量名或方法名
    • 标识符大小写敏感
    • 可以用中文命名,但不建议使用,即使用拼音命名也Low

    数据类型

    • 强类型语言

      • 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
    • 弱类型语言:JavaScript,Python

    • Java的数据类型分为两大类

      • 基本类型(primitive type),有8大基本类型,此外都是引用类型
      • 引用类型(reference type)

    在这里插入图片描述

    //整数
    int num1 = 10; //最常用,只要别超过21亿(2^31-1)
    byte num2 = 20; //-128~127
    short num3 = 30;
    long num4 = 30L; //long类型数字后面要加个L(尽量用大写,小写l容易与1搞混)
    
    //小数:浮点数
    float num5 = 50.1F; //float类型数字后面要加个F
    double num6 = 3.141592653589793238;
    
    //字符
    char name = '国';
    //字符串, String不是关键字,是类
    //String namea = "薛之谦";
    
    //布尔值:是非
    boolean flag = true
    

    什么是字节

    • 位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进制数
    • 字节(byte, B):是计算机中 数据处理 的基本单位,习惯上用大写B表示
    • 1B(byte) = 8bit,1字节等于8位
    • 字符:指计算机中使用的字母,数字,字和符号
      • 1bit表示1位
      • 1Byte表示一个字节 1B=8b
      • 1024B = 1KB, 1024KB = 1M, 1024M = 1G

    扩展及面试题

    //整数扩展: 二进制0b		八进制0		十进制		十六进制0x
    int i = 10;
    int i2 = 010; //八进制 8
    int i3 = 0x10; //十六进制 16
    
    //浮点数扩展:
    //面试题:银行业务字母怎么表示钱? BigDecimal(数学工具类)
    //float double是有问题的,最好避免使用浮点数进行比较
    float f = 0.1f; 	//0.1
    double d = 1.0/10;  //0.1
    System.out.println(f==d); //false
    //浮点数 位有限,舍入误差,大约
    //最好避免使用浮点数进行比较
    float f1 = 23131313131f;
    float f2 = f1+1;
    System.out.println(f1==f2); //true
    
    //字符扩展:所有字符本质还是数字
    char c1 = 'a';
    char c2 = '中';
    
    System.out.println(c1);		//a
    System.out.println((int)c1);//强制类型转换,97
    System.out.println(c2);		//中
    System.out.println((int)c2);//强制类型转换,20013
    
    //编码 Unicode表(97=a,65=A)2字节 0-65536
    //U000~UFFFF 十六进制(u0061=a,相当于十进制的97)
    System.out.println('\u0061');  //a '\'是转义字符
    
    //布尔值扩展
    boolean flag = true;
    if(flag==true){} //新手
    if(flag){}	//老手这样写 Less is More(代码要精简易读)
    

    类型转换

    • 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。

    • 容量高–>低:
      在这里插入图片描述

    • 运算中,不同类型的数据先转化位同一类型,再进行运算。

      • 强制转换,(类型)变量名,容量由高到低
      • 自动转换,容量由低到高
    //强制转换 (类型)变量名 高--低
    //自动转换 低--高
    int i = 128;
    byte b = (byte)i; //强制转换 内存溢出 -128~127
    double d =i; //自动转换
    
    System.out.println(i); //128
    System.out.println(b); //-128
    System.out.println(d); //128.0
    /*
       注意点:
       1.不能对布尔值进行转换
       2.不能把对象类型转换为不相干的类型
       3.在把高容器转换到低容量的时候,强制转换
       4.可能存在内存溢出,或者精度问题
     * */
    System.out.println((int)23.7); //23 丢失精度
    char c = 'a';
    int n = c+1;
    System.out.println(n); //98
    System.out.println((char)n); //b
    
    //当操作数比较大时,注意溢出问题
    //JDK7新特性,数字之间可以用下划线分割
    int money = 10_0000_0000; //10亿,下划线不会被打印出来
    System.out.println(money); //1000000000
    int years = 20;
    
    int total = money*years;  //数据大,溢出
    System.out.println(total); //-1474836480
    
    long total2 = money*years; //默认是int,转换前就有溢出问题
    System.out.println(total2); //-1474836480
    
    long total3 = money*(long)years; //先把一个数转Long
    System.out.println(total3); //20000000000
    

    变量、常量、作用域

    • 变量是什么:就是可以变化的量
    • Java是一种强类型语言,每个变量都必须声明其类型
    • Java变量是程序中最基本的存储单元,要素包括变量名,变量类型和作用域
    //数据类型 变量名 = 值;
    type varName [=value][{,varName[=value]}];
    //可以使用逗号隔开同多个类型的变量,但不建议在一行定义多个变量
    

    变量作用域

    • 类变量(static)
    • 实例变量
    • 局部变量
    public class Variable{
        static int 	allClicks = 0; //类变量
        String str = "hello world"; //实例变量
        public void method(){
            int i=0; //局部变量
        }
    }
    

    常量

    • 常量:初始化后不能再改变的值,不会变动的值。
    • 可以理解为一种特殊的变量,其值被设定后,在程序运行过程不允许被更改。
    //常量一般用大写字符
    final 常量名=;
    final double PI=3.14;
    
    //修饰符 不存在先后顺序,static可以写final后面
    static final doube PI=3.14; //类变量,该类下的全局范围
    

    变量的命名规范

    • 所有变量、方法、类名:见名知意
    • 类成员变量:首字母小写+驼峰原则:lastName
    • 局部变量:首字母小写+驼峰原则
    • 常量:大写字母和下划线:MAX_VALUE
    • 类名:首字母大写+驼峰原则:Man,GoodMan
    • 方法名:首字母小写+驼峰原则:run(),fastRun()

    运算符

    在这里插入图片描述

    int a=10;
    int b=20;
    System.out.println(a/b); //0
    System.out.println((double)a/b); //0.5
    
    long c=12300000000;
    System.out.println(a+b); //int
    System.out.println(a+c); //long 自动转换式子中容量大的数据类型
    

    自增自减运算符

    // ++自增 --自减 单目运算符
    int a = 3;
    int b = a++; //b=a,a=a+1 先赋值 即b=3 a=4
    int c = ++a; //a=a+1,c=a 先自增 即a=5 c=5
    
    System.out.println(a); //5
    System.out.println(b); //3
    System.out.println(c); //5
    
    //幂运算 2^3 2*2*2=8
    double pow = Math.pow(2,3); // (底数,指数)double型
    System.out.println(pow); //8.0
    
    //扩展:笔试题 i=5 s=(i++)+(++i)+(i--)+(--i) s=?
    int i=5;
    int s=(i++)+(++i)+(i--)+(--i);
    System.out.println(s); //24
    

    逻辑运算符

    • && 逻辑与运算:两个变量都为真,结果为true
    • || 逻辑与运算:两个变量有一个为真,结果为true
    • ! 取反,真变为假,假变为真
    // 与(snd) 或(or) 非(取反)
    boolean a = true;
    boolean b = false;
    
    System.out.println(a&&b); // false
    System.out.println(a||b); // true
    System.out.println(!(a&&b)); // true
    
    int c=5;
    boolean d = (c<5)&&(c++<5); //第一个值为false,后面就不进行判定了
    System.out.println(d); //false
    System.out.println(c); //5 c++未执行
    

    位运算

    /*
        A = 0011 1100
        B = 0000 1101
    
        A&B 0000 1101 按位与
        A|B 0011 1101 按位或
        A^B 0011 0001 异或
        ~B  1111 0010 非
    
        面试题:2*8 怎么算最快? 2<<3
        <<左移  *2 效率极高!!
        >>右移  /2
       */
    System.out.println(2<<3); // 16
    

    三元运算符

    int a = 10;
    int b = 20;
    
    a+=b; // a = a+b
    a-=b; // a = a-b
    
    System.out.println(a); //10
    //字符串连接符 + ,转化为String类型,然后拼接    注意!!
    System.out.println(""+a+b); //1020
    System.out.println(a+b+""); //30 先进行运算,再转为String拼接
    System.out.println(a+b+"str"); //30str
    
    // x ? y : z
    //如果x为真,则结果为y,否则为z
    //if(x) y; else z;
    int score = 80;
    String type = score<60?"及格":"不及格";
    System.out.println(type); //及格
    

    包机制

    • 为了更好地组织类,Java提供了包机制,由于区分类名的命名空间
    • 包的语法格式:
    package pkg1[.pkg2[.pkg3...]];
    
    • 一般利用公司域名倒置作为包名;com.kuangstudy.www

    • 为了能够使用一个包的成员,需要在Java程序中导入该包

    import package1[.package2...].(className|*); //通配符* 导入包下所有的类
    
    • 参考:阿里巴巴Java开发手册

    JavaDoc生成文档

    • javadoc命令是用来生成自己API文档的

    • 参数信息

      • @author 作者名
      • @version 版本号
      • @since 指明最早用的jdk版本
      • @param 参数名
      • @return 返回值情况
      • @throws 异常抛出情况
    • API文档:https://docs.oracle.com/javase/8/docs/api/

    /**
     * @author Kuangshen
     * @version 1.0
     * @since 1.8
     */
    public class Demo05 {
        String name;
    
        /**
         * @author kuangshen
         * @param name
         * @return
         * @throws Exception
         */
        public String test(String name) throws Exception{
            return name;
        }
        
    }
    
    1. 打开某个类所在文件夹下的cmd命令行
    2. 输入:javadoc -encoding UTF-8 -charset UTF-8 Doc(类名).java
    3. 会自动生成该类有关的API文档,查看文件夹发现多了一些文件
    4. 打开 index.html(首页)查看文档注释


    Java流程控制

    用户交互Scanner

    • 之前我们学的基本语法并没有实现程序和人的交互,Java给我们提供了一个工具类,可以获取用户的输入java.util.Scanner是Java5的新特征,我们通过Scanner类来获取用户的输入。
    • 基本语法
    Scanner s = new Scanner(System.in);
    
    • 通过Scanner类的 next()与 nextLine()方法获取用户的字符串,读取前一般用hasNext()与hasNextLine()判断是否还有输入的数据。
    //创建一个扫描器对象
    Scanner scanner = new Scanner(System.in);
    
    System.out.println("使用next方式接收");
    //判断用户有没有输入字符串
    if(scanner.hasNext()){  //使用hasNextLie()会接收一行 "hello word"
        //使用next方式接收
        String str = scanner.next(); 
        System.out.println("输入的内容为:"+str);
        //input: hello word
        //输入的内容为:hello
    }
    //凡是属于IO流的类如果不关闭会一直占用资源
    scanner.close();
    

    next()

    1. 一定要读取到有效字符才可以结束输入
    2. 对输入有效字符之前遇到的空白,next()方法会将其去掉
    3. 只有输入有效字符后才将其后面输入的空白作为结束符
    4. next()不能得到带有空格的字符串

    nextLine()

    1. Enter作为结束符,即返回输入回车之前所有的字符
    2. nextLine()可以获取空白
    //从键盘接收数据
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入数据:");
    
    String str = scanner.nextLine();
    System.out.println("输入的内容为:"+str);
    scanner.close();
    
    System.out.println("请输入整数:");
    if(scanner.hasNextInt()){
        int i=scanner.nextInt();
        System.out.println("输入的整数为:"+i);
    }else {
        System.out.println("输入的不是整数数据");
    }
    

    顺序结构

    • Java的基本结构就是顺序结构,除非特别指明,否则就按语句一条一条执行。
    • 顺序结构是最简单的算法结构。
    • 语句语句之间是按从上到下执行的,它是由若干个依次执行的处理步骤组成的,它是如何一种算法都离不开的一种基本算法结构。

    选择结构

    • if单选择结构 if( )
    • if双选择结构 if( ){ }else{ }
    • if多选择结构 if( ){ }else if{ }else{}
    • 嵌套的if结构 if( ){ if( ) }
    int a = 80;
    if(a>60){
        System.out.println("及格");
        if(a>80) System.out.println("且优秀");
    }else if(a>0){
        System.out.println("不及格");
    }else {
        System.out.println("缺考");
    }
    

    switch多选择结构

    char grade = 'C'; //JDK新特性 可以是字符串(字符本质还是数字)
    switch (grade){
        case 'A':
            System.out.println("优秀");
            break; //可选,跳出当前结构
        case 'B':
            System.out.println("良好");
            break;
        case 'C':
            System.out.println("合格");
            break;
        default: //默认,以上值没匹配到
            System.out.println("不及格");
            break;
    }
    

    IDEA反编译之后.class文件与源代码对比

    在这里插入图片描述

    循环结构

    • while循环
    //计算1+2+3+...+100
    int i=0;
    int sum=0;
    while(i<100){
        i++;
        sum+=i;
    }
    System.out.println(sum); //5050
    
    • do…while循环
    //先执行后判断,至少执行一次
    do{
        i++;
        sum+=i;
    }while(i<100) //跟上面效果一样
    
    • for循环
    //(初始化;条件判断;迭代)
    for(int i=0;i<100;i++){
        i++;
        sum+=i;
    }
    for(; ; ){...} //死循环
    
    //练习:输出1-1000能被5整除的数,每行输出3个
    for (int i = 1; i <= 1000; i++) {
        if(i%5==0){
            System.out.print(i+"\t"); //输出完不换行
        }
        if(i%(3*5)==0){
            System.out.println();
        }
    }
    
    //练习2:输出九九乘法表
    for(int i=1;i<=9;i++){
        for(int j=1;j<=i;j++){
            System.out.print(j+"*"+i+"="+i*j+"\t");
        }
        System.out.println();
    }
    

    增强for循环

    int [] numbers = {10,20,30,40,50}; //定义一个数组
    for (int x:numbers){
        System.out.println(x); //遍历数组的元素 10 20 30 40 50
    }
    //相当于
    for(int i=0;i<5;i++){
        System.out.println(numbers[i]);
    }
    

    break & continue

    • break可用在任何循环的主体部分,由于强行退出循环,也可以用在switch语句。
    • continue用于循环语句中,终止某次循环过程,跳过剩余语句,之间进行下一次循环条件判断。
    • 标签:后面跟一个冒号的标识符 label:
    //打印101-150之间所有的质数
    int count = 0;
    outer:for(int i=101;i<=150;i++){
        for (int j=2;j<i/2;j++){
            if(i%j==0)
                continue outer; //不建议使用标签
        }
        System.out.print(i+" ");
    }
    

    流程控制练习

    //打印等腰空心三角形
    /*  例如:输入为4时
              *
             * *
            *   *
           * * * *
    */
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt(); //n为三角形高
    for(int i=1;i<=n;i++){
        for(int j=1;j<=2*n-1;j++){
            if(i!=n){ //若不为最后一行
                if(i+j==n+1)
                    System.out.print("*"); //三角形左腰边
                else if(i+j==n+2*i-1)
                    System.out.print("*"); //三角形右腰边
                else System.out.print(" ");
            }
            else if(j%2!=0){  //最后一行,底边
                System.out.print("*");
            }else {
                System.out.print(" ");
            }
        }
        System.out.println(); //换行
    }
    


    Java方法

    方法的定义

    • Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段
    • 方法包含一个方法头和一个方法体
      • 修饰符:可选,定义了方法的访问类型,告诉编译器如何调用该方法。
      • 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法没有返回值,则returnValueType为关键字void。
      • 方法名:是方法的实际名称,方法名与参数表共同构成方法签名。
      • 参数类型:像一个占位符。方法被调用时,传递值给参数,该值称为实参或变量。参数列表是指方法的参数类型、顺序和参数个数。参数是可选的,方法可以不包含任何参数。
        • 形式参数:在方法被调用时用于接收外界输入的数据。
        • 实参:调用方法时实际传给方法的数据。
      • 方法体:方法体包含具体的语句,定义该方法的功能。
    修饰符 返回值类型 方法名(参数类型 参数名,...{
       方法体...
       return 返回值;
    }
    

    方法的调用

    • 调用方法:对象名.方法名(实参列表)。
    • Java支持两种调用方法的方式,根据方法是否返回值来选择。
    • 当方法返回一个值的时候,方法调用通常被当成一个值
    int larger = max(30,40);
    
    • 如果方法返回值是void,方法调用一定是一条语句。

    • 扩展:值传递和引用传递 ( Java都是值传递)。

    • 调用其他类的方法,除非是static静态方法,不然必须实例化这个类(new)

    public class Demo01 {
       
        public static void main(String[] args) {
            int add = Demo01.add(1,2); // 通过类名直接调用静态方法
            System.out.println(add); // 3
        }
    	// static静态方法,否则就要new实例化来调用
        public static int add(int a,int b){
            return a+b;
        }
    }
    

    值传递 &引用传递

    在这里插入图片描述


    在这里插入图片描述

    方法的重载

    • 重载是在一个类中,有相同的方法名,参数列表不同的方法。

    • 方法重载的规则:

      • 方法名称必须相同
      • 参数列表必须不同(个数、参数类型、或排序不同)
      • 返回类型可以相同也可以不相同
      • 仅仅返回类型不同不足以成为方法的重载
    • 实现理论

      • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

    命令行传参

    • 有时候你希望运行一个程序时候传递给它消息,这要靠传递命令行参数给main()函数实现。
    public static void main(String[] args) {
        //args.length 数组长度
        for (int i = 0; i < args.length; i++) {
            System.out.println("args["+i+"]: "+args[i]);
        }
    }
    

    找到当前类的文件夹,打开cmd.

    在这里插入图片描述

    可变参数

    • Jdk1.5开始,Java支持传递同类型的可变参数给一个方法。
    • 在方法声明中,在指定参数类型后加一个省略号 (…)。
    • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。
    //打印最大值
    public static void printMax(int... num){
        if(num.length==0){
            System.out.println("没有值传入");
            return;
        }
        int result = num[0];
        for (int i = 1; i < num.length; i++) {
            if(num[i] > result){
                result = num[i];
            }
        }
        System.out.println("最大值是:"+result);
    }
    public static void main(String[] args) {
        printMax(1,2,3,4); //最大值是:4
        printMax(new int[]{1,2,3,4,5}); //最大值是:5
    }
    

    递归

    • 递归就是:A方法调用A方法,自己调用自己!

    • 递归策略只需少量的代码可描述解题过程中多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

    • 递归结构

      • 递归头:什么时候不调用自身方法,没有头 将陷入死循环。
      • 递归体:什么时候需要调用自身方法。
    //阶乘 n! n*(n-1)*...*2*1
    public static int f(int n){
        if(n==1) return 1;
        return n*f(n-1); //递归:调用自身
    }
    public static void main(String[] args) {
        System.out.println(f(5)); //5!= 120
    }
    


    Java数组

    数组的定义

    • 数组是相同类型数据的有序集合
    • 数组描述的是相同类型的若干数据,按照一定先后次序排序组合而成
    • 其中,每一个数据称作一个数组元素,每个数组元素可以通过下标访问它们

    数组的声明创建

    • 首先必须声明数组变量,才能在程序中使用数组。
    dataType[] arrayRefVar; //首选
    dataType arrayRefVar[]; //效果相同,但不是首选
    
    • Java语言使用new操作符来创建数组,语法如下
    dataType[] arrayRefVar = new dataType[arraySize]; //int[] nums=new int[10]
    
    • 数组的元素是通过索引访问的,数组索引从0开始
    • 获取数组长度:arrays.length
    int[] nums; //1.声明一个数组
    nums = new int[3]; //2.创建一个数组
    //3.给数组元素赋值
    nums[0]=1;
    nums[1]=2;
    nums[2]=3;
    for (int num : nums) { //打印数组所有元素
        System.out.println(num);
    }
    

    内存分析

    在这里插入图片描述


    在这里插入图片描述


    数组的三种初始化

    • 静态初始化
    //静态初始化:创建+赋值
    int[] a={1,2,3};
    Man[] mans={new Man(1,1),new Man(2,2)}
    
    • 动态初始化
    //包含默认初始化
    int[] a=new int[2]; //默认值为0
    a[0]=1;
    a[1]=2;
    
    • 默认初始化
      • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

    数组的基本特点

    1. 其长度是确定的,数组一旦被创建,它的大小就是不可改变的。

    2. 其元素必须是相同类型,不允许出现混合类型。

    3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

    4. 数组变量属于引用类型,数组也可以看作对象,其中每个元素相当于该对象的成员变量。

      数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,

      数组本身是在堆中的

    数组边界

    在这里插入图片描述

    数组的使用

    • For-Each循环
    int[] arrays = {1,2,3,4,5};
    //打印全部的数组元素 JDK1.5 没有下标
    for (int array : arrays) {
        System.out.println(array);
    }
    
    • 数组作方法入参
    //打印数组元素
    public static void printArray(int[] a){
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
    }
    
    • 数组作返回值
    //反转数组
    public static int[] reverse(int[] arrays){
        int[] result = new int[arrays.length];
        //反转的操作
        for (int i = 0; i < arrays.length; i++) {
            result[i] = arrays[arrays.length-i-1];
        }
        return result;
    }
    

    多维数组

    • 多维数组可以看成数组的数组,比如二维数组就是一个特殊的数组,其每一个元素都是一个一维数组。
    int arr[][] = new int[3][2]; //二维数组,三行两列
    

    在这里插入图片描述

    int[][] array = {{1,2},{3,4},{5,6}};
    //打印二维数组所有元素
    for (int i = 0; i < array.length; i++) { //arrays.length=3
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j]+" ");
        }
        System.out.println();
    }
    

    Arrays类

    • 数组的工具类java.util.Arrays
    • 由于数组对象本身并没有什么方法可以供我们使用,但API提供了一个工具类Arrays供我们使用。
    • Array类中的方法都是static修饰的静态方法,使用时直接使用类名进行调用,可以不用对象调用。
    • 常用功能
      • 给数组赋值:fill方法。
      • 排序:sort方法,升序。
      • 比较数组:equals方法比较数组中元素值是否相等。
      • 查找数组元素:binarySearch对排序好的数组进行二分查找法操作。
    int[] a = {1,2,3,4,9000,32145,451,21};
    System.out.println(a); // [I@28d93b30 (hashcode)
    
    //Arrays.toString 打印数组元素
    System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 9000, 32145, 451, 21]
    
    //二分法查找某值 返回下标
    System.out.println(Arrays.binarySearch(a, 9000)); // 4
    
    //填充
    Arrays.fill(a,2,4,0); //数组[a[2]~a[4])之间填充0
    System.out.println(Arrays.toString(a)); //[1, 2, 0, 0, 9000, 32145, 451, 21]
    
    //升序排序
    Arrays.sort(a);
    

    冒泡排序

    • 冒泡排序是八大排序最出名的排序算法。
    • 代码:两层循环,外层冒泡轮数,里层依次比较。
    • 当我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2)
    //冒泡排序
    //1.比较数组中两个相邻的元素,如果第一个数大于第二个数,交换它们位置
    //2.每一次比较,都会产生一个最大或最小的数字(升序为最大数)
    //3.下一轮则可以少一次排序
    //4.依次循环,直到结束
    public static int[] sort(int[] array){
        int temp=0;
        //外层循环,次数length-1
        for (int i = 0; i < array.length-1; i++) {
            //内层循环:如果第一个数大于第二个数,交换它们位置
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j]>array[j+1]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
        }
        return array;
    }
    
    public static void main(String[] args) {
        int[] a={8,1,35,47,19,-2};
        int[] sort = sort(a);
        System.out.println(Arrays.toString(sort)); //[-2, 1, 8, 19, 35, 47]
    }
    
    • 思考:如何优化?

    稀疏数组

    在这里插入图片描述


    在这里插入图片描述


    //创建一个二维数组 11*11  0:没有棋子,1:黑棋  2:白棋
    int[][] array1 = new int[11][11];
    array1[1][2] = 1;
    array1[2][3] = 2;
    //输出原始的数组
    System.out.println("原始的数组:");
    for (int[] array : array1) {
        for (int i : array) {
            System.out.print(i+"\t");
        }
        System.out.println();
    }
    
    //转换为稀疏数组保存
    //1.有效值的个数
    int sum = 0; //有效值总数
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if(array1[i][j]!=0){
                sum++;
            }
        }
    }
    //2.创建一个稀疏数组
    int[][] array2 = new int[sum+1][3];
    array2[0][0] = 11;
    array2[0][1] = 11;
    array2[0][2] = sum;
    
    //3.遍历二维数组,将有效值存放到稀疏数组
    int count = 0;
    for (int i = 0; i < array1.length; i++) {
        for (int j = 0; j < array1[i].length; j++) {
            if(array1[i][j]!=0){
                count++;
                array2[count][0] = i;
                array2[count][1] = j;
                array2[count][2] = array1[i][j];
            }
        }
    }
    
    //4.输出稀疏数组
    System.out.println("稀疏数组:");
    for (int i = 0; i < array2.length; i++) {
        for (int j = 0; j < array2[i].length; j++) {
            System.out.print(array2[i][j]+"\t");
        }
        System.out.println();
    }
    /* 结果:
    输出原始的数组
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	1	0	0	0	0	0	0	0	0	
    0	0	0	2	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	0	0	0	0	0	0	0	0	0	
    稀疏数组
    11	11	2	
    1	2	1	
    2	3	2	
    */
    

    面向对象

    初识面向对象

    面向过程&面向对象

    • 面向过程思想
      • 步骤清晰简单,第一步做什么,第二部做什么…
      • 面向过程适合处理一些较为简单的问题
    • 面向对象思想
      • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
      • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
    • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

    什么是面向对象

    • 面向对象编程(Object-Oriented Programming, OOP)
    • 本质:以类的方式组织代码,以对象的组织(封装)数据。
    • 抽象
    • 三大特性
      • 封装
      • 继承
      • 多态
    • 从认识论的角度考虑是先有对象后有类。对象是具体的事物,类是对象的抽象。
    • 从代码运行角度考虑是先有类后有对象。类是对象的模板

    类与对象的关系

    • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不能代表某一个具体的事物。
      • 动物、植物、手机、电脑…
      • Person类、Pet类、Cat类等,都是用来描述/定义某一具体的事物应该具备的特点和行为。
    • 对象是抽象概念的具体实例,如张三是人的一个具体实例、张三家里的狗旺财就是狗的一个具体实例。

    创建与初始化对象

    • 使用new来创建对象。
    • 使用new关键字创建的时候,除了分配内存之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。
    • 类中的构造器也被称为构造方法,创建对象时必须要调用。有以下特点:
      • 必须和类的名字相同
      • 没有返回类型,也不能写void
    • 一个类即使什么都不写,也会存在一个默认的构造方法

    构造器

    public class Person {
        //一个类即使什么都不写,也会存在一个默认的无参构造方法
        //显示地定义构造器
        String name;
        
        //作用:1. 使用new关键字,本质是在调用构造器
        //2. 用来初始化对象的值
        public Person(){} //无参构造
        
        //有参构造 3.一旦定义了有参构造,无参就必须显示定义
        public Person(String name){
            this.name=name;
        }
    	//Alt+insert 快捷键插入构造方法
    }
    

    内存分析

    //定义一个宠物类
    public class Pet {
        public String name; //默认 null
        public int age; 	//默认 0
        //无参构造
    
        public void shout(){
            System.out.println("叫了一声");
        }
    }
    
    //应用类,创建调用对象
    public class Application {
        public static void main(String[] args) {
            
            Pet dog = new Pet();
    
            dog.name = "旺财";
            dog.age = 3;
            dog.shout();
        }
    }
    
    • 对象通过引用类型来操作:栈 - - ->堆

    在这里插入图片描述
    在这里插入图片描述

    封装

    • 该露的露,该藏的藏
      • 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据细节由自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
    • 封装(数据的隐藏)
      • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,称为信息隐藏。
    • 作用
      1. 提高程序的安全性,保护数据
      2. 隐藏代码的实现细节
      3. 统一接口
      4. 系统可维护性增加了

    在这里插入图片描述

    继承

    • 继承的本质是对某一批类的抽象,从而实现对世界更好地建模。

    • extends的意思是”扩展“。子类是父类的扩展,使用关键字extends来表示。

    • Java中类只有单继承,没有多继承!一个类只能继承一个父类。

    • 继承是类与类之间的一种关系,此外还有依赖、组合、聚合等。

    • 继承关系的两个类,一个为子类(派生类),一个为**父类(基类)**子类继承父类。

    • 子类和父类之间,从意义上讲应该具有”is a“的关系。

    //学生类(子类)继承 人类(父类)
    public class Student extends Person{ /*Person extends Object*/
        ...
    }
    
    • 子类继承了父类,就会拥有父类的全部方法,而private私有属性及方法无法继承
    • 在Java中,所有类,都默认直接或间接继承Object类 (Ctrl+H 可以查看类关系)
    • 被final修饰的类,无法被继承(断子绝孙)。

    super & this

    1. super()调用父类的构造方法,必须在构造方法的第一个
    2. super必须只能出现在子类的方法或构造方法中
    3. **super()this()**不能同时调用构造方法,因为this也必须写在第一行
    • super与this的区别:super代表父类对象的引用,只能在继承条件下使用;this调用自身对象,没有继承也可以使用。
    super(); //隐藏代码,默认调用了父类的无参构造,要写只能写第一行
    

    在这里插入图片描述


    在这里插入图片描述

    方法的重写

    • 重写:子类的方法必须与父类方法必须一致,方法体不同。

    • 重写是方法的重写,与属性无关

    • 重写方法只与非静态方法有关,与静态方法无关(静态方法不能被重写)

    public class B {
        public static void test(){ //静态方法
            System.out.println("B==>test()");
        }
    }
    
    public class A extends B{ //继承
        public static void test(){
            System.out.println("A==>test()");
        }
    }
    
    public class Application {
        public static void main(String[] args) {
            //方法的调用之和左边定义的类型有关
            A a = new A();
            a.test(); //打印 A==>test()
    
            //父类的引用指向了子类,但静态方法没有被重写
            B b = new A();
            b.test(); //打印 B==>test()
        }
    }
    

    修改A.java, B.java

    public class B {
        public void test(){ //非静态方法
            System.out.println("B==>test()");
        }
    }
    public class A extends B{
        @Override //重写了B的方法
        public void test() {
            System.out.println("A==>test()");
        }
    }
    
    //父类的引用指向了子类
    B b = new A(); //子类重写了父类的方法,执行子类的方法
    b.test(); //打印变成了 A==>test()
    /* 
    静态方法是类的方法,非静态方法是对象的方法
    有static时,b调用了B类的方法,因为b是b类定义的
    没有static时,b调用的是对象的方法,而b是A类new出来的对象,调用A的方法
    */
    
    • 静态方法属于类,非静态方法属于对象
    • 注意点:
    1. 方法名、参数列表必须相同
    2. 修饰符范围可以扩大,不能缩小(public>protect>private)
    3. 抛出的异常 范围可以被缩小,不能扩大
    4. 被**static(属于类,不属于实例),final(常量方法),private(私有)**修饰的方法不能重写

    多态

    • 动态编译:类型

    • 即同一方法可以根据发送对象的不同而采用不同的行为方式

    • 一个对象的实际类型是确定的,但可以指向对象的引用可以有很多

    • 多态存在条件

      • 有继承关系
      • 子类重写父类方法
      • 父类引用指向子类对象

    在这里插入图片描述


    • 注意点:
      1. 多态是方法的多态,没有属性的多态
      2. 父类和子类,有联系 类型转换异常: ClassCastException
      3. 存在条件:继承关系,方法需要重写,父类引用指向子类对象!

    instanceof和类型转换

    • instanceof 引用类型比较,判断一个对象是什么类型
    public static void main(String[] args) {
    
        // Object > String
        // Objest > Person > Student
        // Objest > Person > Teacher
        Object object = new Student();
    	// X instanceof Y,X引用指向的对象是不是Y的子类
        System.out.println(object instanceof Student); //true
        System.out.println(object instanceof Person); //true
        System.out.println(object instanceof Teacher); //false
        System.out.println(object instanceof Object); //true
        System.out.println(object instanceof String); //false
    	
        //类型之间的转化:父-子(高-低),低可以转换为高
        Person obj = new Syudent(); //只能用Person方法(重写了用子类重写过的方法)
        (Syudent)obj.go(); //强转之后可以用Student方法(Student->go())
    }
    

    类型转换

    1. 父类引用指向子类的对象
    2. 把子类转换为父类,向上转型,会丢失自己原来的一些方法
    3. 把父类转换为子类,向下转型,强制转换,才调用子类方法
    4. 方便方法的调用(转型),减少重复的代码,简洁。

    Static

    • 静态变量可以直接用类名访问,也称类变量。
    • 静态变量(或方法)对于类,所有对象(实例)所共享。
    • 静态区代码 加载类时一起被初始化,最早执行且只执行一次(第一次new)。
    • Math->随机数:
    //静态导入包
    import static java.lang.Math.random;
    
    public class Application {
        public static void main(String[] args) {
    
            //第一种随机数,不用导包
            System.out.println(Math.random()); //0.7562202902634543
    
            //第二种随机数,静态导入包
            System.out.println(random()); //0.5391606223844663
        }
    }
    

    抽象类(abstract)

    • abstract修饰的类就是抽象类,修饰的方法就是抽象方法。
    • 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。
    • 抽象类不能使用new来创建对象,它是用来让子类继承的。
    • 抽象方法只有方法的声明,没有实现,让其子类实现。
    • 子类继承抽象类,必须实现抽象类的所有方法,否则该子类也要声明为抽象类。
    //abstract 抽象类 类只能单继承(接口可以多继承)
    public abstract class Action {
    
        //约束~有人帮我们实现~
        //抽象方法只有方法名,没有方法的实现
        public abstract void doSth();
    
        //1.不能new抽象类,只能靠子类去实现它,仅作为一个约束
        //2.抽象方法只能出现在抽象类中,抽象类可以有普通方法
        //3.抽象类有构造器,可以派生子类
        //4.抽象类的意义:约束,提高开发效率。但是类只能单继承,所以有局限 用的不多
    }
    

    接口(interface)

    • 普通类:只有具体实现
    • 抽象类:具体实现和规范(抽象方法)都有
    • 接口:只有规范,没有方法实现,专业的约束!约束与实现分离:面向接口编程~
    • 接口就是规范,定义的是一组规则,"你是什么…必须做什么…"的思想。
    • 接口的本质是约束,就像人间法律一样,制定好大家都遵守。
    //interface接口,接口都要有继承类
    //实现类(implements 可以继承多个接口)
    //多继承,利用接口实现多继承
    public interface UserService {
        //定义的属性都是常量,默认修饰 public static final
        public static final int AGE = 99; //一般不用
        //所有的定义的方法都是抽象的 默认public abstract
        public abstract void run();
        void add();
        void query();
        void delete();
    }
    

    注意点

    • 接口没有构造方法,不能被实例化
    • 实现类必须要重写接口中的方法
    • 实现类(implements) 可以实现多个接口

    内部类

    • 内部类就是在一个类的内部再定义一个类,比如A类中定义了一个B类,那么B就是A的内部类,而A相对B来说就是外部类
      1. 成员内部类:可以操作外部类的私有属性及方法
      2. 静态内部类:static修饰,不能访问外部类私有属性
      3. 局部内部类:外部类的方法里定义的类
      4. 匿名内部类:没有名字初始化类

    在这里插入图片描述



    异常

    • 软件程序在运行过程中,经常可能遇到异常问题,异常英文(Exception),意思是例外,这些例外情况需要我们写程序做出合理的处理,而不至于让程序崩溃。

    • 异常指程序运行中出现的不期而至的各种状况:文件找不到,网络连接错误,非法参数等。

    • 异常发生在程序运行期间,它影响了正常的执行流程。

    在这里插入图片描述

    简单分类

    • 检查型异常:最具代表性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如用户要打开一个不存在的文件时引发的异常,这些异常在编译时不能被简单地忽略。
    • 运行时异常:是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时忽略。
    • 错误Error:错误不是异常,而是脱离程序员控制的问题。错误在代码经常被忽略。例如当栈溢出,一个异常就发生了,它们在编译也检查不到。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    异常处理机制

    • 抛出异常
    • 捕获异常
    • 异常处理关键字:try、catch、finally、throw、throws
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
    
        try { //try监控区域
            System.out.println(a/b);
        }catch (ArithmeticException e){ //catch 捕获异常
            System.out.println("程序出现异常,变量b不能为0");
        }catch (Exception e){
            e.printStackTrace();
        }finally { //一定会执行,处理善后工作,如关闭资源
            System.out.println("finally");
        }
        
        if(b==0){ //抛出异常一般在方法中使用
            throw new ArithmeticException(); //主动抛出异常
        }
    }
    //Ctrl+Alt+T 快捷键插入 try-catch
    

    自定义异常

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果本篇文章对你有帮助,不妨点个赞再走吧!

    展开全文
  • java学习笔记分享

    2018-04-22 23:24:59
    java 前端 数据库 ssm笔记java 前端 数据库 ssm笔记java 前端 数据库 ssm笔记java 前端 数据库 ssm笔记java 前端 数据库 ssm笔记
  • Java学习笔记 必看经典 pdf ,需要的下吧
  • Java 学习笔记

    2008-08-08 14:59:23
    Java 学习笔记Java 学习笔记Java 学习笔记 北京出版社
  • Java学习笔记

    2011-09-14 22:22:55
    Java 学习笔记,分为7个pdf,java学习笔记书籍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 566,599
精华内容 226,639
关键字:

java学习笔记

java 订阅
友情链接: MirrorGAN-master.zip