1 package com.it.demo01_oop;
2
3 import java.util.Arrays;
4
5 /*
6 案例: 演示面向过程和面向对象代码的区别
7
8 面向过程编程思想详解:
9 面向过程思想其实就是一种编程思想. 所谓的面向过程开发, 指的就是面向着具体的每一个步骤和过程, 把每一个步骤和过程完成,
10 然后由这些功能方法相互调用, 完成需求.
11
12 记忆: 面向过程的代表语言是: C语言.
13
14 面向对象编程思想详解:
15 //推荐答题思路: 概述, 思想特点, 举例, 总结.
16
17 首先, 面向对象是一种编程思想, 它是基于面向过程的, 强调的是以 对象 为基础, 完成各种操作.
18 说道面向对象不得不提的就是它的3大思想特点:
19 1. 把复杂的事情简单化.
20 2. 更符合人们的思考习惯.
21 3. 把程序员从执行者变成指挥者.
22 举个例子吧, 买电脑, 洗衣服 (例子越契合当时的场景, 案例价值越高)
23 总结: 万物接对象.
24
25 程序开发:
26 就是在不断的创建对象, 使用对象, 指挥对象做事情.
27
28 程序设计:
29 就是在维护 对象 和 对象之间的关系.
30 */
31 public class Demo01 {
32 public static void main(String[] args) {
33 //需求: 把数组元素按照[1, 2, 3, 4, 5]的格式进行输出.
34
35 //1. 定义数组, 记录元素.
36 int[] arr = {1, 2, 3, 4, 5};
37
38 //2. 按照格式进行输出.
39 //方式一: 面向过程编程思想, 即: 每个动作都亲力亲为.
40 System.out.print("[");
41 for (int i = 0; i < arr.length; i++) {
42 if (i == arr.length - 1)
43 System.out.println(arr[i] + "]");
44 else
45 System.out.print(arr[i] + ", ");
46 }
47 System.out.println("----------------------");
48
49
50 //方式二: 面向对象编程思想, 即: 我们只要找对 对象即可, 把事儿交给他/她/它做.
51 System.out.println(Arrays.toString(arr));
52
53 }
54 }
 1 package com.it.demo01_oop;
2
3 import java.util.Scanner;
4
5 /*
6 案例: 演示学生类的定义和使用.
7
8 铺垫知识:
9 1. Java语言是用来描述现实世界事物, 最基本的单位是: 类.
10 2. 类就是 属性和行为 的集合, 是一个抽象的概念, 看不见, 也摸不着.
11 属性:
12 指的就是事物的外在特征(名词), 在Java中叫: 成员变量, 字段.
13
14 成员变量:
15 和以前定义变量的格式一样, 只不过写在类中方法外, 且成员变量有默认值.
16
17 行为:
18 指的就是事物能够做什么(动词), 在Java中叫: 成员方法
19
20 成员方法:
21 和以前定义方法格式一样, 只不过先不要写 static
22 3. 对象是类的具体体现, 实现, 能看的见, 也能摸得着.
23 4. 类的定义格式:
24 public class 类名 {
25 //属性
26
27 //行为
28 }
29 5. 类的调用格式, 即: 如何使用类中的成员
30 步骤1: 创建该类的对象.
31 类名 对象名 = new 类名();
32 步骤2: 通过 对象名. 的形式调用类中的成员.
33 对象名.成员变量 //获取该成员变量的值.
34 对象名.成员变量 = 值 //获取指定成员变量的值.
35 对象名.成员方法() //调用指定的成员方法
36
37 */
38 public class Demo02 {
39 public static void main(String[] args) {
40 //需求: 调用Student类中的成员.
41 //1. 创建学生类的对象.
42 Student s = new Student();
43
44 //2. 打印属性值.
45 System.out.println(s.name); //null
46 System.out.println(s.age); //0
47 System.out.println("---------------------");
48
49 //3. 设置属性值.
50 s.name = "刘亦菲";
51 s.age = 33;
52
53 //4. 打印属性值.
54 System.out.println(s.name); //刘亦菲
55 System.out.println(s.age); //33
56
57 //5. 调用成员方法.
58 s.study();
59 }
60 }
package cn.it.demo01;
/*
* 类的方式,描述现实中的事物 小汽车
*
* 小汽车 属性和功能
* 属性: 颜色 轮胎个数 变量定义
* 功能: 跑 方法
*
* 属性和方法,都属于类的成员
*
* 属性, 成员变量
* 方法, 成员方法
*/
public class Car {
//定义Car类的属性 //定义颜色属性
String color ;
//定义轮胎个数 int count ; //定义跑的功能
public void run(){
System.out.println("小汽车在跑 ..."+color+"..."+count);
} } package cn.it.demo01;
/*
* 测试,自定义的类Car
* 创建出Car类的变量
* 变量,调用属性,成员变量
* 变量,调用方法
*/
public class CarTest { public static void main(String[] args) {
//创建出Car类的变量 , 创建出Car类的对象,小汽车真的有了
Car c = new Car();
//对象.调用类中的属性和方法
c.color = "无色";
c.count = 5 ; c.run();
} }
  1 package com.it.demo02_phone;
2
3 //自定义的手机类.
4 public class Phone {
5 //属性: 品牌(brand), 价格(price), 颜色(color)
6 String brand; //品牌
7 int price; //价格
8 String color; //颜色
9
10 // 行为: 打电话(call), 发短信(sendMessage)
11 public void call(String name) {
12 System.out.println("给" + name + "打电话!");
13 }
14
15 //发短信(sendMessage)
16 public void sendMessage(String name) {
17 System.out.println("给" + name + "发短信!");
18 }
19
20 }
21
22 package com.it.demo02_phone;
23
24 /*
25 案例: 演示手机类的定义和使用.
26
27 需求:
28 1.定义手机类Phone.
29 属性: 品牌(brand), 价格(price), 颜色(color)
30 行为: 打电话(call), 发短信(sendMessage)
31 2.创建测试类PhoneTest, 在类中定义main方法, 并访问手机类(Phone类)中的成员.
32
33 PhoneTest: 手机类的测试类.3
34
35 Phone: 具体的手机类.
36 */
37 public class PhoneDemo {
38 public static void main(String[] args) {
39 //需求: 访问Phone类中的成员.
40 //1. 创建Phone类的对象.
41 Phone p = new Phone();
42 //2. 打印属性值.
43 System.out.println(p.brand);
44 System.out.println(p.price);
45 System.out.println(p.color);
46 System.out.println("---------------------------");
47
48 //3. 设置属性值.
49 p.brand = "华为P30";
50 p.price = 5999;
51 p.color = "土豪金";
52
53 //4. 打印属性值.
54 System.out.println(p.brand);
55 System.out.println(p.price);
56 System.out.println(p.color);
57
58 //5. 调用成员方法.
59 p.call("红红");
60 p.sendMessage("红红");
61 }
62 }
63
64
65 package com.it.demo02_phone;
66
67 //案例: 两个对象的内存图
68 public class PhoneDemo02 {
69 public static void main(String[] args) {
70 //1. 创建手机类的对象.
71 Phone p = new Phone();
72 //2. 设置成员变量值.
73 p.brand = "华为";
74 p.price = 6666;
75 p.color = "黑色";
76 //3. 打印成员变量.
77 System.out.println(p.brand + "--" + p.price + "--" + p.color);
78 //4. 调用成员方法.
79 p.call("李四");
80 p.sendMessage("李四");
81
82 Phone p2 = new Phone();
83 p2.brand = "小米";
84 p2.price = 3333;
85 p2.color = "白色";
86 System.out.println(p2.brand + "--" + p2.price + "--" + p2.color);
87 p2.call("张三");
88 p2.sendMessage("张三");
89 }
90 }
91
92 package com.it.demo02_phone;
93
94 //案例: 演示两个对象指向同一个地址的内存图.
95 public class PhoneDemo03 {
96 public static void main(String[] args) {
97 //1. 创建手机类的对象.
98 Phone p = new Phone();
99 //2. 设置成员变量值.
100 p.brand = "华为";
101 p.price = 6666;
102 p.color = "黑色";
103 //3. 打印成员变量.
104 System.out.println(p.brand + "--" + p.price + "--" + p.color); //华为, 6666, 黑色
105 //4. 调用成员方法.
106 p.call("李四");
107 p.sendMessage("李四");
108
109 Phone p2 = p;
110 p2.brand = "小米";
111 p2.price = 3333;
112 p2.color = "白色";
113 System.out.println(p.brand + "--" + p.price + "--" + p.color); //小米, 3333, 白色
114 System.out.println(p2.brand + "--" + p2.price + "--" + p2.color); //小米, 3333, 白色
115 p2.call("张三");
116 p2.sendMessage("张三");
117 }
118 }

 1 package com.it.demo03_variable;
