什么是包装类

  1. 基本数据类型不具有对象特征,没有属性和方法,无法对象化交互,包装类的产生就是为了解决这样的问题,通过包装类,让基本数据类型拥有属性、方法,可以对象化交互
  2. 包装类不允许被继承,没有子类

包装类与基本数据类型之间的对应关系

包装类与基本数据类型

  • byte -> Byte
  • short -> Short
  • int -> Integer
  • long -> Long
  • float -> Float
  • double -> Double
  • char -> Character
  • boolean -> Boolean
  • 除了 double、float 都可以应用对象常量池的概念

包装类的常用方法

Java 文档手册

释义

  • (caseading style sheet、层叠式样式表)

前端三层

  1. 结构层 HTML
    • 搭建结构、放置部件、描述语义
  2. 样式层 CSS
    • 美化页面、实现布局
  3. 行为层 Javascript
    • 实现交互效果、数据收发、表单验证等

选择器(CSS2.1)

  1. 类选择器
    • .类名称
  2. id选择器
    • #id名称
    • 命名:只能有字母、数字、下划线、短横构成、且不能以数字开字母区分大小写,但习惯小写字母开头
  3. 元素选择器(标签选择器)
    • 元素名称
    • 通常用于标签样式的初始化
  4. 说明
    • 选择器的优先级:内联样式>id选择器>类选择器>元素选择器

复合选择器(CSS2.1)

  1. 后代选择器
    • .box .spec 选择.box 内部类名为.spec的标签
  2. 交集选择器
    • li.spec 选择既是li标签,名字也叫spec类的标签
  3. 并集选择器
    • ul,ol 选择所有ul和ol的标签
  4. 题目:请根据样式属性,写出文档结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        div.box li p.spec em{
    color: red;
    }
    <div class="box">
    <ul>
    <li>
    <p class="spec"><em>哈哈哈哈</em></p>
    </li>
    </ul>
    </div>

属性选择器(CSS3) >= IE9

  1. img[alt]
    • 选择有alt属性的img标签
  2. img[alt=”故宫”]
    • 选择alt 属性是故宫的img标签
  3. img[alt^=”故宫”]
    • 选择alt属性以北京开头的img标签
  4. img[alt$=”夜景”]
    • 选择alt属性以夜景结尾的img标签
  5. img[alt*=”美”]
    • 选择alt属性包含美字的img标签
  6. img[alt~=”手机拍摄”]
    • 选择有alt属性有空格隔开的手机拍摄字样的img标签
  7. img[alt|=”参赛作品”]
    • 选择有alt属性以“参赛作品-”开头的img标签

元素关系选择器(CSS3)

  1. 子选择器>=IE7
    • div>p div的子标签p
  2. 相邻兄弟选择器
    • img+p 图片后面紧跟着的段落将被选中
  3. 通用兄弟选择器
    • p~span p元素之后的所有同层级span元素

序号选择器(CSS3)

  1. :first-child >=IE7
    • 第一个子元素
  2. :last-child
    • 最后一个子元素
  3. :nth-child(3)
    • 第三个子元素
    • :nth-child(3n+2) 从第二个开始,每三个选一个
    • 2n+1 等价于 odd ,表示奇数
    • 2n 等价于 even ,b表示偶数
  4. :nth-of-type(3)
    • 第三个某类型的子元素,将选择同种标签指定序号的子元素
  5. :nth-last-child(3)
    • 倒数第三个子元素
  6. :nth-last-of-type(3)
    • 倒数第三个某类型的子元素

原子类

  1. 在做网页项目前,可以将所有的常用字号、文字颜色、行高、外边距、内边距等设置为单独的类
    1
    2
    3
     例如:
    .fs12{ font-size:12px }
    .color-red { color:red }

伪类

  1. 伪类是添加到选择器的描述性词语,指定要选择的元素的特殊状态,超级链接有4个特殊状态
    1
    2
    3
    4
    a:link  没有被访问过的超级链接
    a:visited 已经被访问过的超级链接
    a:hover 正被鼠标悬停的超级链接
    a:active 正被激活的超级链接(按下按键但是还没有松开按键)
  2. “爱恨准则” LOVE HATE
    • :link -> :visited -> :hover -> :active
    • a 标签伪类必须按照这个写法,否则伪类不生效

伪元素(CSS3)

  1. ::before
    • 在元素之前创建
  2. ::after
    • 在元素之后创建
  3. ::selection
    • 用于文档中被用户高亮的部分(使用鼠标圈选的部分)
  4. ::first-letter
    • 选中某元素中(必须是块级元素)第一行的第一个字母
  5. ::first-line
    • 选中某元素中(必须是块级元素)第一行的全部文字

