CSS3选择器
释义
- (caseading style sheet、层叠式样式表)
前端三层
- 结构层 HTML
- 搭建结构、放置部件、描述语义
- 样式层 CSS
- 美化页面、实现布局
- 行为层 Javascript
- 实现交互效果、数据收发、表单验证等
选择器(CSS2.1)
- 类选择器
- .类名称
- id选择器
- #id名称
- 命名:只能有字母、数字、下划线、短横构成、且不能以数字开字母区分大小写,但习惯小写字母开头
- 元素选择器(标签选择器)
- 元素名称
- 通常用于标签样式的初始化
- 说明
- 选择器的优先级:内联样式>id选择器>类选择器>元素选择器
复合选择器(CSS2.1)
- 后代选择器
- .box .spec 选择.box 内部类名为.spec的标签
- 交集选择器
- li.spec 选择既是li标签,名字也叫spec类的标签
- 并集选择器
- ul,ol 选择所有ul和ol的标签
- 题目:请根据样式属性,写出文档结构
1
2
3
4
5
6
7
8
9
10div.box li p.spec em{
color: red;
}
<div class="box">
<ul>
<li>
<p class="spec"><em>哈哈哈哈</em></p>
</li>
</ul>
</div>
属性选择器(CSS3) >= IE9
- img[alt]
- 选择有alt属性的img标签
- img[alt=”故宫”]
- 选择alt 属性是故宫的img标签
- img[alt^=”故宫”]
- 选择alt属性以北京开头的img标签
- img[alt$=”夜景”]
- 选择alt属性以夜景结尾的img标签
- img[alt*=”美”]
- 选择alt属性包含美字的img标签
- img[alt~=”手机拍摄”]
- 选择有alt属性有空格隔开的手机拍摄字样的img标签
- img[alt|=”参赛作品”]
- 选择有alt属性以“参赛作品-”开头的img标签
元素关系选择器(CSS3)
- 子选择器>=IE7
- div>p div的子标签p
- 相邻兄弟选择器
- img+p 图片后面紧跟着的段落将被选中
- 通用兄弟选择器
- p~span p元素之后的所有同层级span元素
序号选择器(CSS3)
- :first-child >=IE7
- 第一个子元素
- :last-child
- 最后一个子元素
- :nth-child(3)
- 第三个子元素
- :nth-child(3n+2) 从第二个开始,每三个选一个
- 2n+1 等价于 odd ,表示奇数
- 2n 等价于 even ,b表示偶数
- :nth-of-type(3)
- 第三个某类型的子元素,将选择同种标签指定序号的子元素
- :nth-last-child(3)
- 倒数第三个子元素
- :nth-last-of-type(3)
- 倒数第三个某类型的子元素
原子类
- 在做网页项目前,可以将所有的常用字号、文字颜色、行高、外边距、内边距等设置为单独的类
1
2
3例如:
.fs12{ font-size:12px }
.color-red { color:red }
伪类
- 伪类是添加到选择器的描述性词语,指定要选择的元素的特殊状态,超级链接有4个特殊状态
1
2
3
4a:link 没有被访问过的超级链接
a:visited 已经被访问过的超级链接
a:hover 正被鼠标悬停的超级链接
a:active 正被激活的超级链接(按下按键但是还没有松开按键) - “爱恨准则” LOVE HATE
- :link -> :visited -> :hover -> :active
- a 标签伪类必须按照这个写法,否则伪类不生效
伪元素(CSS3)
- ::before
- 在元素之前创建
- ::after
- 在元素之后创建
- ::selection
- 用于文档中被用户高亮的部分(使用鼠标圈选的部分)
- ::first-letter
- 选中某元素中(必须是块级元素)第一行的第一个字母
- ::first-line
- 选中某元素中(必须是块级元素)第一行的全部文字
*层叠性和选择器权重计算
- 选择器的优先级:内联样式>id选择器>类选择器>元素选择器
- 复杂选择器可以通过(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选择器个数,类选择器个数,元素选择器个数 --> - !important 权重提升
- 很多公司不允许使用 important ,因为这会带来不经意的样式冲突
CSS3浮动定位与背景样式
浮动
- 浮动的基本概念
- 垂直显示的浮动,不要设置浮动,只有并排显示的盒子才要设置浮动!
- “大盒子带着小盒子跑”,一个大盒子中,又是一个小天地,内部可以继续使用浮动
- 超市售卖的塑料袋0.3元一个,div是免费的!不要节约盒子
- 本质
- 浮动的最本质的功能:实现并排
- 浮动的要点:要浮动,并排的盒子都要设置浮动
- 父盒子要有足够的宽度,否则子盒子会掉下去
- 浮动的顺序贴靠特性
- 子盒子会按顺序贴靠,如果没有足够的空间,则会寻找再前一个兄弟元素
- 浮动的元素一定能设置宽高
- 浮动元素不在区分块级元素、行内元素,已经脱离了标准的文档流,一律能够设置宽度和高度,即使它是span标签或者标签等
- 使用浮动实现网页布局
- 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属性,规范编程,不要“玩杂技”
- 清除浮动
- clear: both;
- overflow:hidden
定位
- 相对定位
- 相对定位:盒子可以相对自己原来的位置进行调整,称为”相对定位“
- position: relative;
- 值可以是负数,即往相反的位置移动
- 相对定位的元素,会在“老家留坑”,本质上任然是在原来的位置,只不过渲染在新的地方而已,渲染的图形可以比如成“影子”,不会对其他元素产生任何影响
- 相对定位的用途:用来微调元素位置。可以当做绝对定位的参考盒子。
- 绝对定位
- 盒子可以在浏览器中,以坐标进行位置精准描述,拥有自己的绝对位置
- position: absolute;
- left 到左边的距离,right 到右边的距离,top 到上边的距离,bottom到下边的距离
- 绝对定位元素脱离标准文档流,将释放自己的位置,对其他元素不会产生任何干扰,而是对它进行压盖
- 脱离标准文档流的方法:浮动、绝对定位、固定定位
- 绝对定位的参考盒子:绝对定位的盒子会以自己祖先元素中,离自己最近的拥有定位属性的盒子,当做基准点,这个盒子通常是相对定位的,所以这个性质也叫作 “子绝父相”
- 绝对定位的盒子并不是永远以浏览器作为基点
- 绝对定位的盒子垂直居中
- position:absolute; top:50%; margin-top:-自己高度的一半
- 堆叠顺序 z-index
- 没有单位,数值大的就能压盖住小的
- 绝对定位用途:“压盖”、“遮罩”效果,结合JS实现动画效果,“雪碧图”
- 固定定位
- position: fixed;
- 固定定位只能以页面为参考点,没有“子固父相”这个性质
- 固定定位脱离标准文档流
- 用途:返回顶部,楼层导航等
2D和3D的转换
3D变形
- 3D旋转
- 将transform的属性设置为rotateX()或者rotateY(),即可实现绕横轴、纵轴旋转
- 空间移动
- 当元素进行3D旋转后,即可继续添加translateX()、translateY()、translateZ()属性让元素在空间进行移动
- perspective(景深)
- 该属性用来定义透视强度,可以理解为“人眼到舞台的距离”,单位是px
1
2
3
4<div class="box1">
<p></p>
</div>
<!-- div 是舞台,必须设置perperctive属性,p是演员,设置transform属性 -->
- 该属性用来定义透视强度,可以理解为“人眼到舞台的距离”,单位是px
- 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变形
- 旋转变形
- transform: rotate(45deg);
- 若角度为正,就是顺时针,否则就是逆时针
- transform-origin 属性设置自己的自定义变换原点
- transform-origin: 50px 40px;
- 缩放变形
- transform: scale(3);
- 以中心点为原点缩放
- 斜切变形
- transform: skew(10deg,20deg); 即可实现斜切变形
- x的斜切角度,y的斜切角度
- 位移变形IE9
- 将 transform 属性设置为 translate ,即可实现位移变形
- transform: translate(200px,400px);
- 和相对定位非常像,位移变形也会“老家留坑”,形影分离。
- 将 transform 属性设置为 translate ,即可实现位移变形
Java 异常
什么是异常
- 异常本质上是程序上的错误。
- 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。
- 在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常。
Throwable(异常的根类)
- Error(Java 虚拟机出现问题)
- Error 是程序无法处理的错误,表示运行应用程序中比较严重的问题。
- 它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
- 对于设计的合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
- 常见错误
- 虚拟机错误 VirtualMachineError
- 内存溢出 OutOfMemoryError
- 线程死锁 ThreadDeath
- Exception
- Exception 是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。
- 检查异常 Checked Exception
- 编译器要求必须处置的异常。(编码阶段)
- 除了 RuntimeException 及相关子类,其它异常都属于 Checked Exception
- IO 异常 IOException
- SQL 异常 SQLException
- 等等
- 非检查异常 Unchecked Exception
- 编译器不要求强制处置的异常(运行阶段)
- 包含 RuntimeException 及相关子类
- 空指针异常 NullPointerException
- 数组下标越界异常 ArrayIndexOutOfBoundsException
- 算数异常 ArithmeticException
- 类型转换异常 ClassCastException
- 等等…
- System.exit(1); 终止程序运行
throw & throws
- throws
- 可以通过 throws 声明将要抛出何种类型的异常,通过 throw 将产生的异常抛出。
- 如果一个方法可能出现异常,但没有能力处理这种异常,可以在方法声明处用 throws 子句来声明抛出异常。
- throws 语句用在方法定义时声明该方法要抛出的异常类型。
- 当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向调用该方法的方法,由他去处理。
- throw
- throw 用来抛出一个异常。
- 例如:throw new IOException():
- thorw 抛出的只能够是可抛出类 Throwable 或者其子类的实例对象。
- 例如:throw new String(“出错了”); 是错误的
1
2
3
4
5
6
7
8
9
10
11
12public void method(){
try{
// 代码段1
throw new 异常类型();
}catch(异常类型 ex){
// 对异常处理的代码段2
}
}
public void method() throws 异常类型{
// 代码段1
throw new 异常类型();
}
- 例如:throw new String(“出错了”); 是错误的
- 作用
- 规避可能出现的风险
- 完成一些程序的逻辑
- throw 抛出异常对象的处理方案
- 通过 try…catch 包含 throw 语句 —— 自己抛出自己处理
- 通过 throws 在方法声明抛出异常类型 —— 谁调用谁处理 —— 调用者可以自己处理,也可以继续上抛。此时可以抛出与 throw 对象相同类型或者其父类
- 当子类重写父类抛出异常方法时,声明的异常必须是父类方法所声明异常的同类或子类。
- throw 用来抛出一个异常。
自定义异常
- 基本概念
- 使用 Java 内置的异常类可以描述在编程时出现的大部分异常情况。
- 也可以通过自定义异常描述特定业务产生的异常类型。
- 所谓自定义异常,就是定义一个类,去继承 Throwable 类或者它的子类
1
2
3
4
5
6
7
8
9
10public class TestException extends Exception{
public TestException(){
super("向父类抛的异常消息");
}
}
public static void test() throw TestException{
<代码块>
throw new TestException();
}
异常链
- 基本概念
- 有时候我们会捕获一个异常后在抛出另一个异常
- 顾名思义就是:将异常发生的原因一个传一个串起来,即把底层的异常信息传个上层,这样逐层抛出。
- Exception e1 = new Exception(“异常消息”); e1.initCause(e);
如何处理异常
- 在 Java 应用程序中,异常处理机制为
- 抛出异常(先抛出,才能被捕获)
- 捕获异常
- 对于运行时异常,错误或可检查异常,Java 技术所要求的异常处理方式有所不同。
- 1、对于可查异常必须捕捉、或者声明抛出
- 2、允许忽略不可查的 RuntimeException(含子类)和 Error(含子类)
- 通过 5 个关键字来实现
- 捕获异常
- try(执行可能产生异常的代码)
- catch(捕获异常)
- finally(无论是否发生异常 代码总能执行)
- 声明异常
- throws(声明可能要抛出的异常)
- 抛出异常
- throw (手动抛出异常)
- 捕获异常
- 规则说明
- try-catch-finally
- try 块后可接零个或多个catch块,如果没有 catch 块,则必须跟一个finally块。
- try-catch-finally
- 自定义异常
- 异常链
实际应用总结
- 处理运行异常时,采用逻辑去合理规避同时辅助 try-catch 处理
- 在多重 catch 块后面,可以加一个 catch(Exception) 来处理可能被遗漏的异常
- 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
- 尽量去处理异常,切忌知识简单的调用 printStackTrace() 去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加 finally 语句块去释放占用的资源(关闭文件、关闭 sql 链接)等
Java 面向对象3
多态
- 基本概念
- 同一种行为,在不同的对象上,会产生不同的显示结果。
- 允许不同类的对象对同一消息做出不同的响应
- 编译时多态
- 设计时多态 方法重载
- 运行时多态(通常说的这个)
- 程序运行时动态决定调用哪个方法
- 必要条件
- 满足继承关系
- 父类引用指向子类对象
- 使用
- 父类引用子类实例
- 向上转型、隐式转型、自动转型
- 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法。
- 小类转型大类
- 父类 static 方法,不允许子类重写
- 向上转型后,只能调用到父类原有的静态方法
- 子类引用指向父类实例
- 向下转型、强制类型转换
- 子类引用指向父类对象,此时必须进行强转,可以调用子类独有方法
- 必须满足转换条件才能进行强转
- 对象 instanceof 类
- 判断对象是否是类的实例
1
2Animal one = new Cat();
Cat temp = (Cat)one
- 父类引用子类实例
- 抽象类(abstract)
- Java 中使用抽象类,限制实例化
- 通过 abstract 修饰的类,就是抽象类
- 不允许实例化,可以通过向上转型,指向子类实例
- 通过abstract 修饰的方法,就是抽象方法
- public abstract void eat();
- 子类必须实现这个方法!
- 应用场景
- 某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
- 避免设计随意性,无意义父类实例化
- 使用规则
- 1、abstract 定义抽象类
- 2、抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
- 3、abstract 定义抽象方法,不需要具体实现
- 4、包含抽象方法的类是抽象类
- 5、抽象类中可以没有抽象方法
- 6、static final private 不能与 abstract 并存
- Java 中使用抽象类,限制实例化
- 接口(interface)
- 基本概念
- 接口定义了某一批类所需要遵守的规范
- 接口不关心这些类的内部数据,也不关心这些类里的方法的实现细节,它只规定这些类里必须提供某些方法
- 语法:
- [修饰符] interface 接口名 [extends 付接口1, 父接口2…]
1
2
3
4
5
6{
零个到多个常量定义...
零个到多个抽象方法定义...
零个到多个默认方法的定义.... (jdk1.8新增)
零个到多个静态方法的定义... (jdk 1.8新增)
}
- [修饰符] interface 接口名 [extends 付接口1, 父接口2…]
- 使用注意:
- 一个类可以实现多个接口,通过逗号分割。 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
25package 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("我是接口中的静态方法");
}
}
- 基本概念
- 内部类
- 在 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、成员内部类
Java 面向对象2
继承
- 概念
- 一种类与类之间的关系
- 使用已存在的类定义作为基础建立新类
- 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但 不能选择性地继承父类
- 满足 “A is a B”的关系就可以形成继承关系
- 子类可以访问父类非私有成员
- 父类不可以访问子类特有成员
- 方法重写
- 语法规则
- 在子类中定义,去重写父类的方法
- 方法名相同,参数列表相同(参数顺序、个数、类型)
- 方法名、参数列表都要与父类继承的方法相同
- 访问修饰符
- 允许改变,但是访问范围需要大于等于父类的访问范围
- 与方法的参数名无关
- 方法返回值
- 当方法返回值是void 或基本数据类型时,必须相同;当返回值是引用类型时,可以是父类或其子类
- 方法的返回值和访问修饰符是可以允许有变化的(有条件的)
- 当子类重写父类方法后,子类对象调用的是重写后的方法。
- super:父类对象的引用 super.父类方法名()
- 父类的构造不允许被继承;不允许被重写,但是会影响子类的实例化过程
- 语法规则
- 特点
- 利于代码复用
- 缩短开发周期
- 语法
- 使用 extends 实现封装
- 单一继承,只能有一个父类
- 名词解释
- 父类(基类)
- 子类(派生类)
- 继承后的初始化顺序
- 父类静态成员 -> 子类静态成员 -> 父类对象构造 -> 子类对象构造
- 访问修饰符不影响成员加载顺序,跟书写位置有关
- super
- 代表父类引用
- 访问父类成员方法
- super.print();
- 访问父类属性
- super.name;
- 访问父类构造方法
- super()
- 访问父类成员方法
- 子类的构造的过程中必须调用其父类的构造方法
- 如果子类的构造方法中没有显式标注,则系统默认调用父类无参的构造方法
- 如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法,则编译错误。
- 子类构造默认调用父类无参构造方法,可以通过 super() 调用父类的允许被访问的其他构造方法,super() 必须放在子类构造函数有效代码的第一行。
- 构造方法调用时,super 和 this 不能同时出现
- 代表父类引用
- Object 类
- 概念
- Object 类是所有类的父类
- 一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组)
- Java 中的每个类都可以使用 Object 中定义的方法
- 概念
- final 关键字
- final class
- 该类没有子类
- public final class | final public class 写法都行
- final 方法
- 该方法不允许被子类重写,但是可以正常被子类继承使用
- final 变量
- 方法内局部变量
- 只要在具体使用之前进行赋值即可,一旦赋值不允许修改
- 类中成员属性
- 赋值过程
- 定义的时候直接初始化
- 构造方法中
- 构造代码块
- 赋值过程
- 基本数据类型的变量
- 初始赋值之后不能更改
- 引用类型的变量
- 初始化之后不能再指向另一个对象,但对象的内容是可变的
- 方法内局部变量
- final + static 定义后,在程序运行中不允许二次修改。
- 可以修饰方法和变量
- 修饰配置信息 public static final String URL = “www.xxx.com“
- final 不允许加载构造方法前面
- 使用 final 修饰可以提高性能,但会降低可扩展性
- final class
- 注解
- JDK1.5 版本引入的一个特性
- 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
- 一种特殊的标记
- 常用注解
- @Override 针对父类方法进行重写的形式
- 分类
- 按照运行机制分
- 源码注解
- 注解只在源码阶段保留,在编译阶段会被丢弃。例如:@Overide
- 编译时注解
- 注解会在编译时期保留,在加载 class 文件时会被丢弃。例如:@NotNull
- 运行时注解
- 在运行阶段还起作用,甚至会影响运行逻辑的注解。@Autowired
- 源码注解
- 按照来源分
- 来自 JDK 的注解
- @Override
- 来自第三方的注解
- 框架的注解
- 我们自定义的注解
- 来自 JDK 的注解
- 元注解
- 对注解进行注解
- 对注解进行标注
- @Target 限定注解可以用在什么地方
- 对注解进行注解
- 按照运行机制分
访问修饰符
- 公有的 :public
- 允许在任意位置访问
- 私有的:private
- 只允许在本类中进行访问
- 受保护的:protected
- 允许在当前类、同包子类/非子类、跨包子类调用、跨包非子类不允许
- 默认
- 允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用
Java 面向对象1
类和对象
- 面向对象
- 关注现实存在的事物的各方面信息,从对象的角度出发,根据事物的特征进行程序设计
- 对象:用来描述客观事物的一个实体
- 类:具有相同属性和方法的一组对象的集合
- 属性
- 对象具有的各种静态特征
- “对象有什么”
- 方法
- 对象具有的各种
- “对象能做什么”
- 在方法中通过对象作为参数,传递的是它的引用,可以通过引用获取该对象的所有信息。
- 类
- 抽象的概念
- 模板
- 类是模子,确定对象将会拥有的特征(属性)和行为(方法)
- 类是对象的类型
- 构造方法
- 注意事项
- 构造方法与类同名且没有返回值(必须与类名相同)
1
2
3
4
5// 构造方法的语法格式:
// 没有返回值类型 , 构造方法名 与类名相同
public 构造方法名(){
// 初始化代码
} - 只能在对象实例化的时候调用
- 构造方法与类同名且没有返回值(必须与类名相同)
- 特点
- 当没有指定构造方法时,系统会自动添加无参的构造方法
- 当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
- 一个类中可以有多个构造方法
- this(); 访问其它无参或带参 构造方法
- 注意事项
- this 关键字
- this:当前对象的默认引用
- this 的使用
- 调用成员属性,解决成员属性的局部变量同名冲突
- 调用成员方法
- 调用重载的构造方法 this();
- 通过 this() 调用构造方法,必须放在方法体内的第一行!!!
- 对象
- 基本概念
- 一个看得到、摸着着的具体实体
- 对象是类的实例表现
- 万物皆对象
- 对象是特定的类型数据
- 对象实例化
- 实例化对象过程可以分为两部分
- 声明对象 Class 对象名称
- 在内存的栈中开辟一个空间,此时栈空间的数据是空的
- 实例化对象 new Class
- 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
声明对象和实例化对象通过 = 赋值符号完成。经过赋值操作,将内存的堆地址,传递到栈当中的内存空间里。
- 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
- 声明对象 Class 对象名称
- 内存分配 栈[局部变量] ,堆[动态数据]
- 实例化对象过程可以分为两部分
- 注意事项
- 需要多次访问同一对象时,必须进行声明
- 同一作用范围内,不能定义同名对象
- 可以同时声明多个引用,用逗号分割
1
2
3
4Cat one,two;
one = new Cat();
two = new Cat();
Cat three = new Cat();four = new Cat();
- 基本概念
封装
- 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
- 隐藏对象的信息
- 留出访问的接口
- 特点
- 只能通过规定的方法访问数据
- 隐藏类的实例细节,方便修改和实现
- 实现步骤
- 1、修改属性的可见性 ,设为 private
- 2、创建 getter/setter 方法 ,设为 public 用户属性的读写
- 3、在 getter/setter 方法中加入属性控制语句,对属性的合法性进行判断
- 包(类似文件夹)
- 作用
- 管理 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
- java.lang
- 问题
- 如何实现跨包的类调用?
- 建议采用“import 包名.类名;” 的方式加载,提高效率
- 加载类的顺序跟 import 导入语句的位置无关
- “import 包名.*”; 无法访问指定包名下的类,无法访问子包下的类
- 有几种调用形式?
- 使用 import 语句导入目标类:这种方式可以直接在代码中使用 TargetClass 而无需指定完整的包路径。
import com.example.targetpackage.TargetClass;
- 使用完整的包路径访问目标类:这种方式需要在代码中完整地指定目标类的包路径。
com.example.targetpackage.TargetClass targetObject = new com.example.targetpackage.TargetClass();
- 使用 static import 导入目标类的静态成员:这种方式可以直接访问目标类的静态成员,无需指定类名。
import static com.example.targetpackage.TargetClass.staticMethod; staticMethod(); // 直接调用静态方法
- 使用 default 访问修饰符允许同一个包下的类进行访问:这种方式需要将目标类的方法声明为 default 访问修饰符,这样同包下的其他类就可以访问该方法。
// com.example.targetpackage.TargetClass default void defaultMethod() { // 此方法可被同包下的其他类访问 }
- 如何实现跨包的类调用?
- 作用
- static 关键字
- 1、类对象共享
- 2、类加载时产生,销毁时释放,生命周期长
- 注意事项
- 在成员方法中,可以直接访问类中的静态成员
- 静态方法中不能直接访问非静态成员,只能直接调用静态成员
- 只能通过对象实例化后,对象.成员方法的方式访问非静态成员
- 静态方法中不能使用 this
- 静态成员访问方式
- 1、对象.成员
- 2、类.成员
- 代码块
- 普通代码块:每此调用方法 顺序执行,先出现,先执行。
- 构造代码块:在类中定义,创建对象时调用,优先于构造方法执行。可以有多个
- 静态代码块
- static { <语句> }
- 类加载时调用,优先于构造代码块执行
- 无论产生多少类实例,静态代码块只执行一次,构造代码块在每次对象构造的时候调用
成员属性的初始值
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘\u0000’ |
boolean | false |
引用类型对象的初始值 | null |
Java 方法
什么是方法?
所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
方法的声明和调用
- 方法声明
- 语法格式
1
2
3访问修饰符 返回类型 方法名(参数列表){
方法体
} - 访问修饰符
- public
- privete
- protected
- 默认
- 方法是在类的内部中定义
- 语法格式
- 方法调用
- 语法格式
- 类名 实例名 = new 类名(); 实例名.方法名();
- 对于静态方法 static , 直接调用 方法名();
- 语法格式
- 方法分类
- 根据方法是否带参数、是否返回值,可以分为四类:
- 无参无返回值方法
- 无参带返回值方法
- 带参带返回值方法
- 带参无返回值方法
方法重载
- 同一个类中
- 方法名相同,参数列表不同
- 方法返回值、访问修饰符任意
- 与方法参数名无关
可变参数列表
- public void sum(int… n) { <语句块> }
1
2
3
4
5
6
7
8public void sum(int... n) {
int sum =0;
for(int i:n)
sum+=i;
System.out.println("sum="+sum);
} - 参数列表中如果有两个以上的参数,可变参数一定是在最后的!
- 可以将数组传递给可变参数列表,反之不行
- 数组作为参数时,是不能将多个值传递给数组的!
- 一个方法中,只能有一个可变参数
- 可变参数列表所在的方法是最后被访问的。
方法的传值问题
- 基本数据类型传值
- 方法中对参数的修改,不会对主方法传来的变量值产生影响
- 引用数据类型传值
- 方法中对数组的改变,会印象主方法中传来的数组
访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认(不写) | √ | √ | ||
protected | √ | √ | √ | |
private | √ | √ | √ | √ |
Java 数组
什么是数组
- 数组是相同类型的数据按顺序组成的一种引用类型
- 数据类型
- 基本数据类型
- 引用数据类型
- 类
- 接口
- 数组
- 等等
- 注意的问题
- 数组是引用数据类型
- 创建数组时,会开辟连续的内存空间
- 数据长度使用 length 属性获取
- 数组元素的下标从0开始
- 数组下标越界问题
一维数组
- 声明
- 语法格式
- 数据类型[] 数组名;
- 数据类型 数组名[];
- 变量声明的语法格式
- 数据类型 变量名;
- 创建
- 语法格式一:先声明后创建
- 数据类型[] 数组名;
- 数组名 = new 数据类型[数组长度];
- int [] arr;arr = new int[10]; 创建一个长度为10的整型数组
- 语法格式二:声明的同时创建数组
- 数据类型[] 数组名 = new 数据类型[数组长度];
- int [] arr = new int[10]; 创建长度为10的整型数组 arr
- 注意:数组长度必须指定
- 数组在内存中的存储
- 数组会被分配连续的内存空间
- 局部变量和数组的默认值问题
- 局部变量没有默认值、数组有默认值(数组的本身是对象)
- 语法格式一:先声明后创建
- 初始化
- 声明数组的同时给数组赋值,叫做数组的初始化
- int[] arr = {1,2,3,4,5}; 数组的长度就是初始化时所给数组元素的个数 (花括号)
- 元素的引用
- 语法格式:数组名[下标]
- 注意:下标从 0 开始
- 长度
- arr.length 表示数组的长度
二维数组
- 二维数组的声明和创建
- 声明
1
2
3int[][] 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 循环
- 又叫 foreach 循环
- foreach 循环引用
1
2
3int[] arr = {1,2,3,4};
for(int n;arr)
System.out.println(n);