2
3 /*
4 案例: 演示成员变量和局部变量的区别.
5
6 它们的区别有以下4点:
7 1. 定义位置不同.
8 成员变量: 定义在类中, 方法外的变量.
9 局部变量: 定义在方法中, 或者方法形参上的变量.
10 2. 在内存中存储位置不同.
11 成员变量: 存储在堆内存.
12 局部变量: 存储在栈内存.
13 3. 生命周期不同.
14 成员变量: 随着对象的创建而存在, 随着对象的消失而消失.
15 局部变量: 随着方法的调用而存在, 随着方法的调用完毕而消失.
16 4. 初始化值不同.
17 成员变量: 有默认值.
18 局部变量: 没有默认值, 必须先声明, 后赋值, 然后才能使用.
19 */
20 public class Demo01 {
21 public static void main(String[] args) {
22 //需求: 调用Student#show(), 等价于: 调用Student类中的show()方法
23 //1. 创建Student类的对象.
24 Student s = new Student();
25 //2. 调用指定的成员方法
26 s.show();
27 }
28 }
29
30
31 package com.it.demo03_variable;
32
33 //自定义的学生类
34 public class Student {
35 //成员变量, 属性
36 int a = 20;
37
38 //成员方法, 行为
39 public void show() {
40 //局部变量
41 int b = 10;
42
43 System.out.println(a); //20
44 System.out.println(b); //10
45 }
46 }
 1 package cn.it.demo02;
2
3 public class Car {
4 String color;
5 int count ;
6 public void run(){
7
8 int x=1;
9 /*for(int i = 0 ; i < 4 ;i++){
10
11 }*/
12 System.out.println("小汽车在跑 ..."+color+"..."+count);
13 System.out.println(x);
14 }
15 }
16
17
18
19 package cn.it.demo02;
20 /*
21 * 成员变量和局部变量的区别
22 *
23 * 1. 定义位置上的区别
24 * 成员变量,定义在类中,方法外
25 * 局部变量,方法内,语句内
26 *
27 * 2. 作用域不同
28 * 成员变量,作用范围是整个类
29 * 局部变量,方法内,语句内
30 *
31 * 3. 默认值不同
32 * 成员变量,有自己的默认值
33 * 局部变量,没有默认值,不赋值不能使用
34 *
35 * 4. 内存位置不同
36 * 成员变量,跟随对象进入堆内存存储
37 * 局部变量,跟随自己的方法,进入栈内存
38 *
39 * 5. 生命周期不同
40 * 成员变量,跟随对象,在堆中存储,内存等待JVM清理 , 生命相对较长
41 * 局部变量,跟随方法,方法出栈 生命相对较短
42 */
43 public class CarTest {
44 public static void main(String[] args) {
45 Car c = new Car();
46 c.run();
47 }
48 }
 1 package cn.it.demo03;
2
3 public class Person {
4 String name ;
5 }
6
7 package cn.it.demo03;
8 /*
9 * 方法的参数类型,是基本数据类型,引用数据类型
10 */
11 public class TestPerson {
12 public static void main(String[] args) {
13 int a = 1;
14 function(a);
15 System.out.println(a);
16
17 Person p = new Person();
18 p.name = "张三";
19 System.out.println(p.name);
20
21 function(p);
22
23 System.out.println(p.name);
24 }
25 /*
26 * 定义方法,参数类型是引用数据类型
27 * 参数是Person类型
28 * p接受的是一个内存的地址
29 * main 中的变量p
30 * function 中的变量p 保存的地址是一样的
31 */
32 public static void function(Person p){
33 p.name = "李四";
34 }
35
36 /*
37 * 定义方法,参数类型是基本数据类型
38 */
39 public static void function(int a){
40 a+=5;
41 }
42 }
 1 package com.it.demo04_private;
2
3 //自定义学生类
4 public class Student {
5 //属性
6 String name;
7 private int age;
8
9 //对外提供一个公共的访问方式, 来操作age变量.
10 //提供方法, 设置age的值.
11 public void setAge(int a) {
12 if (a >= 0 && a <= 250) {
13 //走到这里, 说明年龄合法.
14 age = a;
15 }
16 }
17 }package com.it.demo04_private;
18
19 /*
20 案例: 演示private关键字的用法.
21
22 private简介:
23 为什么要学习private?
24 因为目前我们代码中的成员变量, 外界是可以直接访问的, 这样的话, 用户就有可能给录入一些非法值,
25 造成安全隐患, 所以我们要对 成员变量进行一层封装, 不让外界直接访问了.
26 //大白话理解: 银行的钱用户是无法直接访问的, 要通过柜台小姐姐或者ATM自动存取款机来操作.
27 概述:
28 它是一个关键字, 表示"私有"的意思, 也是访问权限修饰符的一种,
29 被它修饰的内容, 只能在本类中直接使用.
30
31 应用场景:
32 1.在实际开发中, 成员变量基本上都是用private关键字来修饰的.
33 2.如果明确知道类中的某些内容不想被外界直接访问, 都可以通过private来修饰.
34
35 细节:
36 因为被private修饰的内容, 只能在本类中直接访问, 外界如果想使用这些私有成员, 需要通过特定方式.
37 即: 我们可以在类中定义两个方法, 一个是setXxx(), 用来设置属性值, 一个getXxx(), 用来获取属性值.
38
39 */
40 public class StudentTest {
41 public static void main(String[] args) {
42 //1. 创建对象.
43 Student s = new Student();
44 //2. 给属性赋值.
45 s.name = "刘亦菲";
46 //s.age = -33; //私有成员外界无法直接访问.
47 s.setAge(33);
48 //3. 打印属性值.
49 System.out.println(s.name + "..." + s.getAge());
50 //4. 调用成员方法.
51 s.study();
52 }
53 }
package cn.it.demo04;
/*
* 描述现实生活中的人的事物
* 属性: 姓名 年龄
* 功能: 说话
*
* 出现安全问题: age问题,可能出现赋值为负数的情况
* 负数不会导致程序问题,违反生活中的真实情况
*
* 提高安全问题: 让外面的类,不允许直接调用我的成员变量
* 新的关键字 private 私有 属于成员修饰符,不能修饰局部变量
* 被private修饰的成员,只能在自己的本类中被使用
*
* 对私有变量,提供公共的访问方式: 方法
*/
public class Person {
//人的姓名,成员变量
String name;
//人的年龄,成员变量
private int age ; //变量age被私有,提供方法,让外面的类使用
//定义方法,对age变量进行赋值,方法名字,必须set开头
public void setAge(int a){
//对变量参数a进行范围的限制
if(a<0 || a > 200){
//如果a超过范围,手动将age赋值为20
age = 20;
}else{
//如果a没有超过范围,直接对age赋值
age = a;
}
} //定义方法,对变量age获取值使用,方法名字get
public int getAge(){
return age;
} //定义人的说话功能,方法中,要求说出自己的姓名和年龄
public void speak(){
System.out.println(name+"..."+age);
}
}
package cn.it.demo04;
/*
* 定义好的Person类进行测试
* 创建对象,对象调用属性和方法
*/
public class PersonTest { public static void main(String[] args) {
//创建Person类的对象 new
Person p = new Person();
//对成员变量赋值
//p.age = -200;
//对成员变量age赋值,只能调用Set方法赋值
p.setAge(50); p.name = "张三";
//调用类中方法
p.speak(); //输出成员变量age值,必须调用get方法
System.out.println(p.getAge());
} }
 1 package com.it.demo05_student;
2
3 //自定义的学生类, 像这种用来描述实体的类也叫: 实体类, 或者JavaBean类, POJO类.
4 public class Student {
5 //属性: 姓名和年龄
6 private String name; //姓名
7 private int age; //年龄
8
9 //对外提供getXxx()和setXxx(), 让用户来操作name和age属性.
10 //获取姓名
11 public String getName() {
12 return name;
13 }
14 //设置姓名
15 public void setName(String n) {
16 //这里可以判断n(传入的姓名)是否合法, 但是我们不做
17 name = n;
18 }
19
20 //获取年龄
21 public int getAge(){
22 return age;
23 }
24
25 //设置年龄
26 public void setAge(int a) {
27 //这里可以判断a(传入的年龄)是否合法, 但是我们不做
28 age = a;
29 }
30
31 //行为: 学习, 吃饭.
32 public void study() {
33 System.out.println("键盘敲烂, 月薪过万!");
34 }
35
36 public void eat() {
37 System.out.println("学生吃牛肉!");
38 }
39 }
40
41 package com.it.demo05_student;
42
43 /*
44 案例: 演示加入private关键字后的 "标准代码".
45
46 需求:
47 1.定义一个标准的学生类Student, 属性: 姓名和年龄, 行为: 学习, 吃饭.
48 2.在测试类中创建学生类的对象, 然后访问类中的成员.
49
50 StudentDemo类: 测试类.
51 */
52 public class StudentDemo {
53 public static void main(String[] args) {
54 //1. 创建对象.
55 Student s = new Student();
56 //2. 设置属性值.
57 //s.name = "刘亦菲"; //private修饰的内容, 外界无法直接访问.
58 s.setName("刘亦菲");
59 /*
60 这里的-33是我们自己手动传入的, 实际开发中, 没有这种情况, 因为数据从前端传过来的,
61 当数据从前端传过来的时候, 已经经过了校验, 换言之, 我们在后台获取到的数据已经是合法的了,
62 如果再做校验属于二次校验, 可以做, 也可以不做, 一般不做, 具体看需求.
63 */
64 //s.setAge(-33);
65 s.setAge(33);
66 //3. 打印属性值.
67 System.out.println(s.getName() + "..." + s.getAge());
68 //4. 调用成员方法.
69 s.study();
70 s.eat();
71 }
72 }
package com.it.demo06_this;