*层叠性和选择器权重计算

  1. 选择器的优先级:内联样式>id选择器>类选择器>元素选择器
  2. 复杂选择器可以通过(id的个数,class的个数,标签的个数)的形式,计算权重
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <div id="box1" class="box1">
    <div id="box2" class="box2">
    <div id="box3" class="box3">
    <p>我是段落</p>
    </div>
    </div>
    </div>
    #box1 #box2 p {
    color: red;
    }
    #box1 div.box2 #box3 p {
    color: green;
    }
    .box1 .box2 .box3 p {
    color: blue;
    }
    2,0,1
    2,1,2
    0,3,1

    <!-- id选择器个数,类选择器个数,元素选择器个数 -->
  3. !important 权重提升
    • 很多公司不允许使用 important ,因为这会带来不经意的样式冲突

浮动

  1. 浮动的基本概念
    • 垂直显示的浮动,不要设置浮动,只有并排显示的盒子才要设置浮动!
    • “大盒子带着小盒子跑”,一个大盒子中,又是一个小天地,内部可以继续使用浮动
    • 超市售卖的塑料袋0.3元一个,div是免费的!不要节约盒子
    • 本质
      • 浮动的最本质的功能:实现并排
      • 浮动的要点:要浮动,并排的盒子都要设置浮动
      • 父盒子要有足够的宽度,否则子盒子会掉下去
      • 浮动的顺序贴靠特性
        • 子盒子会按顺序贴靠,如果没有足够的空间,则会寻找再前一个兄弟元素
      • 浮动的元素一定能设置宽高
        • 浮动元素不在区分块级元素、行内元素,已经脱离了标准的文档流,一律能够设置宽度和高度,即使它是span标签或者标签等
  2. 使用浮动实现网页布局
  3. BFC规范和浏览器差异
    • BFC( Box formatting Context)块级格式化上下文 是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
    • 从一个现象开始说起
      • 一个盒子不设置height,当内容的子元素都浮动时,无法撑起自身
      • 这个盒子没有形成BFC
      • 如何形成BFC
        • 1、float的值不是none
        • 2、position的值不是static或者relative
        • 3、display的值是inline-block、flex或者inline-flex
        • 4、overflow:hidden
          • 溢出隐藏,溢出盒子边框会隐藏
      • BFC的其他作用
        • BFC可以取消盒子的margin塌陷
        • BFC可以阻止元素被浮动的元素覆盖
      • 浏览器差异
        • IE6、IE7浏览器使用haslayout机制,和BFC规范略有差异,比如IE浏览器可以使用zoom:1属性,“让壳子拥有layout”
        • 如果要兼容IE6、IE7网页时,尽量让网页设计的简单。内部有浮动的盒子要设置height属性,规范编程,不要“玩杂技”
  4. 清除浮动
    • clear: both;
    • overflow:hidden

定位

  1. 相对定位
    • 相对定位:盒子可以相对自己原来的位置进行调整,称为”相对定位“
    • position: relative;
    • 值可以是负数,即往相反的位置移动
    • 相对定位的元素,会在“老家留坑”,本质上任然是在原来的位置,只不过渲染在新的地方而已,渲染的图形可以比如成“影子”,不会对其他元素产生任何影响
    • 相对定位的用途:用来微调元素位置。可以当做绝对定位的参考盒子。
  2. 绝对定位
    • 盒子可以在浏览器中,以坐标进行位置精准描述,拥有自己的绝对位置
    • position: absolute;
    • left 到左边的距离,right 到右边的距离,top 到上边的距离,bottom到下边的距离
    • 绝对定位元素脱离标准文档流,将释放自己的位置,对其他元素不会产生任何干扰,而是对它进行压盖
    • 脱离标准文档流的方法:浮动、绝对定位、固定定位
    • 绝对定位的参考盒子:绝对定位的盒子会以自己祖先元素中,离自己最近的拥有定位属性的盒子,当做基准点,这个盒子通常是相对定位的,所以这个性质也叫作 “子绝父相”
    • 绝对定位的盒子并不是永远以浏览器作为基点
    • 绝对定位的盒子垂直居中
      • position:absolute; top:50%; margin-top:-自己高度的一半
    • 堆叠顺序 z-index
      • 没有单位,数值大的就能压盖住小的
    • 绝对定位用途:“压盖”、“遮罩”效果,结合JS实现动画效果,“雪碧图”
  3. 固定定位
    • position: fixed;
    • 固定定位只能以页面为参考点,没有“子固父相”这个性质
    • 固定定位脱离标准文档流
    • 用途:返回顶部,楼层导航等

3D变形

  1. 3D旋转
    • 将transform的属性设置为rotateX()或者rotateY(),即可实现绕横轴、纵轴旋转
  2. 空间移动
    • 当元素进行3D旋转后,即可继续添加translateX()、translateY()、translateZ()属性让元素在空间进行移动
  3. perspective(景深)
    • 该属性用来定义透视强度,可以理解为“人眼到舞台的距离”,单位是px
      1
      2
      3
      4
      <div class="box1">
      <p></p>
      </div>
      <!-- div 是舞台,必须设置perperctive属性,p是演员,设置transform属性 -->
  4. transform-style(指定嵌套元素是怎样在三维空间中呈现。)
    • preserve-3d 表示所有子元素在3D空间中呈现。
    • flat 表示所有子元素在2D平面呈现。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
         <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
      * {
      margin: 0;
      padding: 0;
      }
      section {
      width: 200px;
      height: 200px;
      margin: 100px auto;
      perspective: 10000px;
      }
      .box {
      width: 200px;
      height: 200px;
      perspective: 10000px;
      position: relative;
      /* 设置变形类型,保留它内部的3D效果 */
      /* 这个盒子又是舞台,又是演员,这个box整体带着里面的p旋转 */
      transform-style: preserve-3d;
      transition:all 10s ease 0s;
      }

      section:hover .box {
      transform: rotateX(360deg) rotateY(360deg);
      }

      .box p {
      position: absolute;
      top: 0;
      left: 0;
      width: 200px;
      height: 200px;
      }

      .box p:nth-child(1) {
      background-color: rgba(219, 56, 211, 0.486);
      /* 前面 */
      transform: translateZ(100px);
      }

      .box p:nth-child(2) {
      background-color: rgba(42, 128, 199, 0.486);
      /* 顶面 */
      transform: rotateX(90deg) translateZ(100px);
      }

      .box p:nth-child(3) {
      background-color: rgba(56, 219, 83, 0.486);
      /* 背面 */
      transform: rotateX(180deg) translateZ(100px);
      }

      .box p:nth-child(4) {
      background-color: rgba(213, 216, 32, 0.486);
      /* 底面 */
      transform: rotateX(-90deg) translateZ(100px);
      }

      .box p:nth-child(5) {
      background-color: rgba(236, 82, 102, 0.486);
      /* 侧面 */
      transform: rotateY(90deg) translateZ(100px);
      }

      .box p:nth-child(6) {
      background-color: rgba(119, 17, 236, 0.486);
      /* 侧面 */
      transform: rotateY(-90deg) translateZ(100px);
      }
      </style>
      </head>

      <body>
      <section>
      <div class="box">
      <p></p>
      <p></p>
      <p></p>
      <p></p>
      <p></p>
      <p></p>
      </div>
      </section>
      </body>
      </html>

2D变形

  1. 旋转变形
    • transform: rotate(45deg);
    • 若角度为正,就是顺时针,否则就是逆时针
    • transform-origin 属性设置自己的自定义变换原点
      • transform-origin: 50px 40px;
  2. 缩放变形
    • transform: scale(3);
    • 以中心点为原点缩放
  3. 斜切变形
    • transform: skew(10deg,20deg); 即可实现斜切变形
    • x的斜切角度,y的斜切角度
  4. 位移变形IE9
    • 将 transform 属性设置为 translate ,即可实现位移变形
      • transform: translate(200px,400px);
    • 和相对定位非常像,位移变形也会“老家留坑”,形影分离。

什么是异常

  1. 异常本质上是程序上的错误。
  2. 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。
  3. 在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常。

Throwable(异常的根类)

  1. Error(Java 虚拟机出现问题)
    • Error 是程序无法处理的错误,表示运行应用程序中比较严重的问题。
    • 它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
    • 对于设计的合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
    • 常见错误
      • 虚拟机错误 VirtualMachineError
      • 内存溢出 OutOfMemoryError
      • 线程死锁 ThreadDeath
  2. Exception
    • Exception 是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。
    • 检查异常 Checked Exception
      • 编译器要求必须处置的异常。(编码阶段)
      • 除了 RuntimeException 及相关子类,其它异常都属于 Checked Exception
        • IO 异常 IOException
        • SQL 异常 SQLException
        • 等等
    • 非检查异常 Unchecked Exception
      • 编译器不要求强制处置的异常(运行阶段)
      • 包含 RuntimeException 及相关子类
        • 空指针异常 NullPointerException
        • 数组下标越界异常 ArrayIndexOutOfBoundsException
        • 算数异常 ArithmeticException
        • 类型转换异常 ClassCastException
        • 等等…
    • System.exit(1); 终止程序运行