//自定义的学生类, 像这种用来描述实体的类也叫: 实体类, 或者JavaBean类, POJO类.
public class Student {
//属性: 姓名和年龄
private String name; //姓名
private int age; //年龄 //对外提供getXxx()和setXxx(), 让用户来操作name和age属性.
//获取姓名
public String getName() {
return name;
} //设置姓名
public void setName(String name) {
this.name = name;
} //获取年龄
public int getAge(){
return age;
} //设置年龄
public void setAge(int age) {
this.age = age;
} //行为: 学习, 吃饭.
public void study() {
System.out.println("键盘敲烂, 月薪过万!");
} public void eat() {
System.out.println("学生吃牛肉!");
}
}
package com.it.demo06_this; /*
案例: 演示this关键字. 封装简介:
概述:
封装就是隐藏对象的属性和实现细节, 仅对外提供一个公共的访问方式.
怎么隐藏?
可以通过private关键字实现.
公共的访问方式是什么?
getXxx(), setXxx()
原则:
1. 把不需要对外暴漏的内容都封装起来.
2. 把成员变量全部私有化(封装起来).
//大白话翻译: 成员变量私有化(private修饰), 其他用public修饰. 好处:
1. 提高了代码的安全性. 由private保证.
2. 提高了代码的复用性. 由方法保证. this关键字简介
概述:
它是一个关键字, 代表本类当前对象的引用.
//大白话: 谁调用, this就代表谁.
作用:
用来解决局部变量和成员变量重名问题的. 补充: 使用变量的原则
使用变量遵循就近原则, 如果局部位置有, 就使用, 没有就去本类的成员位置找, 有就是使用.
没有就报错. //先这么记忆, 不严谨, 因为本类找不到, 还回去父类找.
*/
public class StudentDemo {
public static void main(String[] args) {
//需求1: 调用Teacher#show(), 演示使用变量的原则.
//method01(); //需求2: 加入this后的, 标准的Student类的代码编写和调用.
//1. 创建对象.
Student s = new Student();
//2. 设置属性值.
//s.name = "刘亦菲"; //private修饰的内容, 外界无法直接访问.
s.setName("刘亦菲");
s.setAge(33);
//3. 打印属性值.
System.out.println(s.getName() + "..." + s.getAge());
//4. 调用成员方法.
s.study();
s.eat(); } public static void method01() {
Teacher t = new Teacher();
t.a = 100;
t.show();
}
}
 1 package cn.it.demo05;
2
3 /*
4 * 类描述人:
5 * 属性: 姓名和年龄
6 * 方法: 说话
7 *
8 * 私有化所有的属性 (成员变量) ,必须写对应的get/set方法
9 * 凡是自定义的类,自定义成员变量,应该私有化,提供get/set
10 *
11 * this关键字:
12 * 区分成员变量和局部变量同名情况
13 * 方法中,方位成员变量,写this.
14 */
15 public class Person {
16 private String name;
17 private int age;
18
19 // set方法,变量name,age赋值
20 public void setAge(int age) {
21 this.age = age;
22 }
23
24 public void setName(String name) {
25 this.name = name;
26 }
27
28 // get方法,变量name,age获取值
29 public int getAge() {
30 return age;
31 }
32
33 public String getName() {
34 return name;
35 }
36
37 public void speak() {
38 String name = "哈哈";
39 int age = 16;
40
41 System.out.println("人在说话 " + this.name + "..." + this.age);
42 }
43 }
44
45
46 package cn.it.demo05;
47
48 public class PersonTest {
49 public static void main(String[] args) {
50 Person p = new Person();
51 //调用set方法,对成员变量赋值
52 p.setAge(18);
53 p.setName("旺财");
54 p.speak();
55
56
57 //调用get方法,获取成员变量的值
58 // System.out.println(p.getName());
59 // System.out.println(p.getAge());
60 }
61 }
package cn.it.demo06;

public class Person {
private int age; public void setAge(int age){
this.age = age;
} public int getAge(){
return age;
} /*
* 定义方法: 比较是否是同龄人,是就返回true,不是就返回false
* 谁和谁比呀,我自己和别人比
* 方法的返回值: true false
* 方法参数: 别人
*/
public boolean compare(Person p){
//自己和别人比年龄,自己是谁 this和p
return this.age == p.age;
}
} package cn.it.demo06; public class PersonTest {
public static void main(String[] args) {
//测试Person类中的年龄比较功能
//创建出2个Person对象
Person p1 = new Person();
Person p2 = new Person(); p1.setAge(15);
p2.setAge(16); //p1对象调用自己的方法compare传递p2对象
boolean b = p1.compare(p2);
System.out.println(b);
}
}
 1 package com.it.demo07_constructor;
2
3 //自定义的学生类
4 public class Student {
5 //属性
6 private String name;
7 private int age;
8
9 //系统默认加的空参.
10 public Student() {
11 System.out.println("我是空参构造方法");
12 }
13
14 //自己给的全参
15 public Student(String name, int age) {
16 System.out.println("我是全参构造方法");
17 this.name = name;
18 this.age = age;
19 }
20 }
21
22 package com.it.demo07_constructor;
23
24 /*
25 案例: 演示构造方法入门.
26
27 构造方法详解:
28 概述:
29 主职 兼职
30 构造方法就是用来快速创建对象的, 捎带着可以给对象的各个属性赋值.
31 注意事项:
32 1. 构造方法名和类名完全一致(包括大小写)
33 2. 构造方法没有返回值的数据类型, 连void都不能写.
34 3. 构造方法没有具体的返回值, 但是可以写return.
35 //return的作用是: 用来结束方法的, 捎带着可以返回具体的值.
36 4. 构造方法可以重载.
37 5. 每个类系统都会默认加一个: 空参构造, 如果你写了构造方法(不管是否是空参), 系统就不给了.
38 6. 推荐做法: 无论是否使用, 类中都要提供两个构造, 即: 空参构造, 全参构造.
39 格式:
40 public 类名(数据类型 参数名1, 数据类型 参数名2) {
41 //这里可以给该类中对应的成员变量赋值.
42 }
43
44 创建对象的格式:
45 类名 对象名 = new 构造方法名(值1, 值2, 值3);
46 */
47 public class StudentDemo {
48 public static void main(String[] args) {
49 //创建Student类的对象
50 Student s = new Student();
51 //s.setName("刘亦菲");
52 //s.setAge(33);
53 System.out.println("----------------------");
54
55 Student s2 = new Student("刘亦菲", 33);
56 }
57 }
 1 package com.it.demo02_quickstart;
2
3 //自定义的人类, 表示父类.
4 public class Person {
5 //属性
6 private String name; //姓名
7 private int age; //年龄
8
9 //构造方法
10 public Person() {
11 }
12
13 public Person(String name, int age) {
14 this.name = name;
15 this.age = age;
16 }
17
18 //getXxx(), setXxx()
19 public String getName() {
20 return name;
21 }
22
23 public void setName(String name) {
24 this.name = name;
25 }
26
27 public int getAge() {
28 return age;
29 }
30
31 public void setAge(int age) {
32 this.age = age;
33 }
34
35 //行为
36 public void eat() {
37 System.out.println("人要吃饭!");
38 }
39
40 public void sleep() {
41 System.out.println("人要睡觉!");
42 }
43
44 public void smoking() {
45 System.out.println("人要抽烟!");
46 }
47 }
48
49
50 package com.it.demo02_quickstart;
51
52 //自定义的学生类, 继承人类.
53 public class Student extends Person{
54 //行为: 学习
55 public void study() {
56 System.out.println("学生要学习!");
57 }
58 }
59
60
61 package com.it.demo02_quickstart;
62
63 //自定义的老师类, 继承人类.
64 public class Teacher extends Person{
65 //构造方法, 子类的空参访问父类的空参, 子类的全参访问父类的全参.
66
67 //行为: 教课
68 public void teach() {
69 System.out.println("老师要教课!");
70 }
71 }
package com.it.demo03_father;