throw & throws

  1. throws
    • 可以通过 throws 声明将要抛出何种类型的异常,通过 throw 将产生的异常抛出。
    • 如果一个方法可能出现异常,但没有能力处理这种异常,可以在方法声明处用 throws 子句来声明抛出异常。
    • throws 语句用在方法定义时声明该方法要抛出的异常类型。
    • 当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向调用该方法的方法,由他去处理。
  2. throw
    • throw 用来抛出一个异常。
      • 例如:throw new IOException():
    • thorw 抛出的只能够是可抛出类 Throwable 或者其子类的实例对象。
      • 例如:throw new String(“出错了”); 是错误的
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        public void method(){
        try{
        // 代码段1
        throw new 异常类型();
        }catch(异常类型 ex){
        // 对异常处理的代码段2
        }
        }
        public void method() throws 异常类型{
        // 代码段1
        throw new 异常类型();
        }
    • 作用
      • 规避可能出现的风险
      • 完成一些程序的逻辑
    • throw 抛出异常对象的处理方案
      • 通过 try…catch 包含 throw 语句 —— 自己抛出自己处理
      • 通过 throws 在方法声明抛出异常类型 —— 谁调用谁处理 —— 调用者可以自己处理,也可以继续上抛。此时可以抛出与 throw 对象相同类型或者其父类
      • 当子类重写父类抛出异常方法时,声明的异常必须是父类方法所声明异常的同类或子类。

自定义异常

  1. 基本概念
    • 使用 Java 内置的异常类可以描述在编程时出现的大部分异常情况。
    • 也可以通过自定义异常描述特定业务产生的异常类型。
    • 所谓自定义异常,就是定义一个类,去继承 Throwable 类或者它的子类
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class TestException extends Exception{
      public TestException(){
      super("向父类抛的异常消息");
      }
      }

      public static void test() throw TestException{
      <代码块>
      throw new TestException();
      }

异常链

  1. 基本概念
    • 有时候我们会捕获一个异常后在抛出另一个异常
    • 顾名思义就是:将异常发生的原因一个传一个串起来,即把底层的异常信息传个上层,这样逐层抛出。
  2. Exception e1 = new Exception(“异常消息”); e1.initCause(e);

如何处理异常

  1. 在 Java 应用程序中,异常处理机制为
    • 抛出异常(先抛出,才能被捕获)
    • 捕获异常
  2. 对于运行时异常,错误或可检查异常,Java 技术所要求的异常处理方式有所不同。
    • 1、对于可查异常必须捕捉、或者声明抛出
    • 2、允许忽略不可查的 RuntimeException(含子类)和 Error(含子类)
  3. 通过 5 个关键字来实现
    • 捕获异常
      • try(执行可能产生异常的代码)
      • catch(捕获异常)
      • finally(无论是否发生异常 代码总能执行)
    • 声明异常
      • throws(声明可能要抛出的异常)
    • 抛出异常
      • throw (手动抛出异常)
  4. 规则说明
    • try-catch-finally
      • try 块后可接零个或多个catch块,如果没有 catch 块,则必须跟一个finally块。
  5. 自定义异常
  6. 异常链

实际应用总结

  1. 处理运行异常时,采用逻辑去合理规避同时辅助 try-catch 处理
  2. 在多重 catch 块后面,可以加一个 catch(Exception) 来处理可能被遗漏的异常
  3. 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
  4. 尽量去处理异常,切忌知识简单的调用 printStackTrace() 去打印输出
  5. 具体如何处理异常,要根据不同的业务需求和异常类型去决定
  6. 尽量添加 finally 语句块去释放占用的资源(关闭文件、关闭 sql 链接)等