//自定义的爷爷类
public class GrandFather {
public void grandFatherSay() {
System.out.println("爷爷都是从孙子过来的");
}
} package com.it.demo03_father; //自定义的爸爸类
public class Father extends GrandFather{
public void fatherSay() {
System.out.println("爸爸都是从儿子过来的!");
}
} package com.it.demo03_father; //自定义的儿子类. //public class Son extends Father, GrandFather{ //报错: Java中类与类之间只能单继承, 不能多继承.
public class Son extends Father{
} package com.it.demo03_father; /*
案例: 演示Java中类与类之间的继承特点. 需求:
1.定义GrandFather类, 该类有一个grandFatherSay()方法, 该方法打印一句话爷爷都是从孙子过来的.
2.定义Father类, 该类有一个fatherSay()方法, 该方法打印一句话爸爸都是从儿子过来的.
3.定义Son类, 分别先继承自GrandFather类和Father类, 此时发现, 上述的两个方法只能同时调用一个.
4.如果想让Son类的对象, 同时能调用上述的两个方法, 则可以这样做:
Son类继承自Father类, Father类继承自GrandFather类. 结论(记忆): Java中类与类之间的继承关系特点如下:
1. Java中类与类之间只能单继承, 不能多继承. //大白话翻译: 一个人只能有一个亲爹.
2. Java中支持多层继承. //大白话翻译: 一个人可以有一个亲爹, 还可以有一个亲爷爷.
3. 所有的类都直接或者间接继承自Object类, 换言之, Object类是所有类的父类. 快捷键:
查看继承关系树: ctrl + 字母H
*/
public class Demo01 {
public static void main(String[] args) {
Son s = new Son();
s.fatherSay(); //从Father类继承的.
s.grandFatherSay(); //从GrandFather类继承的.
}
}
package cn.it.demo01;
/*
* 定义员工类
* 属性和方法
* 属性成员变量, 姓名
* 成员方法, 工作
*/
public class Employee {
String name; public void work(){
System.out.println("员工在工作");
}
} package cn.it.demo01;
/*
* 定义研发部员工
* 属于员工中的一种
* 研发员工继承员工类
*
* 关键字 extends
* 子类是Develop, 父类是Employee
* 子类自动拥有父类中可以继承的属性和方法
*
* 子类中,可以直接调用父类的成员
*/
public class Develop extends Employee{
//在子类中,可以定义方法
public void print(){
System.out.println(name);
}
}
package cn.it.demo01;
/*
* 定义维护员工类
* 属于员工的一种, 继承员工类
*/
public class WeiHu extends Employee{
public void print(){
System.out.println(name);
}
}
 1 package com.it.demo03_variable;
2
3 //自定义的父类
4 public class Father {
5 //成员变量
6 int age = 30;
7 }
8
9
10 package com.it.demo03_variable;
11
12 //自定义的子类
13 public class Son extends Father {
14 //成员变量
15 int age = 20;
16
17 //成员方法
18 public void show() {
19 //局部变量
20 int age = 10;
21 System.out.println(age); //10
22 System.out.println(this.age); //20
23 System.out.println(super.age); //30
24 }
25 }
26
27 package com.it.demo03_variable;
28
29 /*
30 案例: 演示继承关系中的成员变量的访问特点:
31
32 需求:
33 1.定义Father类, 在该类的成员位置定义变量: int age = 30;
34 2.定义Son类, 让它继承Father类, 并在该类的成员位置定义变量: int age = 20;
35 3.在测试类FatherTest的main方法中, 定义变量: int age = 10;
36 4.通过输出语句, 直接打印age变量的值, 并查看程序的运行结果.
37
38 结论(记忆):
39 1. 使用变量遵循就近原则, 局部位置有使用, 没有就去本类的成员位置找,
40 有就使用, 没有就去父类的成员位置找, 有就使用, 没有就报错. //这里不考虑父类的父类这种情况, 会会一直找, 直到找到Object类.
41 2. 本类的局部变量, 本类的成员变量, 父类的成员变量重名时, 如何解决?
42 本类的局部变量: 直接写.
43 本类的成员变量: this.成员变量名
44 父类的成员变量: super.成员变量名
45
46
47 从本案例开始, 我们来研究继承关系中的成员特点:
48 成员变量的特点:
49 1. 就近原则.
50 2. 解决重名. super, this
51 构造方法的特点:
52
53 成员方法的特点:
54 */
55 public class Demo01 {
56 public static void main(String[] args) {
57 //需求: 调用Son#show()
58 Son s = new Son();
59 s.show();
60 }
61 }
package com.it.demo04_constructor;

//自定义的父类
public class Father {
public Father() {
//super(); //Father类的父类, Object类的.
System.out.println("Father类的 空参 构造");
} public Father(String name) {
//super(); //Father类的父类, Object类的.
System.out.println("Father类的 带参 构造");
}
} package com.it.demo04_constructor; //自定义的子类
public class Son extends Father{
/*public Son() {
//super("abc"); //用来初始化Father类的成员的
this("abc");
System.out.println("Son类的 空参 构造");
} //这行代码走完,意味着Son对象创建成功. public Son(String name) {
// super(name); //用来初始化Father类的成员的
System.out.println("Son类的 带参 构造");
}*/ //实际开发写法: 子类的空参访问父类的空参, 子类的全参访问父类的全参.
public Son() {
super();
System.out.println("Son类的 空参 构造");
} public Son(String name) {
super(name);
System.out.println("Son类的 带参 构造");
}
} package com.it.demo04_constructor; /*
案例: 演示继承关系中 构造方法的访问特点.. 需求:
1.定义父类Father, 并在空参构造中打印一句话: Father空参构造.
2.定义子类Son, 并在空参构造中打印一句话: Son空参构造.
3.在FatherTest测试类的main方法中, 创建Son类的对象, 并查看程序的执行结果.
4.分别修改Father类和Son类的代码, 添加带参构造, 并观察程序的执行结果. 结论(记忆:):
1. 子类的所有构造方法的第一行默认都有一个: super() 访问父类的空参构造.
问题一: 为什么这样设计?
用于子类对象访问父类数据前, 对父类数据进行初始化.
//大白话: 子类对象一旦创建成功, 就能直接使用父类的成员了, 因为父类成员在子类成员之前就已经初始化了.
问题二: 为什么默认访问的是空参, 而不是带参?
因为所有的类都直接或者间接继承自Object类, Object类是所有类的父类.
它里边只有一个空参构造.
问题三: 父类没有空参构造怎么办?
方案一: 通过 super()访问父类的带参构造.
方案二: 通过 this()访问本类的其他构造.
2. 实际开发写法: 子类的空参访问父类的空参, 子类的全参访问父类的全参. */
public class Demo01 {
public static void main(String[] args) {
//需求: 创建Son类的对象.
Son s = new Son();
System.out.println("---------"); Son s2 = new Son("abc");
}
}
package com.it.demo05_method;

//自定义的Father类
public class Father {
public void method() {
System.out.println("Father method()方法");
} public void show() {
System.out.println("Father show()方法");
}
} package com.it.demo05_method; //自定义的子类
public class Son extends Father{
public void method() {
super.method(); //调用父类的method()方法
System.out.println("Son method()方法");
} /* public void show() {
System.out.println("Son show()方法");
}*/
} package com.it.demo05_method; /*
案例: 演示继承关系中的成员方法访问特点. 需求:
1.定义Father类, 并在类中定义method()方法和show()方法.
2.定义Son类, 并在类中定义method()方法和show()方法.
3.在FatherTest测试类中, 创建Son类的对象, 并调用类中的成员方法.
4.注释子类中的method()方法或者show()方法, 并观察程序的执行结果. 结论(记忆):
调用成员方法时, 也遵循就近原则, 本类中有, 就直接调用, 本类中没有, 就去父类中查找, 有就使用, 没有就报错. */
public class Demo01 {
public static void main(String[] args) {
Son s = new Son();
s.show();
System.out.println("-----------");
s.method();
}
}
package com.it.demo06_override;

//自定义的手机类
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
} public void show() {
System.out.println("show方法");
}
} package com.it.demo06_override; //自定义的新式手机类
public class NewPhone extends Phone{
@Override
public void call(String name) {
super.call(name); //调用Phone#call()方法
System.out.println("新式手机会播放彩铃...");
} @Override
public void show() { //报错: 父类中私有的方法不能被重写
System.out.println("show方法");
} /*private void show() { //报错: 父类中私有的方法不能被重写
System.out.println("show方法");
}*/
} package com.it.demo06_override; //自定义的手机类
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
} public void show() {
System.out.println("show方法");
}
} package com.it.demo06_override; /*
案例: 演示方法重写. 需求:
1.定义Phone类, 并在类中定义call(String name)方法.
2.定义NewPhone类, 继承Phone类, 然后重写call(String name)方法.
3.在PhoneTest测试类中, 分别创建两个类的对象, 然后调用call()方法, 观察程序执行结果. 方法重写简介:
概述:
子类中出现和父类一模一样的方法时, 称为方法重写, 方法重写要求子父类的方法的返回值类型也必须一致.
应用场景:
当子类需要沿袭父类的功能, 但是功能主体又有自己独有需求的时候, 就可以考虑使用方法重写来实现了.
注意事项:
1.子类重写父类方法时, 方法声明上要用@Override注解来修饰.
2.父类中私有的方法不能被重写.
3.子类重写父类方法时, 访问权限不能更低.
访问权限修饰符的访问级别, 从小到大分别是:
private < 默认 < protected < public
*/
public class Demo01 {
public static void main(String[] args) {
//测试Phone#call()
Phone p = new Phone();
p.call("刘亦菲");
System.out.println("-----------------"); //测试NewPhoenix#call()方法
NewPhone np = new NewPhone();
np.call("赵丽颖");
}
}
package com.it.demo07_exercise_person;