多态

  1. 基本概念
    • 同一种行为,在不同的对象上,会产生不同的显示结果。
    • 允许不同类的对象对同一消息做出不同的响应
    • 编译时多态
      • 设计时多态 方法重载
    • 运行时多态(通常说的这个)
      • 程序运行时动态决定调用哪个方法
    • 必要条件
      • 满足继承关系
      • 父类引用指向子类对象
  2. 使用
    • 父类引用子类实例
      • 向上转型、隐式转型、自动转型
      • 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法。
      • 小类转型大类
      • 父类 static 方法,不允许子类重写
      • 向上转型后,只能调用到父类原有的静态方法
    • 子类引用指向父类实例
      • 向下转型、强制类型转换
      • 子类引用指向父类对象,此时必须进行强转,可以调用子类独有方法
      • 必须满足转换条件才能进行强转
        • 对象 instanceof 类
        • 判断对象是否是类的实例
          1
          2
          Animal  one = new Cat();
          Cat temp = (Cat)one
  3. 抽象类(abstract)
    • Java 中使用抽象类,限制实例化
      • 通过 abstract 修饰的类,就是抽象类
      • 不允许实例化,可以通过向上转型,指向子类实例
    • 通过abstract 修饰的方法,就是抽象方法
      • public abstract void eat();
      • 子类必须实现这个方法!
    • 应用场景
      • 某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
      • 避免设计随意性,无意义父类实例化
    • 使用规则
      • 1、abstract 定义抽象类
      • 2、抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
      • 3、abstract 定义抽象方法,不需要具体实现
      • 4、包含抽象方法的类是抽象类
      • 5、抽象类中可以没有抽象方法
      • 6、static final private 不能与 abstract 并存
  4. 接口(interface)
    • 基本概念
      • 接口定义了某一批类所需要遵守的规范
      • 接口不关心这些类的内部数据,也不关心这些类里的方法的实现细节,它只规定这些类里必须提供某些方法
    • 语法:
      • [修饰符] interface 接口名 [extends 付接口1, 父接口2…]
        1
        2
        3
        4
        5
        6
        {
        零个到多个常量定义...
        零个到多个抽象方法定义...
        零个到多个默认方法的定义.... (jdk1.8新增)
        零个到多个静态方法的定义... (jdk 1.8新增)
        }
    • 使用注意:
      • 一个类可以实现多个接口,通过逗号分割。 implements
      • 接口的实现要放在继承后面,一个类只能继承唯一父类,但可以实现若干个接口。实现接口的时候要去重写接口待重写的方法。否则通过 abstract 定义抽象类
      • 接口也可以实现继承关系,并且可以继承多个父接口,用逗号分开
      • 如果继承多个接口有多个重名的方法,子类不知道该实现哪个接口的方法,可以重写重名的方法。
        • 如果继承父类的同时,也继承方法。它们都有同名的方法,默认继承父类方法。
    • 代码示例
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
          package com.zzz.tel;
      // 接口访问修饰符:public 默认
      public interface INet {
      /*接口中抽象方法可以不写abstract关键字
      /*访问修饰符默认public
      * 当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类
      */
      void network();


      //接口中可以包含常量,默认public static final
      int TEMP=20;

      //default:默认方法 可以带方法体 jdk1.8后新增
      //可以在实现类中重写,并可以通过接口的引用调用
      default void connection(){
      System.out.println("我是接口中的默认链接");
      }

      //static:静态方法 可以带方法体 jdk1.8后新增
      //不可以在实现类中重写,可以同接口名调用
      static void stop(){
      System.out.println("我是接口中的静态方法");
      }
      }
  5. 内部类
    • 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
    • 与之对应,包含内部类的类被称为外部类
    • 内部类隐藏在外部类之内,更好的实现了信息的隐藏。不允许其它类随意的访问。
    • 内部类分类
      • 1、成员内部类
        • 内部类中最常见的就是成员内部类,也称普通内部类
        • 1、内部类在外部使用时,无法直接实例化,需要借由外部类的信息才能完成实例化
        • 2、内部类的访问修饰符,可以任意,但是访问范围会受到影响
        • 3、内部类可以直接访问外部类的成员,如果出现同名属性,优先访问内部类中定义的
        • 4、可以使用 外部类.this.成员 的方式,访问外部类中同名的信息
        • 5、外部类访问内部类信息,需要通过内部类实例,无法直接访问
        • 6、内部类编译后 .class 文件命名:外部类$内部类.class
        • 内部类的获取方式
          • 1、new 外部类.new 内部类
          • 2、外部类对象.new 内部类
          • 3、外部类对象.获取方法
      • 2、静态内部类
        • 【成员共享】静态内部类对象可以不依赖于外部类对象,直接创建
        • 1、静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例
        • 2、静态内部类对象实例时,可以不依赖于外部类对象
        • 3、可以通过 外部类.内部类.静态成员 的方式,访问内部类中的静态成员
        • 4、当内部类属性与外部类属性同名时,默认直接调用内部类中的成员;如果需要访问外部类中的静态属性,则可以通过 外部类.属性 的方式;如果需要访问外部类中的非静态属性,则可以通过 new 外部类().属性 的方式;
      • 3、方法内部类
        • 定义在外部类方法中的内部类,也称局部类。
        • 1、定义在方法内,作用范围也在方法内
        • 2、和方法内部成员使用规则一样,class 前面不可以添加 public、private、protected、static
        • 3、类中不能包含静态成员
        • 4、类中可以包含 final、abstract 修饰的成员
      • 4、匿名内部类
        • 将类的定义与类的创建,放到一起完成
        • 1、匿名内部类没有类型名称、实例对象名称
        • 2、编译后的文件命名:外部类$数字.class
        • 3、无法使用 private、public、protected、abstract、static 修饰
        • 4、无法编写构造方法,可以添加代码块
        • 5、不能出现静态成员
        • 6、匿名内部类可以实现接口也可以继承父类,但是不可兼得
        • 适用场景
          • 1、只有到类的一个实例
          • 2、类在定义后马上用到
          • 3、给类命名并不会导致代码更容易被理解