//自定义父类, 人类.
public class Person {
//属性, 姓名, 年龄
private String name; //赵丽颖"
private int age; //31 //构造方法
public Person() {
} public Person(String name, int age) { //"赵丽颖", 31
this.name = name;
this.age = age;
} //getXxxx(), setXxx()
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //行为: 吃饭.
public void eat() {
System.out.println("人要吃饭!");
}
} package com.it.demo07_exercise_person; //自定义的学生类, 继承人类
public class Student extends Person{
//构造方法: 空参访问空参, 全参访问全参.
public Student() {
} public Student(String name, int age) { //"赵丽颖", 31
super(name, age); //"赵丽颖", 31
} //行为
//定义学习的方法
public void study() {
System.out.println("学生要好好学习");
} @Override
public void eat() {
System.out.println("学生吃牛肉!");
}
} package com.it.demo07_exercise_person; //自定义的老师类
public class Teacher extends Person {
//变量, 目前没有. //构造方法: 子类空参访问父类空参, 子类全参访问父类全参.
public Teacher() {
} public Teacher(String name, int age) {
super(name, age);
} //行为
// 定义teach()方法.
public void teach() {
System.out.println("老师要教课!");
} //重写Person#eat()
@Override
public void eat() {
System.out.println("老师喝牛肉汤!");
}
} package com.it.demo07_exercise_person; /*
案例: 继承版的人类案例. 需求:
1.已知老师类Teacher, 属性有姓名和年龄, 行为有teach()
2.已知学生类Student, 属性有姓名和年龄, 行为有study()
3.他们都要吃饭, 不同的是学生吃牛肉, 老师喝牛肉汤.
4.分析上述的需求, 并通过代码实现.
5.在PersonTest类的main方法中, 分别创建老师类和学生类的对象, 然后访问其成员. 分析:
1. 抽取父类 Person.
属性:
姓名, 年龄
行为:
吃饭eat()
2. 定义子类Teacher, 继承Person
行为:
定义teach()方法.
重写Person#eat()
3. 定义子类Student, 继承Person
行为:
定义study()方法.
重写Person#eat()方法.
*/
public class PersonTest {
public static void main(String[] args) {
//需求: 测试学生类.
//测试空参
Student s1 = new Student(); //学生是学生
//这些常用都是从Person类中继承过来的.
s1.setName("刘亦菲");
s1.setAge(33);
System.out.println(s1.getName() + "..." + s1.getAge());
s1.eat(); //重写Person#eat()方法
s1.study(); //Student类的独有功能.
System.out.println("-------------------------"); //测试全参
Student s2 = new Student("赵丽颖", 31);
System.out.println(s2.getName() + "..." + s2.getAge());
s2.eat();
s2.study(); //需求: 测试老师类, 代码留给你写了.
}
}
package com.it.demo08_quickstart;

//自定义的动物类
public class Animal {
public void eat() {
System.out.println("动物要吃饭!");
}
} package com.it.demo08_quickstart; //自定义的猫类, 继承动物类
public class Cat extends Animal{
//重写Animal#eat()
@Override
public void eat() {
System.out.println("猫吃鱼!...");
}
} package com.it.demo08_quickstart; /*
案例: 演示多态入门. 需求:
1.定义动物类Animal, 并在类中定义一个成员方法: eat()
2.定义猫类Cat, 继承Animal类, 并重写eat()方法.
3.在AnimalTest测试类的main方法中, 通过多态的方式创建猫类对象.
4.通过猫类对象, 调用eat()方法. 多态简介:
概述:
指的是同一个对象(事物)在不同时刻表现出来的不同形态, 状态.
//例如: 一杯水, 高温: 气态, 常温: 液态, 低温: 固态.
前提条件:
1. 要有继承关系.
2. 要有方法重写.
3. 要有父类引用指向子类对象.
*/
public class AnimalTest {
public static void main(String[] args) {
//1. 通过多态的方式创建猫类对象.
Animal an = new Cat(); //猫是动物.
Cat c = new Cat(); //猫是猫 //2. 调用eat()方法
an.eat();
System.out.println("..............");
c.eat();
}
}
package com.it.demo09_person;

//自定义的人类
public class Person {
int age = 30; public void eat() {
System.out.println("Person eat()");
} /* public static void sleep() {
System.out.println("Person sleep()");
}*/
} package com.it.demo09_person; //自定义的学生类
public class Student extends Person {
int age = 20; @Override
public void eat() {
System.out.println("Student eat()");
} //自己独有的成员方法
public void study() {
System.out.println("学生要学习!");
} /*public static void sleep() {
System.out.println("Student sleep()");
}*/
} package com.it.demo09_person; /*
案例: 演示多态中的成员访问特点. 需求:
1.定义一个人类Person. 属性为姓名和年龄, 行为是: eat()方法.
2.定义Student类, 继承自Person类, 定义age属性及重写eat()方法.
3.在PersonTest测试类的main方法中, 创建Student类的对象, 并打印其成员. 结论(记忆):
成员变量: 编译看左, 运行看左.
成员方法: 编译看左, 运行看右. 解释:
编译看左的意思是: 在程序的编译期间, 会看左边的数据类型有没有这个成员, 有则编译通过, 否则, 编译报错.
运行看左(右)的意思是: 在程序的运行期间, 具体用的是左(右)边数据类型中的成员.
简单记忆:
只有非静态方法是 编译看左, 运行看右, 其他(成员变量, 静态方法)都是编译和运行都看左,
原因是因为: 只有非静态方法有方法重写. 多态的好处和弊端:
好处:
提高代码的扩展性.
弊端:
父类引用不能访问子类的特有功能.
*/
public class Demo01 {
public static void main(String[] args) {
//需求: 演示多态中的成员访问特点.
//1. 通过多态, 创建学生类的对象.
//父类引用 指向 子类对象, 多态写法.
Person p = new Student();
//2. 测试访问成员变量
System.out.println(p.age); //30
//3. 测试访问成员方法
p.eat(); //student eat() //p.sleep(); //这样写会报错, 因为多态的弊端是: 父类引用不能访问子类的特有功能
//p.study();
}
}
package com.it.demo10_case;

//自定义的父类, 动物类
public class Animal {
public void eat() {
System.out.println("动物要吃!");
}
} package com.it.demo10_case; //自定义的猫类
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
} //猫独有的成员方法
public void catchMouse() {
System.out.println("猫会抓老鼠!");
}
} package com.it.demo10_case; //自定义的父类, 动物类
public class Animal {
public void eat() {
System.out.println("动物要吃!");
}
}
package com.it.demo11_animal;

//父类, 动物类
public class Animal {
//属性, 全部私有
private String name;
private int age; //构造方法: 空参, 全参
public Animal() {
} public Animal(String name, int age) {
this.name = name;
this.age = age;
} //getXxx(), setXxx()
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //行为
public void eat() {
System.out.println("动物要吃!");
}
} package com.it.demo11_animal; //猫类
public class Cat extends Animal{
//构造方法: 空参访问空参, 全参访问全参.
public Cat() {
} public Cat(String name, int age) {
super(name, age);
} //行为
//1. 重写Animal#eat() @Override
public void eat() {
System.out.println("猫吃鱼");
} //2. 自身独有的方法catchMouse()
public void catchMouse() {
System.out.println("猫会抓老鼠!");
}
} package com.it.demo11_animal; //狗类
public class Dog extends Animal{
//构造方法: 空参访问空参, 全参访问全参.
public Dog() {
} public Dog(String name, int age) {
super(name, age);
} //行为
//1. 重写Animal#eat()
@Override
public void eat() {
System.out.println("狗吃肉");
} //2. 自身独有的方法lookHome()
public void lookHome() {
System.out.println("狗会看家!");
}
} package com.it.demo11_animal; import java.util.Calendar; /*
多态案例: 动物类案例. 需求:
1.已知猫狗都有姓名和年龄, 都要吃饭.
2.猫类独有自己的catchMouse()方法, 狗类独有自己的lookHome()方法.
3.在AnimalTest测试类的main方法中, 通过多态分别创建猫类, 狗类的对象.
4.分别通过猫类对象和狗类对象, 访问对象的成员. 分析:
父类: 动物类 Animal
属性: 姓名, 年龄
行为: eat()吃饭
子类:
猫类: Cat
行为:
1. 重写Animal#eat()
2. 自身独有的方法catchMouse()
狗类: Dog
行为:
1. 重写Animal#eat()
2. 自身独有的方法lookHome()
*/
public class AnimalTest {
public static void main(String[] args) {
//需求1: 多态测试猫类
//测试空参
Animal an1 = new Cat();
//设置成员变量值
an1.setName("机器猫");
an1.setAge(16);
//打印成员变量值
System.out.println(an1.getName() + "..." + an1.getAge());
//调用方法
an1.eat(); //猫吃鱼, 因为有方法重写.
//an1.catchMouse(); //报错, 父类应用不能直接使用子类的特有成员.
Cat c1 = (Cat)an1;
c1.catchMouse();
System.out.println("-------------------------"); //测试全参
Animal an2 = new Cat("加菲猫", 13);
//打印成员变量值
System.out.println(an2.getName() + "..." + an2.getAge());
//调用方法
an2.eat(); //猫吃鱼, 因为有方法重写.
//an2.catchMouse(); //报错, 父类应用不能直接使用子类的特有成员.
Cat c2 = (Cat)an2;
c2.catchMouse(); //需求2: 多态测试狗类, 自己写.
//测试空参 //测试全参
}
} package com.it.demo11_animal; /*
案例: 演示类型转换异常(ClassCastException) 大白话理解:
猫不能转成狗.
*/
public class AnimalTest02 {
public static void main(String[] args) {
Animal an = new Cat(); //动物是猫
Cat c = (Cat)an; //猫是猫
c.catchMouse();
System.out.println("-----------------"); //会报: 类型转换异常(ClassCastException)
//多态
an = new Dog();
Dog d = (Dog)an;
d.lookHome();
}
} package com.it.demo11_animal; /*
案例: 演示多态在实际开发中的应用场景. 多态在实际开发中的应用场景:
父类型可以作为方法的形参类型, 这样可以接受其任意的子类对象,
然后调用方法的时候, 根据"编译看左, 运行看右"的原则, 传入什么
子类对象, 就调用其对应的方法.
*/
public class AnimalTest03 {
public static void main(String[] args) {
//测试: 调用猫类
Cat c = new Cat();
printAnimal(c);
System.out.println("-------------"); //测试: 调用狗类
Dog d = new Dog();
printAnimal(d);
} //需求: 定义方法, 接收动物类型的对象, 然后调用其eat()方法
//方式二: 采用多态解决.
public static void printAnimal(Animal an) { //Animal an = ?
an.eat();
} //方式一: Low版本, 一种动物, 一个方法. //针对于Cat(猫)类
public static void printAnimal(Cat c) {
c.eat();
} //针对于Dog(狗)类
public static void printAnimal(Dog d) {
d.eat();
}
} package com.it.demo11_animal; /*
案例: 演示instanceof关键字的用法 instanceof关键字详解:
格式:
对象名 instanceof 数据类型(类名)
作用:
判断前边的对象, 是否是后边的数据类型, true: 是, false: 不是 */
public class AnimalTest04 {
public static void main(String[] args) {
//测试: 调用猫类
Cat c = new Cat();
printAnimal(c);
System.out.println("-------------"); //测试: 调用狗类
Dog d = new Dog();
printAnimal(d);
} //需求: 定义方法, 接收动物类型的对象, 然后调用其eat()方法
//方式二: 采用多态解决.
public static void printAnimal(Animal an) { //Animal an = ?
//通用功能
an.eat(); //某些子类独有的功能
if (an instanceof Cat) {
Cat c = (Cat)an;
c.catchMouse();
} else if (an instanceof Dog) {
Dog d = (Dog)an;
d.lookHome();
}
} /* //方式一: Low版本, 一种动物, 一个方法. //针对于Cat(猫)类
public static void printAnimal(Cat c) {
c.eat();
c.catchMouse();
} //针对于Dog(狗)类
public static void printAnimal(Dog d) {
d.eat();
d.lookHome();
}*/
}
package com.it.demo01_final;

//父类
//public final class Father extends Object{ //final修饰的类: 不能被继承, 但是可以继承其他类.
public class Father{
int a = 10;
public final void show() {
System.out.println("这个是绝密文件, 不能动!");
} } package com.it.demo01_final; //子类
public class Son extends Father{
final int age = 20; //重写父类的show()方法, 这样写会报错, 因为父类用final修饰的方法, 子类无法重写.
/*@Override
public void show() {
System.out.println("这个是垃圾文件, 赶紧删除!");
}*/
} package com.it.demo01_final; /*
案例: 演示final关键字 需求:
1.定义Father类, 并定义它的子类Son.
2.先用final修饰Father类, 看Son类是否还能继承Father类.
3.在Son类中定义成员变量age, 并用final修饰, 然后尝试给其重新赋值, 并观察结果.
4.在Father类中定义show()方法, 然后用final修饰, 看Son类是否能重写该方法. final关键字简介:
概述:
它是一个关键字, 表示 最终 的意思, 可以修饰类, 成员变量, 成员方法.
特点: //记忆
修饰的类: 不能被继承, 但是可以继承其他类.
修饰的变量: 是一个常量, 只能赋值一次.
修饰的成员方法: 不能被子类重写.
*/
public class FatherTest {
public static void main(String[] args) {
//演示final修饰局部变量.
final int a = 10;
//a = 20; //报错, final修饰的变量: 是一个常量, 只能赋值一次.
System.out.println(a);
System.out.println("------------------"); //演示final修饰成员变量.
Son s = new Son();
//s.age = 30; 报错, final修饰的变量: 是一个常量, 只能赋值一次.
System.out.println(s.age);
System.out.println("------------------");
s.show(); }
} package com.it.demo01_final; /*
案例: 演示final修饰的变量的特点. 结论(记忆):
1. final修饰的变量如果是基本类型: 说明值不能变化.
2. final修饰的变量如果是引用类型: 说明地址值不能变化, 但是属性值可以变化.
*/
public class FatherTest02 {
public static void main(String[] args) {
//演示: final修饰的变量如果是基本类型: 说明值不能变化.
final int a = 10;
//a = 20; //报错: final修饰的变量如果是基本类型: 说明值不能变化. //演示: final修饰的变量如果是引用类型: 说明地址值不能变化, 但是属性值可以变化.
final Father f = new Father();
//f = new Father(); //报错, 说明地址值不能变化
f.a = 100; //不报错, 但是属性值可以变化
System.out.println(f.a);
}
}
package com.it.demo02_static;

//学生类
public class Student {
String name; //姓名
int age; //年龄
static String graduateFrom; //毕业院校, 共享 public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public Student(String name, int age, String graduateFrom) {
this.name = name;
this.age = age;
this.graduateFrom = graduateFrom;
} //定义show()方法, 用来打印上述的各个属性信息.
public String show() {
return name + "..." + age + "..." + graduateFrom;
}
} package com.it.demo02_static; /*
案例: 演示static关键字的特点 需求:
1.定义学生类, 属性为姓名, 年龄, 毕业院校(graduateFrom).
2.在学生类中定义show()方法, 用来打印上述的各个属性信息.
3.在测试类的main方法中, 创建学生对象, 并调用学生类的各个成员. static简介:
概述:
它是一个关键字, 表示 静态 的意思, 可以修饰成员变量, 成员方法.
特点:
1. 静态成员是随着类的加载而加载的.
2. 静态成员是优先于对象存在的.
3. 静态成员可以被该类下所有的对象所共享.
//这个判断是否使用静态的一个标准.
4. 静态成员可以被 类名. 的形式调用, 也可以通过 对象名. 的形式调用,
推荐使用前者.
*/
public class StudentTest {
public static void main(String[] args) {
//前提: 这些学生都是同一个大学的学生.
//学生来自于: 传智大学
Student.graduateFrom = "传智大学"; //创建学生, 属性值为: 刘亦菲, 33, 北影, 打印该学生的信息.
Student s1 = new Student("刘亦菲", 33);
System.out.println(s1.show()); //创建学生, 属性值为: 赵丽颖, 31, 北影, 打印该学生的信息.
Student s2 = new Student("赵丽颖", 31, "北影");
System.out.println(s2.show()); //创建学生, 属性值为: 高圆圆, 35, 北影, 打印该学生的信息.
Student s3 = new Student("高圆圆", 35);
System.out.println(s3.show());
}
}
package com.it.demo03_static;

//学生类
public class Student {
//属性
String name; //姓名, 非静态成员变量
static int age; //年龄, 静态成员变量 //行为
public void show1() {
System.out.println(name); //非静态成员变量
System.out.println(age); //静态成员变量
show2(); //非静态方法
show4(); //静态方法 System.out.println("非静态 show1()方法");
} public void show2() {
System.out.println("非静态 show2方法");
} public static void show3() {
//System.out.println(name); //非静态成员变量
System.out.println(age); //静态成员变量
//show2(); //非静态方法
show4(); //静态方法 System.out.println("静态 show3()方法");
} public static void show4() {
System.out.println("静态 show4()方法");
}
} package com.it.demo03_static; /*
案例: 演示static的访问特点和注意事项. 需求:
1.定义学生类, 属性为姓名和年龄(静态修饰), 非静态方法show1(),show2(), 静态方法show3(), show4().
2.尝试在show1()方法中, 调用: 姓名, 年龄, show2(), show4().
结论: 非静态方法可以访问所有成员(非静态变量和方法, 静态变量和方法)
3.尝试在show3()方法中, 调用: 姓名, 年龄, show2(), show4().
结论: 静态方法只能访问静态成员. 结论(记忆):
1. 静态成员方法只能访问静态成员(静态成员变量和静态成员方法).
大白话理解: 静态只能访问静态.
2. 在静态方法中, 是没有this, super关键字的.
3.因为静态的内容是随着类的加载而加载, 而this和super是随着对象的创建而存在.
即: 先进内存的, 不能访问后进内存的. */
public class StudentTest {
public static void main(String[] args) {
//需求: 调用Student#show1()
Student s = new Student();
s.show1(); //非静态成员方法, 可以访问非静态成员, 也可以访问静态成员.
System.out.println("---------------------"); //需求: 调用Student#show3();
Student.show3(); }
}
package com.it.demo04_abstract;

/*
案例: 抽象类入门. 结论(记忆):
1. 没有方法体的方法叫; 抽象方法.
2. 有抽象方法的类一定是抽象类.
3. 抽象方法和抽象类都用关键字: abstract修饰.
*/
public abstract class Animal { //抽象方法
public abstract void eat(); //非抽象方法
/*public void eat() {
System.out.println("动物会吃!");
}*/
} package com.it.demo04_abstract; //测试类
public class AnimalTest {
public static void main(String[] args) {
//需求: 调用Animal#eat()方法
//下边这个代码是无意义的, 并没有给出具体的动物. //报错原因: 抽象类不能直接实例化.
//Animal an = new Animal(); //动物是动物
//an.eat(); //动物会吃!
}
}
package com.it.demo05_animal;