继承

  1. 概念
    • 一种类与类之间的关系
    • 使用已存在的类定义作为基础建立新类
    • 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但 不能选择性地继承父类
    • 满足 “A is a B”的关系就可以形成继承关系
    • 子类可以访问父类非私有成员
    • 父类不可以访问子类特有成员
  2. 方法重写
    • 语法规则
      • 在子类中定义,去重写父类的方法
      • 方法名相同,参数列表相同(参数顺序、个数、类型)
        • 方法名、参数列表都要与父类继承的方法相同
      • 访问修饰符
        • 允许改变,但是访问范围需要大于等于父类的访问范围
      • 与方法的参数名无关
      • 方法返回值
        • 当方法返回值是void 或基本数据类型时,必须相同;当返回值是引用类型时,可以是父类或其子类
      • 方法的返回值和访问修饰符是可以允许有变化的(有条件的)
    • 当子类重写父类方法后,子类对象调用的是重写后的方法。
    • super:父类对象的引用 super.父类方法名()
    • 父类的构造不允许被继承;不允许被重写,但是会影响子类的实例化过程
  3. 特点
    • 利于代码复用
    • 缩短开发周期
  4. 语法
    • 使用 extends 实现封装
    • 单一继承,只能有一个父类
    • 名词解释
      • 父类(基类)
      • 子类(派生类)
    • 继承后的初始化顺序
      • 父类静态成员 -> 子类静态成员 -> 父类对象构造 -> 子类对象构造
      • 访问修饰符不影响成员加载顺序,跟书写位置有关
  5. super
    • 代表父类引用
      • 访问父类成员方法
        • super.print();
      • 访问父类属性
        • super.name;
      • 访问父类构造方法
        • super()
    • 子类的构造的过程中必须调用其父类的构造方法
    • 如果子类的构造方法中没有显式标注,则系统默认调用父类无参的构造方法
    • 如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法,则编译错误。
    • 子类构造默认调用父类无参构造方法,可以通过 super() 调用父类的允许被访问的其他构造方法,super() 必须放在子类构造函数有效代码的第一行。
    • 构造方法调用时,super 和 this 不能同时出现
  6. Object 类
    • 概念
      • Object 类是所有类的父类
      • 一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组)
      • Java 中的每个类都可以使用 Object 中定义的方法
  7. final 关键字
    • final class
      • 该类没有子类
      • public final class | final public class 写法都行
    • final 方法
      • 该方法不允许被子类重写,但是可以正常被子类继承使用
    • final 变量
      • 方法内局部变量
        • 只要在具体使用之前进行赋值即可,一旦赋值不允许修改
      • 类中成员属性
        • 赋值过程
          • 定义的时候直接初始化
          • 构造方法中
          • 构造代码块
      • 基本数据类型的变量
        • 初始赋值之后不能更改
      • 引用类型的变量
        • 初始化之后不能再指向另一个对象,但对象的内容是可变的
    • final + static 定义后,在程序运行中不允许二次修改。
      • 可以修饰方法和变量
      • 修饰配置信息 public static final String URL = “www.xxx.com
    • final 不允许加载构造方法前面
    • 使用 final 修饰可以提高性能,但会降低可扩展性
  8. 注解
    • JDK1.5 版本引入的一个特性
    • 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
    • 一种特殊的标记
    • 常用注解
      • @Override 针对父类方法进行重写的形式
    • 分类
      • 按照运行机制分
        • 源码注解
          • 注解只在源码阶段保留,在编译阶段会被丢弃。例如:@Overide
        • 编译时注解
          • 注解会在编译时期保留,在加载 class 文件时会被丢弃。例如:@NotNull
        • 运行时注解
          • 在运行阶段还起作用,甚至会影响运行逻辑的注解。@Autowired
      • 按照来源分
        • 来自 JDK 的注解
          • @Override
        • 来自第三方的注解
          • 框架的注解
        • 我们自定义的注解
      • 元注解
        • 对注解进行注解
          • 对注解进行标注
        • @Target 限定注解可以用在什么地方

访问修饰符

  1. 公有的 :public
    • 允许在任意位置访问
  2. 私有的:private
    • 只允许在本类中进行访问
  3. 受保护的:protected
    • 允许在当前类、同包子类/非子类、跨包子类调用、跨包非子类不允许
  4. 默认
    • 允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用

类和对象

  1. 面向对象
    • 关注现实存在的事物的各方面信息,从对象的角度出发,根据事物的特征进行程序设计
    • 对象:用来描述客观事物的一个实体
    • 类:具有相同属性和方法的一组对象的集合
  2. 属性
    • 对象具有的各种静态特征
    • “对象有什么”
  3. 方法
    • 对象具有的各种
    • “对象能做什么”
    • 在方法中通过对象作为参数,传递的是它的引用,可以通过引用获取该对象的所有信息。
    • 抽象的概念
    • 模板
    • 类是模子,确定对象将会拥有的特征(属性)和行为(方法)
    • 类是对象的类型
    • 构造方法
      • 注意事项
        • 构造方法与类同名且没有返回值(必须与类名相同)
          1
          2
          3
          4
          5
          // 构造方法的语法格式:
          // 没有返回值类型 , 构造方法名 与类名相同
          public 构造方法名(){
          // 初始化代码
          }
        • 只能在对象实例化的时候调用
      • 特点
        • 当没有指定构造方法时,系统会自动添加无参的构造方法
        • 当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
        • 一个类中可以有多个构造方法
        • this(); 访问其它无参或带参 构造方法
    • this 关键字
      • this:当前对象的默认引用
      • this 的使用
        • 调用成员属性,解决成员属性的局部变量同名冲突
        • 调用成员方法
        • 调用重载的构造方法 this();
          • 通过 this() 调用构造方法,必须放在方法体内的第一行!!!
  4. 对象
    • 基本概念
      • 一个看得到、摸着着的具体实体
      • 对象是类的实例表现
      • 万物皆对象
      • 对象是特定的类型数据
    • 对象实例化
      • 实例化对象过程可以分为两部分
        • 声明对象 Class 对象名称
          • 在内存的栈中开辟一个空间,此时栈空间的数据是空的
        • 实例化对象 new Class
          • 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
            声明对象和实例化对象通过 = 赋值符号完成。经过赋值操作,将内存的堆地址,传递到栈当中的内存空间里。
      • 内存分配 栈[局部变量] ,堆[动态数据]
    • 注意事项
      • 需要多次访问同一对象时,必须进行声明
      • 同一作用范围内,不能定义同名对象
      • 可以同时声明多个引用,用逗号分割
        1
        2
        3
        4
        Cat one,two;
        one = new Cat();
        two = new Cat();
        Cat three = new Cat();four = new Cat();

封装

  1. 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
    • 隐藏对象的信息
    • 留出访问的接口
  2. 特点
    • 只能通过规定的方法访问数据
    • 隐藏类的实例细节,方便修改和实现
  3. 实现步骤
    • 1、修改属性的可见性 ,设为 private
    • 2、创建 getter/setter 方法 ,设为 public 用户属性的读写
    • 3、在 getter/setter 方法中加入属性控制语句,对属性的合法性进行判断
  4. 包(类似文件夹)
    • 作用
      • 管理 Java 文件
      • 解决同名文件冲突
    • 定义包
      • 语法 package 包名;例:package com.zje.animal;
      • 注意
        • 一个 Java 源文件只能有一个 package 语句,必须放在 Java 源文件中的第一行
        • 包名全部英文小写
        • 建议每个包内存储信息功能单一
        • 包命名规则:域名倒序+模块+功能
        • Java 中一个包不能存在同名类
    • 导入包
      • 语法 import 包名.类名;
      • 导入包中全部类 import com.xxx.*; 导入包中指定类 import com.xxx.animal.Cat;
    • 常用系统包
      • java.lang
        • 包含 Java 语言基础的类,该包系统加载时 默认导入。如 System、String、Math
      • java.util
        • 包含 Java 语言中常用工具。如 Scanner、Random
      • java.io
        • 包含输入、输出相关功能的类。如File、InputStream
    • 问题
      • 如何实现跨包的类调用?
        • 建议采用“import 包名.类名;” 的方式加载,提高效率
        • 加载类的顺序跟 import 导入语句的位置无关
        • “import 包名.*”; 无法访问指定包名下的类,无法访问子包下的类
      • 有几种调用形式?
        1. 使用 import 语句导入目标类:这种方式可以直接在代码中使用 TargetClass 而无需指定完整的包路径。
        import com.example.targetpackage.TargetClass;
        
        1. 使用完整的包路径访问目标类:这种方式需要在代码中完整地指定目标类的包路径。
        com.example.targetpackage.TargetClass targetObject = new com.example.targetpackage.TargetClass();
        
        1. 使用 static import 导入目标类的静态成员:这种方式可以直接访问目标类的静态成员,无需指定类名。
        import static com.example.targetpackage.TargetClass.staticMethod;
        staticMethod(); // 直接调用静态方法
        
        1. 使用 default 访问修饰符允许同一个包下的类进行访问:这种方式需要将目标类的方法声明为 default 访问修饰符,这样同包下的其他类就可以访问该方法。
        // com.example.targetpackage.TargetClass
        default void defaultMethod() {
          // 此方法可被同包下的其他类访问
        }
        
  5. static 关键字
    • 1、类对象共享
    • 2、类加载时产生,销毁时释放,生命周期长
    • 注意事项
      • 在成员方法中,可以直接访问类中的静态成员
      • 静态方法中不能直接访问非静态成员,只能直接调用静态成员
      • 只能通过对象实例化后,对象.成员方法的方式访问非静态成员
      • 静态方法中不能使用 this
    • 静态成员访问方式
      • 1、对象.成员
      • 2、类.成员
  6. 代码块
    • 普通代码块:每此调用方法 顺序执行,先出现,先执行。
    • 构造代码块:在类中定义,创建对象时调用,优先于构造方法执行。可以有多个
    • 静态代码块
      • static { <语句> }
      • 类加载时调用,优先于构造代码块执行
      • 无论产生多少类实例,静态代码块只执行一次,构造代码块在每次对象构造的时候调用