//父类, 动物类.
public abstract class Animal {
//抽象方法, 吃饭
public abstract void eat(); //非抽象方法, 睡觉.
public void sleep() {
System.out.println("动物要睡觉!");
}
} package com.it.demo05_animal; //非抽象的子类, 猫类
public class Cat extends Animal{
//如果是普通类: 则必须重写父抽象类中 所有的抽象方法. @Override
public void eat() {
System.out.println("猫吃鱼");
}
} package com.it.demo05_animal; //抽象的子类, 狗类 //抽象类的子类: 如果是抽象类, 则可以不用重写父抽象类中的 抽象方法.
public abstract class Dog extends Animal{
} package com.it.demo05_animal; /*
案例: 演示抽象类的特点 需求:
1.定义抽象类Animal , 类中有一个抽象方法eat(), 还有一个非抽象方法sleep().
2.尝试在测试类中, 创建Animal类的对象, 并观察结果.
3.创建普通类Cat, 继承Animal类, 观察是否需要重写Animal#eat()方法.
4.创建抽象类Dog, 继承Animal类, 观察是否需要重写Animal#eat()方法. 结论(记忆:):
1. 抽象方法和抽象类都要用 abstract 关键字修饰.
2. 有抽象方法的类一定是抽象类, 但是抽象类中不一定有抽象方法.
3. 抽象类不能直接实例化.
那抽象类如何实例化呢?
可以通过 多态的形式创建其子类对象, 来完成抽象类的初始化, 这种做法叫: 抽象类多态.
4. 抽象类的子类:
如果是普通类: 则必须重写父抽象类中 所有的抽象方法.
如果是抽象类: 则可以不用重写父抽象类中的 抽象方法.
*/
public class AnimalTest {
public static void main(String[] args) {
//Animal an = new Animal(); //报错, 抽象类不能直接实例化 //那抽象类如何实例化呢?
//抽象类多态
Animal an = new Cat();
an.eat(); }
}
package com.it.demo06_abstract;

//人类, 抽象类
public abstract class Person {
//变量
int age;
//常量, 系统不给默认值, 留给用户来设置.
final String country = "中国"; //null //构造方法
public Person() {
}
public Person(int age) {
this.age = age;
} //非抽象方法
public void eat() {
System.out.println("人要吃饭!");
} //抽象方法
public abstract void sleep();
} package com.it.demo06_abstract; /*
需求: 演示抽象类的成员特点, 即抽象类中可以写什么. 需求:
1.定义抽象类Person, 在类中定义变量age, 常量country, 空参, 全参构造.
2.在Person类中定义非抽象方法show(), 抽象方法eat().
3.在测试类的main方法中, 创建Person类的对象, 并调用类中的成员. 结论(记忆):
专业版:
抽象类中可以写变量, 常量, 构造方法, 非抽象方法, 抽象方法.
大白话版:
抽象类比普通类多一种抽象方法, 而且抽象方法还可以不写.
*/
public class PersonTest {
public static void main(String[] args) { }
}
package com.it.demo08_interface;

/*
案例: 演示接口的成员特点, 即: 接口中可以写什么. 结论:
1. JDK1.8以前, 接口中有且只能有 常量 和 抽象方法, 原因是因为:
接口中的成员变量有默认修饰符: public static final
接口中的成员方法有默认就是福: public abstract
2. JDK1.8开始, 接口中可以写如下成员:
静态方法: 直接写即可, 和以前的规则一样.
默认方法: 即非静态方法, 要用 default 关键字修饰.
*/
public interface Inner {
//接口中的成员变量有默认修饰符: public static final
public static final int age = 20; //接口中的成员方法有默认就是福: public abstract
//public abstract void eat();
//上述代码可以简写成: 如下的形式
void eat(); public static void show() {
System.out.println("JDK1.8开始, 接口中可以写 静态方法了");
} public default void method() {
System.out.println("JDK1.8开始, 接口中可以写 非静态(默认)方法了");
}
} package com.it.demo08_interface; //测试类
public class InnerTest {
public static void main(String[] args) {
//调用接口中的 成员变量, 其实是一个常量
//Inner.age = 30; //报错, 常量值只能赋值一次, 不能修改.
System.out.println(Inner.age); //调用接口中的 成员方法
Inner.show(); //下述代码会报错, 因为method()是默认方法(非静态), 必须通过 对象名. 的形式调用.
//Inner.method();
}
} package com.it.demo08_interface; //自定义接口Jumpping, 表示具有跳高功能.
public interface Jumpping { //jump()方法, 表示具有跳高功能
public abstract void jump();
} package com.it.demo08_interface; /*
案例: 演示接口的特点. 需求:
1.定义Jumpping接口, 接口中有一个抽象方法jump().
2.定义Cat类, 实现Jumpping接口, 重写jump()方法.
3.在测试类的main方法中, 创建Jumpping接口对象, 并调用其jump()方法 结论(记忆):
1. 接口用 interface 关键字修饰.
2.
类和接口之间是实现关系, 用关键字 implements 来修饰.
3. 接口不能直接实例化.
那接口如何实例化呢?
可以通过多态的形式, 创建其子类对象, 来完成接口的实例化. 这种写法叫: 接口多态.
4. 接口的子类:
如果是普通类: 则必须重写父接口中 所有的抽象方法.
如果是抽象类: 则可以不用重写父接口中的 抽象方法. */
public class JumpTest {
public static void main(String[] args) {
//演示: 接口不能直接实例化
//Jumpping jm = new Jumpping(); //接口不能直接实例化 // 那接口如何实例化呢?
Jumpping jm = new Cat(); //接口多态
}
} package com.it.demo08_interface; //自定义的猫类, 实现Jumpping接口 //接口的子类: 如果是抽象类, 则可以不用重写父接口中的 抽象方法.
//public abstract class Cat implements Jumpping{ //接口的子类: 如果是普通类, 则必须重写父接口中 所有的抽象方法.
public class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("猫会跳高!");
}
}
package com.it.demo09_interface_class;

public class A {
} package com.it.demo09_interface_class; public class B {
} package com.it.demo09_interface_class; //演示: 类与类之间: 继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
//public class C extends B, A{ //报错 //演示: 类和接口之间: 实现关系, 可以单实现, 也可以多实现, 还可以在继承一个类的同时实现多个接口.
//public class C implements Inner1{ //单实现 //public class C implements Inner1,Inner2{ //多实现 //public class C extends B implements Inner1,Inner2{ //继承一个类的同时实现多个接口. public class C implements Inner3{
@Override
public void show3() { } @Override
public void show1() { } @Override
public void show2() { }
}
package com.it.demo09_interface_class;

public interface Inner1 {
void show1();
} package com.it.demo09_interface_class; public interface Inner2 {
void show1();
void show2();
} package com.it.demo09_interface_class; //演示: 接口与接口之间的关系: 继承关系, 可以单继承, 也可以多继承.
public interface Inner3 extends Inner2, Inner1{
void show3();
}

package com.it.demo09_interface_class;


/*
案例: 演示接口 和 类之间的关系.
类与类之间:
继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
类与接口直接:
实现关系, 可以单实现, 也可以多实现, 还可以在继承一个类的同时实现多个接口.
接口与接口之间:
继承关系, 可以单继承, 也可以多继承.
*/
public class Test {


}

 
package com.itheima.demo11_package;

import java.util.Scanner;
import java.util.HashSet;
import java.io.InputStreamReader; /*
案例: 包的详解 包(package)的简介:
概述:
包就是文件夹, 用来区分重名类的, 多级包之间用.隔开, 一般是命名格式为: 公司域名反写 + 项目名 + 部门名(编号) + 功能模块 格式.
常见的分包方式:
基本划分: 一般是按照功能或者模块划分的
按照模块划分:
com.itheima.student 学生模块
AddStudent
DeleteStudent
UpdateStudent
SelectStudent
com.itheima.teacher 老师模块
AddTeacher
DeleteTeacher
UpdateTeacher
SelectTeacher
按照功能划分:
com.itheima.add
AddStudent
AddTeacher
...
com.itheima.delete
DeleteTeacher
DeleteStudent
...
高级划分: 按照具体的业务划分的
com.it.controller 控制层
com.it.service 业务层
com.it.dao 数据访问层
com.it.utils 存放的是所有的工具类
com.it.pojo 存放所有的JavaBean类
... 格式:
package 包名1.包名2.包名3;
注意事项:
1.package语句必须是程序的第一条可执行的代码.
2.package语句在一个.java文件中只能有一个.
*/
public class Demo01 {
public static void main(String[] args) { }
} //class A{ }
package com.it.demo10_exercise;

//接口, 表示具有说英语的功能
public interface SpeakEnglish {
void speakEnglish();
} package com.it.demo10_exercise; //父类, 人类
public abstract class Person {
//属性: 姓名, 年龄
private String name;
private int age; public Person() {
} public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //行为: 吃
public abstract void eat();
} package com.it.demo10_exercise; //篮球教练类, 需要继承: 教练类
public class BasketballCoach extends Coach{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public BasketballCoach() {
} public BasketballCoach(String name, int age) {
super(name, age);
} //重写吃的方法
@Override
public void eat() {
System.out.println("篮球教练吃羊肉, 喝牛奶");
} //重写教的方法
@Override
public void teach() {
System.out.println("篮球教练教如何运球和投篮");
}
} package com.it.demo10_exercise; //教练类, 需要继承人类
public abstract class Coach extends Person{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public Coach() {
} public Coach(String name, int age) {
super(name, age);
} //行为: 教学
public abstract void teach(); } package com.it.demo10_exercise; //运动员类, 需要继承人类
public abstract class Player extends Person{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public Player() {
} public Player(String name, int age) {
super(name, age);
} //行为: 学习
public abstract void study(); } package com.it.demo10_exercise; //篮球运动员类, 需要继承: 运动员类
public class BasketballPlayer extends Player{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public BasketballPlayer() {
} public BasketballPlayer(String name, int age) {
super(name, age);
} //重写学习的功能
@Override
public void study() {
System.out.println("篮球运动员学习如何运球和投篮");
} //重写吃饭的功能
@Override
public void eat() {
System.out.println("篮球运动员吃牛肉, 喝羊奶");
}
} package com.it.demo10_exercise; //乒乓球运动员, 需要继承 运动员类, 还得实现 说英语的接口.
public class PingPangPlayer extends Player implements SpeakEnglish{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public PingPangPlayer() {
} public PingPangPlayer(String name, int age) {
super(name, age);
} //重写吃的功能
@Override
public void eat() {
System.out.println("乒乓球运动员吃大白菜, 喝小米粥");
} //重写学习的功能
@Override
public void study() {
System.out.println("乒乓球运动员学习如何发球");
} //重写说英语的功能
@Override
public void speakEnglish() {
System.out.println("乒乓球运动员需要学习如何 说英语");
}
} package com.it.demo10_exercise; //篮球教练类, 需要继承: 教练类
public class BasketballCoach extends Coach{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public BasketballCoach() {
} public BasketballCoach(String name, int age) {
super(name, age);
} //重写吃的方法
@Override
public void eat() {
System.out.println("篮球教练吃羊肉, 喝牛奶");
} //重写教的方法
@Override
public void teach() {
System.out.println("篮球教练教如何运球和投篮");
}
} package com.it.demo10_exercise; //乒乓球教练, 需要继承 教练类, 还得实现 说英语的接口.
public class PingPangCoach extends Coach implements SpeakEnglish{
//构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
public PingPangCoach() {
} public PingPangCoach(String name, int age) {
super(name, age);
} //重写吃的方法
@Override
public void eat() {
System.out.println("乒乓球运动员吃小白菜, 喝大米粥");
} //重写教的方法
@Override
public void teach() {
System.out.println("乒乓球教练教如何发球");
} //重写说英语的方法
@Override
public void speakEnglish() {
System.out.println("乒乓球教练需要学习如何 说英语");
}
}
package com.it;

/*
案例: 演示各个权限修饰符的用法. 结论(记忆):
1. 测试图解
private 默认 protected public
本类中: √ √ √ √
同包下的类(子类或者无关类均可): √ √ √
不同包下的子类: √ √
不同包下的无关类: √ 2. 四大访问权限修饰符的权限从小到大分别是:
private < 默认 < protected < public
3. 大白话总结的结论(必须记忆):
private: 强调的是给 本类 使用的.
默认: 强调的是给 同包下的类 使用的.
protected: 强调的是给 子类 使用的.
public: 强调的是给 大家 使用的. 以后写代码的时候, 如非必要, 基本都是: 成员变量全部用private修饰, 其他都用public修饰.
*/
public class Father {
private void show1() {
System.out.println("private show1()");
} void show2() {
System.out.println("默认 show1()");
} protected void show3() {
System.out.println("protected show1()");
} public void show4() {
System.out.println("public show1()");
} public static void main(String[] args) {
//创建Father类的对象, 调用四个方法
Father f = new Father();
f.show1();
f.show2();
f.show3();
f.show4();
}
} package com.it; //测试四大访问权限修饰符, 该类和Father类的关系: 同包下的子类.
public class Son extends Father {
public static void main(String[] args) {
//创建Father类的对象, 调用四个方法
Father f = new Father();
//f.show1(); private
f.show2();
f.show3();
f.show4();
}
}
package cn.it;

//老师类
public class Teacher {
public void method() {
System.out.println("Teacher类的 method()方法");
} } package com.it; //学生类
public class Student {
public void show() {
System.out.println("Student类的 show()方法");
}
} package com.it; /*
案例: 演示导包. 导包简介:
概述:
当我们使用不同包下的类的时候, 就需要导包. 如果是同包下的类, 可以直接使用.
格式:
import 包名1.包名2.类名; //只导入一个具体的包, 推荐使用.
import 包名1.包名2.*; //导入包2下所有的内容(包括所有的类和接口)
*/
public class Test {
//main方法作为程序的主入口
public static void main(String[] args) {
//需求1: 调用Student#show(), 同包下的类, 直接用, 无需导包.
Student s = new Student();
s.show(); //需求2: 调用Teacher#method()方法, 不同包下的类的使用.
//方式一: 写全类名(即: 包名 + 类名)
cn.it.Teacher t1 = new cn.itcast.Teacher();
t1.method();
System.out.println("-------------------"); //方式二: 导包
Teacher t2 = new Teacher();
t2.method();
}
} package com.it; //测试四大访问权限修饰符, 该类和Father类的关系: 同包下的无关类.
public class Test02 {
public static void main(String[] args) {
//创建Father类的对象, 调用四个方法
Father f = new Father();
//f.show1(); private
f.show2();
f.show3();
f.show4();
}
}

Java 复习整理day05的更多相关文章

  1. java 复习整理(一 java简介和基础语法)

    现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...

  2. java复习整理(六 异常处理)

    一.异常简介  在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性.        ...

  3. java 复习整理(五 类加载机制与对象初始化)

    类加载机制与对象初始化   一 . 类加载机制 类加载机制是指.class文件加载到jvm并形成Class对象的机制.之后应用可对Class对象进行实例化并调用.类加载机制可在运行时动态加载外部的类, ...

  4. java 复习整理(四 String类详解)

    String 类详解   StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上S ...

  5. java 复习整理(三 修饰符)

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为default,在同一包内可见,不使用任何修饰符. 私有的,以pr ...

  6. java 复习整理(二 数据类型和几种变量)

    源文件声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则. 一个源文件中只能有一个public类 一个源文件可以有多个非public类 源文件的名 ...

  7. Java 复习整理day10

    package com.it.demo01_quickstart; /* 案例: 讲解网络编程相关概念. 网络编程简介: 概述: 网络编程也叫: 套接字编程, Socket编程, 就是用来实现 网络互 ...

  8. Java 复习整理day09

    package com.it.demo01_thread; /* 案例: 多线程简介. 概述: 指的是进程有多条执行路径, 统称叫: 多线程. 进程: 指的是可执行程序, 文件(例如: .exe) 大 ...

  9. Java 复习整理day08

    package com.it.demo02_lambda; //接口, 表示动物. //public abstract class Animal { //报错, Lambda表达式只针对于接口有效 p ...

随机推荐

  1. Servlet[JAX-RS Servlet]的Servlet.init()引发异常

    代码环境 Eclipse2017 : 问题出现: 在测试Hello servlet时发生 org.apache.catalina.core.ApplicationContext log严重: Serv ...

  2. 人生苦短我用Python,本文助你快速入门

    目录 前言 Python基础 注释 变量 数据类型 浮点型 复数类型 字符串 布尔类型 类型转换 输入与输出 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 if.while.for 容器 列 ...

  3. laravel邮件发送

    laravel邮件发送 使用邮件发送类Mail 文本 静态方法 raw() 富文本 静态方法 send() 注:使用邮件发送必须有邮件账号,需要开启smtp协议,现在主流服务器都支持,smtp默认端口 ...

  4. Go从入门到放弃(笔记存档)

    前言 考虑到印象笔记以后不续费了,这里转存到博客园一份 因内容是自己写的笔记, 未作任何润色, 所以看着很精简, 请见谅 查看官方文档 在新的go安装包中,为了减小体积默认去除了go doc 安装go ...

  5. 【Redis3.0.x】配置文件

    Redis3.0.x 配置文件 概述 Redis 的配置文件位于Redis安装目录下,文件名为 redis.conf. 可以通过 CONFIG 命令查看或设置配置项. Redis 命令不区分大小写. ...

  6. 【JS学习】String基础方法

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 目录 定义: 字符串的连接: 标签模板的使用: 字符串的基本方 ...

  7. mysql中的基本注入函数

    1. 常见数据库注入函数: MYSQL: and length((user))>10 ACCESS: and (select count() from MSysAccessObject)> ...

  8. MySQL查询优化之 index 索引的分类和使用

    索引的分类 主键索引 (PRIMARY KEY) 唯一的标识符, 主键不可重复, 只能有一列作为主键 唯一索引 (Unique KEY) 避免重复的列出现, 唯一索引可以重复, 多个列都可以标识为唯一 ...

  9. 纯原生javascript下拉框表单美化实例教程

    html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道.但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如 ...

  10. CTFshow萌新赛-萌新福利

    下载链接文件 拿到show.bin文件 使用010Editor工具打开文件 做取反操作 取反后可以看到 把show.bin改为show.m4a 使用音频播放软件播放,即可得到flag