成员属性的初始值

数据类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false
引用类型对象的初始值 null

什么是方法?

所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。

方法的声明和调用

  1. 方法声明
    • 语法格式
      1
      2
      3
      访问修饰符 返回类型 方法名(参数列表){
      方法体
      }
    • 访问修饰符
      • public
      • privete
      • protected
      • 默认
    • 方法是在类的内部中定义
  2. 方法调用
    • 语法格式
      • 类名 实例名 = new 类名(); 实例名.方法名();
      • 对于静态方法 static , 直接调用 方法名();
  3. 方法分类
    • 根据方法是否带参数、是否返回值,可以分为四类:
    • 无参无返回值方法
    • 无参带返回值方法
    • 带参带返回值方法
    • 带参无返回值方法

方法重载

  1. 同一个类中
  2. 方法名相同,参数列表不同
  3. 方法返回值、访问修饰符任意
  4. 与方法参数名无关

可变参数列表

  1. public void sum(int… n) { <语句块> }
    1
    2
    3
    4
    5
    6
    7
    8
      	public void sum(int... n) {

    int sum =0;
    for(int i:n)
    sum+=i;

    System.out.println("sum="+sum);
    }
  2. 参数列表中如果有两个以上的参数,可变参数一定是在最后的!
  3. 可以将数组传递给可变参数列表,反之不行
  4. 数组作为参数时,是不能将多个值传递给数组的!
  5. 一个方法中,只能有一个可变参数
  6. 可变参数列表所在的方法是最后被访问的。

方法的传值问题

  1. 基本数据类型传值
    • 方法中对参数的修改,不会对主方法传来的变量值产生影响
  2. 引用数据类型传值
    • 方法中对数组的改变,会印象主方法中传来的数组

访问修饰符

访问修饰符 本类 同包 子类 其他
private
默认(不写)
protected
private

什么是数组

  1. 数组是相同类型的数据按顺序组成的一种引用类型
  2. 数据类型
  • 基本数据类型
  • 引用数据类型
    • 接口
    • 数组
    • 等等
  1. 注意的问题
  • 数组是引用数据类型
  • 创建数组时,会开辟连续的内存空间
  • 数据长度使用 length 属性获取
  • 数组元素的下标从0开始
  • 数组下标越界问题

一维数组

  1. 声明
  • 语法格式
    • 数据类型[] 数组名;
    • 数据类型 数组名[];
  • 变量声明的语法格式
    • 数据类型 变量名;
  1. 创建
    • 语法格式一:先声明后创建
      • 数据类型[] 数组名;
      • 数组名 = new 数据类型[数组长度];
      • int [] arr;arr = new int[10]; 创建一个长度为10的整型数组
    • 语法格式二:声明的同时创建数组
      • 数据类型[] 数组名 = new 数据类型[数组长度];
      • int [] arr = new int[10]; 创建长度为10的整型数组 arr
      • 注意:数组长度必须指定
    • 数组在内存中的存储
      • 数组会被分配连续的内存空间
      • 局部变量和数组的默认值问题
        • 局部变量没有默认值、数组有默认值(数组的本身是对象)
  2. 初始化
    • 声明数组的同时给数组赋值,叫做数组的初始化
    • int[] arr = {1,2,3,4,5}; 数组的长度就是初始化时所给数组元素的个数 (花括号)
  3. 元素的引用
    • 语法格式:数组名[下标]
    • 注意:下标从 0 开始
  4. 长度
    • arr.length 表示数组的长度

二维数组

  • 二维数组的声明和创建
    • 声明
      1
      2
      3
      int[][] intArray;
      float floatArray[][];
      double[] doubleArray[];
    • 创建
      1
      intArray = new int[3][3]
      • 列可以省略,行不能省略
        1
        floatArray = new float[3][]; floatArray[1] = new float[3];
  • 二维数组的初始化
    1
    int[][] num = {{1,2,3},{4,5,6},{7,8,9}};
  • 二维数组的引用
  • 多个一维数组组成的内容

增强型 for 循环

  1. 又叫 foreach 循环
  2. foreach 循环引用
    1
    2
    3
    int[] arr = {1,2,3,4};
    for(int n;arr)
    System.out.println(n);
0%