Linux
第一章
Linux的简介
一、操作系统(简称:OS)
例如IOS其实就是iphone的OS。
1.操作系统是电脑的核心系统,其他系统或软件都要运行在操作系统之上。
负责计算机操作运行的一个软件。
2.市面上常见的三大系统:Windows Linux MacOS
专业扫盲(IOS是手机苹果系统,MacOS是电脑苹果系统)
系统 优点 缺点
Windows 适用于绝大部分软件。使用人数最多,图形界面友好。 闭源(不公开源代码),经常打补丁更新,容易被攻击,收费昂贵。
Linux 免费开源(公开源代码供他人学习),安全性公认第一,效率最快,黑客必备,全球97%服务器安装在Linux系统上 图形界面不友好,一般都是通过cmd小黑窗进行操作。
MacOS 图形界面非常独特,非常高大上,机型轻巧,便于携带,商务必备。 闭源,收费昂贵
3.linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到 业界的认可,目前很多企业级的项目都会部署到Linux系统上。
二.虚拟机的简介(简称VM)
1.说明:由于一台电脑不能直接同时存在多个操作系统。
我们电脑都是Windows系统,所以如果想装Linux操作系统,只能借助虚拟机实现。
2.什么是虚拟机:
通过一个软件模拟的具有完整系统功能的,运行在一个完全隔离环境的 计算机系统。
3.常见的虚拟机:VMWare 、 ware(software软件)。
Linux操作系统
什么是操作系统
操作系统简称:OS 。 例如IOS其实就是iphone的OS 操作系统是电脑的核心系统,其他系统或软件都要运行在操作系统之上。 负责计算机操作运行的一个软件。 市面上常见的三大系统:Windows Linux MacOS 专业扫盲(IOS是手机苹果系统,MacOS是电脑苹果系统
linux是什么
linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到 业界的认可,目前很多企业级的项目都会部署到Linux系统上。 Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)上学时出于个人爱好而编写的。 扫盲:很多人Linux和Unix傻傻分不清。大概这样理解:Linux是根据Unix创新而来。 所以Linux的使用率和功能远远超过Unix。
linux的发行版本
什么是Linux的发行版:Linux仅仅只是一个操作系统,并不能直接使用, 而是需要借助一些外围程序,例如图形界面,文本编辑等基本软件合并。 理解为Linux仅仅是一个引擎,想要使用还是需要装在哪辆车的身上。 主要的 Linux 发行版有:(虽然名字不一样,但是都是使用的Linux操作系统核心。) ●Red Hat ●Fedora ●Debian ●Ubuntu ●CentOS (本书采用这个发行版进行教学,原因:免费,最稳定,使用人数最多。)
虚拟机简介
说明:由于一台电脑不能直接同时存在多个操作系统。 我们电脑都是Windows系统,所以如果想装Linux操作系统,只能借助虚拟机实现。 什么是虚拟机:通过一个软件模拟的具有完整系统功能的,运行在一个完全隔离环境的 计算机系统。 常见的虚拟机软件:VMWare VM(虚拟机) ware(software 软件)
为什么需要远程连接
inux一般是作为服务器的存放位置,所以一般将Linux系统所在的机器, 存放在较为安全且气温较低的位置,例如机房,例如海底,山里,湖里等。 程序员不可能去这些地方来控制linux系统。 所以就需要借助远程连接工具
什么是SSH工具
远程连接工具简称 SSH确保两台计算机之间进行正常通讯。 常见的SSH工具: A. Xftp7.0 主要负责文件的传输到服务器。 B. Xshell7.0 主要负责通过命令来控制服务器,例如关机,删除文件,修改文件等操作。
如何通过Xftp远程连接Linux
0.保证在同一个局域网下,例如机房环境,例如本机环境,或够买公网的服务器。 1.获取Linux的IP地址。 2.进入虚拟机打开活动--终端--输入ifconfig,最上面的一串就是Linux的IP地址 3.回到Xftp,文件-->新建-->将Linux的ip地址复制到主机那一栏即可。 4.解决乱码--新建会话属性-选项-编码
了解基本Linux命令
通过命令可以对Linux系统进行任意操控。 也是正式开发的必备技能。 Linux命令的特点: 1.严格区分大小写 2.使用tab键快速补齐命令
常见命令
1.ls 输出当前目录下所有文件夹 2.clear 清屏 3.cd xxx 将路径切换到xxx路径处。(linux的根路径为/)
系统目录结构
pt(可选目录):该目录是用于存放可选应用程序的安装目录。通常,第三方软件包会将其安装到这个目录中。 /root(根用户目录):这是root用户的主目录。root用户是Linux系统中具有最高权限的用户。 /tmp(临时目录):该目录用于存储临时文件。这些文件在系统重启时被删除。 /bin(二进制目录):这个目录包含了一些基本的可执行命令和工具。例如,ls、cd等命令就位于该目录。 /boot(引导目录):该目录包含了用于系统保证正常运行的文件 /etc(配置目录):该目录包含了系统的配置文件。 /home(主目录):每个用户在系统中都有一个主目录,用于存储个人文件和文档。 /lib(库目录):该目录包含了系统所需的共享库文件。这些库文件由应用程序调用,提供特定功能的支持。
绝对路径和相对路径
/开始的目录就是绝对路径。例如 /boot,表示根路径下的boot目录。 反之就是相对路径,例如boot/user,表示当前路径下的boot目录下的user目录。 常见符号:.表示当前路径。 ..表示返回上一级目录。 通过pwd命令来查看当前路径。 通过cd xx 表示切换路径
2.4 基本命令
2.4.1 目录操作类命令
mkdir 命令(make directories)用来创建目录,语法格式如下:
mkdir [参数选项] [目录名称]
mkdir命令参数及其作用
参数 说明
-p 用于创建级联目录(如AA/BB/CC)
例如:
root@MyPC:~# mkdir A
root@MyPC:~# ls
A
root@MyPC:~# mkdir A/B
root@MyPC:~# ls A
B
root@MyPC:~# mkdir -p AA/BB/CC
root@MyPC:~# ls -R AA //递归查看AA目录
AA:
BB
AA/BB:
CC
rm 命令用来删除文件或目录,该命令操作语法格式如下:
rm [参数选项] [文件或目录名称]
rm命令参数及其作用
参数 说明
-i 提示是否删除
-r 用于删除目录
-f 用于强制删除文件或目录
例如:
root@MyPC:~# mkdir test
root@MyPC:~# ls
test
root@MyPC:~# rm -rf test //加参数删除
root@MyPC:~# ls
2.4.2 文件操作类命令
touch 命令用来创建空白文件,如果改文件存在,则表示修改当前文件时间,语法如下:
touch [参数选项] [文件名称]
touch命令参数及其作用
参数 说明
-a 修改文件的Access时间(Atime)会导致Ctime时间变化
-m 修改文件内容的Modification时间(Mtime)会导致Ctime时间变化
-t 指定时间戳“[[CC]YY][ MMDDhhmm [.ss]”
-r 用其他文件的时间戳
例如:
root@MyPC:~# touch 1.txt //创建1.txt
root@MyPC:~# ll 1.txt
-rw-r--r-- 1 root root07月10 11:37 1.txt
root@MyPC:~# touch 1.txt //更新Mtime
root@MyPC:~# ll 1.txt
-rw-r--r-- 1 root root07月10 11:43 1.txt
root@MyPC:~# touch -r 1.txt 2.txt //用1.txtd 时间戳创建2.txt
root@MyPC:~# ll 2.txt
-rw-r--r-- 1 root root07月10 11:43 2.txt
cp 命令用来赋值文件或文件目录,语法如下:
cp [参数选项] 源文件|原目录 目标文件|目标目录
在Linux系统中,复制操作具体分为3种情况:
① 如果目标是目录,则把源文件复制到该目录中
② 如果目标不存在,则执行正常的复制操作
③ 如果目标是同名文件,则会覆盖
cp命令参数及其作用
参数 说明
-r 递归赋值目录
-a 复制文件时保留源source的原始属性(包括软链接属性)
-i 提示是否覆盖
-f 用于强制覆盖
例如:
root@MyPC:~# touch 1.txt ; mkdir A
root@MyPC:~# cp 1.txt 2.txt ; cp 1.txt A
root@MyPC:~# ls 2.txt A
2.txt
A:
1.txt
root@MyPC:~# cp -r A B
root@MyPC:~# ls B
1.txt
mv 命令用来重命名或者移动文件/目录,如果在同目录中对文件或者目录进行mv操作,其实相当于重命名,语法如下:
mv [参数选项] 源文件|原目录 目标文件|目标目录
在Linux系统中共,mv命令操作具体分为4种情况
① 如果源和目标处于同一目录下,则执行改名操作
② 如果目标是目录,则把源文件 | 源目录移动到该目录中
③ 如果目标不存在,则执行正常的复制操作
④ 如果目标是同名文件,则会覆盖
mv命令参数及其作用
参数 说明
-r 递归移动目录
-i 提示是否覆盖
-f 用于强制覆盖
例如:
root@MyPC:~# ls
1.txt 2.txt A B
root@MyPC:~# mv 1.txt new1.txt
root@MyPC:~# mv 2.txt A
root@MyPC:~# ls ; ls A
A B new1.txt
1.txt 2.txt
ln 命令(link)用来为文件创建链接,链接分为硬链接和符号链接两种,默认是硬链接,语法如下:
ln [参数选项] 源文件或目录 目标文件或目录
ln命令参数及其作用
参数 说明
-s 创建符号链接而非硬链接
例如:
root@MyPC:~# touch 1.txt
root@MyPC:~# ln -s 1.txt link.txt
root@MyPC:~# ls -l link.txt
lrwxrwxrwx 1 root root 5 7月 10 12:37 link.txt -> 1.txt
注意:建立硬性链接时,链接文件和被链接文件必须位于同一个文件系统中,并不能建立指向目录的硬链接,而对符号链接,则不存在这个问题,在做符号连接到其它目录的时候一定要使用绝对路径
2.4.3 文件查看类命令
cat 命令用来查看一个文件的内容并显示在屏幕上,一般用于查看内容较少的文件,语法如下:
cat [参数选项] 文件名
cat命令参数及其作用
参数 说明
-b 显示非空行的行号
-n 显示所有行的行号
例如:
root@MyPC:~# echo"hello" > 2.txt //写内容
root@MyPC:~# echo"" >> 2.txt //追加内容
root@MyPC:~# cat -n 2.txt
1 hello
2
root@MyPC:~# cat -b 2.txt
1 hello
more/less 命令用来分屏查看一个文件的内容并显示在屏幕上,一般用于查看内容比较多的文件,语法如下:
more/less [参数选项] 文件名
例如:
root@MyPC:~# more 2.txt
hello
root@MyPC:~# less 2.txt
hello
小提示:more/lee命令可以分屏显示内如(按p提前结束)。more/less都可以使用空格进行向下翻页,但比more命令好在还可以用上下键翻页查看
head/tail命令用来查看文件的前/后十行,如果加“-n”参数选项则显示文件前/后n行,语法如下:
head/tail [参数选项] 文件名
例如:
root@MyPC:~# head /etc/passwd //显示前十行
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/spool/lpd:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:var/spool/news:/usr/sbin/nologin
root@MyPC:~# head -2 /etc/passwd //显示前两行
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
为什么需要对Linux进行远程连接
因为linux是作为服务器的存放位置,而服务器对环境的要求非常高。需要凉快,安全的地方,所以一般部署在机房,海底,山洞等地方。所以程序员不可能去这里上班。
什么是SSH工具
Ssh简称远程连接工具用于确保两台计算机之间进行正常通讯。
常见的SSH工具如下:
XShell:通过命令控制服务器
XFtp:传输文件
如何通过SSH工具连接到远程的Linux服务器。
需要知道远程Linux服务器的IP地址以及用户名和密码
用户名和密码都是安装的时候自定义的,IP地址:通过ifconfig命令获取即可,在最上面一串。 IP地址:192.168.204.129
打开SSH工具,输入相关数据即可完成连接。
了解基本的Linux命令
Linux命令的特点:
1.严格区分大小写
2.使用tab键快速补齐命令
最基础的命令:
1.ls 输出当前目录下所有文件夹
2.clear 或ctrl + L 清屏
3.cd xxx 将路径切换到xxx路径处。(linux的根路径为/)
4.ctrl+c 强制退出当前操作
5.each 在控制台打印一句话。 常用于进行测试作用。
根目录下重要文件夹:
/opt(可选目录):该目录是用于存放可选应用程序的安装目录。通常,第三方软件包会将其安装到这个目录中。
/root(根用户目录):这是root用户的主目录。root用户是Linux系统中具有最高权限的用户。
/tmp(临时目录):该目录用于存储临时文件。这些文件在系统重启时被删除。
/bin(二进制目录):这个目录包含了一些基本的可执行命令和工具。例如,ls、cd等命令就位于该目录。
/boot(引导目录):该目录包含了用于系统保证正常运行的文件
/etc(配置目录):该目录包含了系统的配置文件。
/home(主目录):每个用户在系统中都有一个主目录,用于存储个人文件和文档。
/lib(库目录):该目录包含了系统所需的共享库文件。这些库文件由应用程序调用,提供特定功能的支持。
绝对路径和相对的路径的区别
开头就是/的路径就是绝对路径,例如 /aa/bb/cc
绝对路径:是根据根路径来的。
开头不是/的路径就是相对路径,例如aa/bb/cc
相对路径:根据当前路径来的。
路径相关的知识点:
pwd命令:返回当前的绝对路径。
路径中的“.”表示当前路径 “..”表示返回上一级路径
ls命令讲解
ls:查看当前路径下的所有文件夹。
语法: ls [参数选项] 其中参数选项可以省略
常见的参数选项如下:
-a 查看所有文件包括隐藏文件
-l 查看文件详细信息
-R 递归显示当前目录和子目录
如何切换用户:
语法: su 用户名
知识点:
低权限向高权限切换,需要输入密码。
高权限向低权限切换,无需输入密码。
注意事项:
当使用普通登录的时候,左边显示如下内容:
[jack@localhost ~]$
当使用管理员登录的时候,左边显示如下内容:
[root@localhost ~]#
总结:
左边的是当前的登录用户
~ :表示当前登录用户的家目录。(个人文件夹)
$表示普通用户
#表示超级管理员
如何创建文件夹
mkdir :用法:在当前目录下创建一个文件夹。语法如下:
mkdir aa 表示在当前目录创建一个文件夹
案例:在根目录创建一个名字叫test的文件夹。
切换到根目录 cd /
创建test文件夹 mkdir test
进阶用法:如果需要创建级联文件夹,那么上述无法实现。
什么是级联文件夹:就是文件夹里面还有文件夹…
用法如下: mkdir -p aa/bb/cc/dd
-p 表示允许创建级联文件夹。
如何删除文件或文件夹
rm命令:删除文件夹或文件。
默认是删除文件。
语法如下:
rm [参数选项] [文件或文件夹路径]
其中参数选项如下:
-i 提示是否删除
-r 用于删除目录
-f 用语强制删除文件或目录
N表示no y表示yes
最忌讳的语法: rm –rf /*
表示删除根目录下的所有文件
执行了该命令就准备重启之前备份的服务器吧、当前服务器以及彻底报废了。
Touch 命令 :在当前目录下创建一个空白文件。
例如 touch a.txt
cp:用于将一个文件或目录,复制到指定位置。相当于复制粘贴的合体。
语法如下:
cp [参数选项] 源文件路径 目标文件的路径
常见的选项如下:
-r 递归复制目录
-i 提示是否覆盖
-f 用于强制覆盖
需求:
在跟目录下创建一个a.txt
然后将其复制到/opt目录下。然后检查是否复制成功。
1.切换到根目录 cd /
2.创建a.txt touch a.txt
3.开始复制粘贴 cp a.txt /opt
4.检查,进入opt目录 cd /opt
5.通过ls查看
mv :常用于剪切一个文件,或者重命名一个文件
语法如下:
mv [参数选项] 源文件 目标文件
cat命令:可以查看一个文件的内容,并显示在控制台上。
语法如下:
cat [参数选项] 文件名
参数选项如下:
-n 显示所有行的行号。
适用于文件内容较小的文件
和cat指令类似。都是用来查看文件内容
其中more和less指令用法完全一致。
但是一般都是使用less。因为less支持上下翻页。
q:退出浏览
空格:向下翻页
上下箭头进行逐行浏览
Java面向对象
回顾Java基础
一.什么是Java:
Java是一门面向对象的编程语言。
二.Java的优势
A.需求范围广,网站,微信小程序,手机APP等都是Java作为主要语言编写。
B.学习成本低,公认最简单的高级语言。
三.Java的专业术语
JVM:Java虚拟机,运行Java的必备工具
JRE: Java运行环境,运行Java的必备环境
JDK: Java的开发工具包
注:其中JDK包含了JRE,JRE又包括了JVM
所以我们如果想使用Java只需要安装JDK即可。
四.如何利用Eclipse运行第一个Java程序
1.Java注释的分类
什么是注释:方便程序员阅读理解代码的用处。注释不会被java运行。
意思就是:写了仅仅是给程序员看的。
Java有3个类型的注释。
1.单行注释。把当前行注释掉 例如: // 注释内容
2.多行注释。把多行都注释。虽然可以使用多个单行注释来代替 /* */
3.文档注释。和多行注释类似,用途较少,一般是写文档用的 /** */
2.解释第一个源文件的相关意义
package com.yyzy.test;
//上述一行代码,是每个类(一个Java源文件)都必备的
//表示这个类在哪个包(路径)下
/*
每个类的模板都是以下格式:其中Xxx必须和类名(源文件名)保持一致
public class Xxx {
//若干代码
}
*/
// Java源代码的运行入口(从哪里开始运行):都是如下格式:
/*
public static void main(String[] args) {
//这里的第一行就是运行的第一行代码
}
//以上方法又称为:main方法
*/
//System.out.println("我的第一个Java程序"); 表示打印制定的内容
//如果是字符记得加双引号
public class Test1 {
public static void main(String[] args) {
System.out.println("我的第一个Java程序");
}
}
课堂练习,创建一个类。要求运行该类,在控制台打印5句
package com.yyzy.test;
public class Test2 {
public static void main(String[] args) {
//快捷键1:alt + / 表示根据你的输出内容进行对应的提示
//例如输入main 就提示入口函数
//例如输入syso 就提示打印输出代码
System.out.println("我是汉字所有加双引号");
System.out.println("i am english so 也要加双引号");
System.out.println(12345);//我是数字就不需要加了
}
}
3.讲解数据类型的含义
例如:有如下数据,每个数据的类型都不一样
昵称:独孤求败 等级:120级 点券余额:25000 身高:180.5
性别:男
所以Java针对不同的数据也有不同的语法来声明不同的数据。
4.讲解Java的8大基本数据类型
数字类型: byte short int long
字符类型: char
布尔类型: boolean
浮点类型: float double
5.如何声明一个数据
1.记得在main方法里面写。
2.语法: 数据类型 变量名 = 变量值;
3.变量名的命名规范:小驼峰命名法:首字母小写。后续每个单词的首字母大写。
//如何声明数据: 语法: 数据类型 变量名 = 变量值;
//例如声明一个年龄为18岁
byte abc = 18;//abc表示我的年龄
short age2 = 18;
int age3 = 18;
long age4 = 18;
//字符类型:只能声明单个字符。用单引号声明即可
//例如声明性别:
char sex = '男';
//例如钱包余额 如果用float存放小数,记得在后面补上f
float money = 11.5f;
double money123 = 115.55;
//布尔类型:只能存放true或false 不用加引号
//你是猪吗?
boolean isPig = true;
//重点掌握:int char double boolean
//原因:整数类型int 绰绰有余
//char:8个基本数据类型只有char可以存储字符(汉字 字母)
//double:存储的范围比float大。且更加精确
//boolean:只有boolean可以存储布尔类型
六、常见的运算符
1、赋值运算符:= 将右边的值赋值给左边。
2、算术运算符:= - * / % ++ --
3、关系运算符:> >= < <= == != 他们的返回值都是boolean类型。
4、逻辑运算符:&& 短路与 || 短路或。& 和 | 唯一区别:没有短路功能。
三元表达式:语法:表达式1?值1:值2
表示:如果表达式1为true就是值1 反之就是值2。
java的数据分为两大类:基本数据类型和引用数据类型
其中基本数据类型分为8大类:
按照所占字节的:
1字节 boolean byte
2字节 char short
4字节 int float
8字节 long double
引用数据类型:
除了8大类剩下的都是引用。
例如String Scanner System Arryas Class
public Person() {
//空参构造方法 有了它。在别处才可以通过Person p = new Person(); 来实例化
}
//有参构造方法 反问:上面明明写了无参的为什么还要写有参的。可不可以不写
//当然可以不写 ,但是如果只有无参的,那么实例化之后需要一一赋值。比较麻烦
//如果有 有参 实例化的同时 即可完成赋值操作
//例如 Person p = new Person(123, "张三" , 18);
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
例如:学生实体类为例: 拥有id name sex 三个属性。
步骤1:创建该类
步骤2:声明属性 需要通过private修饰
步骤3:由于属性都被私有化了。所以外部无法通过属性来进行操作。所以需要对外开放若干个方法,对属性进行操作。
步骤4:对属性进行set/get方法的创建 可以通过快捷键的方式
步骤5:需要生成一个toString方法,原因:随时检查实体类的属性值是否正确 如果没有加,打印对象将会得到内存地址
加了toString,打印对象将会得到对象的属性值。
步骤6:创建对应的构造方法
构造方法的概念:
1.构造方法是一个特殊的方法。无法被显示调用,只能在被实例化的时候自动调用。
2.意义:实例化(没有构造方法就无法实例化)。
3.每个类都至少含有一个构造方法,如果没有声明就说明存在一个默认的无参构造方法 类名 变量名 = new 类名();//这里没有参数
4.一般来说:一个类至少有2个构造方法,1个无参构造方法 1个有参构造方法。
*/
private int id;
private String name;
private char sex;
public Student() {//空参的构造方法 ,有了它 别处才可以
}
public Student(int id, String name, char sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;//加了this表示当前类下的属性,没有加this就是方法的参数列表的属性
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
/*
Java的四大修饰符:
public :任何地方都可以访问
protected:受保护,只有在同一个包下,或者不同包,但是具有继承关系可以访问
default(不写) :默认的:只有在同一个包下,可以访问
private :私有的,只有当前类可以访问
*/
面向对象的三大特征:封装,继承,多态。
集成概念如下:
如果不同的类之间拥有相同的属性或方法,
那么可以将这些方法或属性单独抽取出来组成一个父类,
让别的类去继承它,别的类就可以少写很多方法和属性。
这就是面向对象三大特征之一的继承。
Java中的继承和现实生活的继承非常类似。
子承父业。 父不能承子业。
子类拥有父类的方法属性,但是父类没有子类的方法或属性。
创建一个Student类,拥有studentNum,name,age,sex 4个属性。
还拥有:可以打印“我可以说话”的方法,可以打印“我可以吃饭”的方法,
可以打印“我可以上课”的方法
创建一个Teacher类,拥有teacherNum,name,age,sex 4个属性。
还拥有:可以打印“我可以说话”的方法,可以打印“我可以吃饭”的方法,
可以打印“我可以教书”的方法
分析:上述写法有何不妥。
总结:老师类和学生类中 含有相同的属性或方法。
我们推荐将其放在另外一个Person类中
然后让Teacher类和Student继承Person类即可
怎么继承一个类:
语法如下:
class A extends B{
}
我们称A为子类,B为父类。
额外补充:
Java是单继承的语言。每个类最多只能显式继承一个类。
但是每个类可以被多个类同时继承。
每个类都隐式继承Object类,Object是任何类的父类。
子父类中成员变量的特点:
假如存在特殊情况:
子类和父类都拥有相同的成员变量属性、
通过实例化 调用子类的属性 到底是用的子类的还是父类的。
答案:实例化的谁,就用的谁。
假如说想在子类的内部方法共有属性,应该怎么写?
如果直接通过属性名,就默认表示子类。
也可以通过this.属性名 来表示子类
如果想使用父类的共有属性 加上super关键字即可 例如super.money
子父类中成员方法的特点:
子承父类:如果子类没有才继承父类的相关属性或方法。
特殊情况:如果子父类拥有公共的方法,到底调用的谁的?
答案:和成员变量一致。
/*
子父类中构造方法的特点:
1.利用开发工具自动生成的构造方法,内部的第一行都有一行super();注意:只能放在第一行
2.super();表示父类的无参构造方法
3.super();如果每写就默认存在,如果写了就只会以写了的为主。
*/
A a = new A();//实例化会自动调用对应的构造方法
class A extends Father{
//实体类的编写步骤:
//1.私有化定义变量属性
//2.提供属性的set/get方法
//3.提供toString方法
//4.提供无参和有参构造方法
private int id;
public A(int id) {
this.id = id;
System.out.println("我是子类的有参构造方法");
}
public A() {
super("name ");
System.out.println("我是子类的无参构造方法");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "A [id=" + id + "]";
}
}
class Father{
private String name;
public Father(String name) {
super();
System.out.println("我是父类的有参构造方法");
this.name = name;
}
public Father() {
super();
System.out.println("我是父类的无参构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Father [name=" + name + "]";
}
}
JavaScript
一、什么是JavaScript
Java和JavaScript的关系就好像老婆和老婆饼的关系,没有关系。
非要说关系:都是编程语言。
二、JavaScript是Web开发领域中的一种功能强大的编程语言,主要用于开发交互式的网页。
简称JS
网页的组成:
三、一个完整的网页由三部分组成:
HTML (网页的主体部分)
CSS (美化的主体部分)
JavaScript (实现业务逻辑和页面控制)
以上的举例说明:
网页中最常见的无非就是登陆页面。
HTML无非就是账号框,密码框,登陆按钮。
CSS无非就是美化上述内容。
JS就是当用户点击登陆按钮,获取账号和密码框的内容,去后台进行校验,判断是否账号密码匹配,然后做出相对于的反馈。
四、JS的三大组成:
第一部分:核心语法 (JS代码)
第二部分:DOM文档对象模型 (JS可以控制HTML元素进行相关的操作)
第三部分:BOM 浏览器对象模型(JS可以控制浏览器元素进行相关的操作)
浏览器元素:弹窗。浏览器的宽高,滚动条等等。
五、JS的特点:
简单易用 (只需要用户安装浏览器即可使用)
跨平台 和上述一样。
支持面向对象
六、JS常见的开发工具
常见的两大开发工具 VSCode HBuilderX
优点 1什么语言都可以用它编写 1.专注于前台设计
缺点 1.第一个优点导致的问题:界面设计不合理, 2.功能较少
安装的插件需要很多。需要联网等
七、HBuilderX创建项目的HelloWorld
下载安装包并解压,将HbuilderX.exe生成快捷方式在桌面。
左上角:文件---新建---项目---普通项目---项目名称---存储路径---基本HTML项目
第一个拥有JS代码的HTML网页
之前讲过:网页由HTML,CSS,JS组成。所以绝大部分情况下,JS代码是放在HTML页面中。
绝少情况,暂不做了解。
案例1:打开网页,弹出一个警告框提示用户“请输入正确格式”;
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
我的第一个HTML页面
<script>
alert("请输入正确的格式");
</script>
</body>
</html>
八、常见输入输出语句
输入:prompt() 用于在浏览器中弹出输入框,用户可以输入内容。
alert() 用于在浏览器中弹出警告框。
输出:document.write() 用于在网页中输出内容。
console.log() 用于在控制台中输出信息。
JavaScript案例讲解
交换两个变量值案例
<script>
//案例需要:自定义2个变量,要求让他们两个变量进行互换
//幻想成现实生活:张三和李四都拿了一个箱子,并且不能放在地上
//需要完成箱子的交换.
//做法:喊第三个人帮忙.把张三的箱子给第三个人,然后张三拿李四的箱子.,李四就拿第三个人箱子.
var a1 = 100;
var a2 = "张三";
var a3 = a1;
a1 = a2;
a2 = a3;
console.log(a1);
console.log(a2);
</script>
猜数字游戏案例
<script>
//猜数字游戏:由管理员声明一个数字(1~100);
//用户通过prompt输入进行猜测.根据猜测结果进行反馈,是大了还是小了.,
//直至猜对.
//游戏规则如下:
//4个人参加.,每人都加2分, 猜对的那个人,指定另外三个人中的一个玩一把课堂惩罚小游戏.
var num = Math.random() * 100+1;//(0,100)
num = parseInt(num);
var begin = 1;
var end = 100;
while(true){
var n = prompt("请输入你要猜的数字。取值范围为" + begin + "~" + end);//string
n = Number(n);//此时的n才是number类型
if(n>num){
alert("你猜大了");
end = n;
}else if(n<num){
alert("你猜小了");
begin = n;
}else{
alert("你猜对了");
break;
}
}
</script>
实现随机数
<script>
// 根据弹窗,用户输入的数据完成求和运算,能够利用运算符计算用户输入的两数之和
// 为了避免JavaScript的精度问题,将结果保留两位小数。
var num1 = prompt("请输入第一个数字");
var num2 = prompt("请输入第二个数字");
//注意:下面写法是错误的.原因: 因为toFieed方法只能给数字使用
//但是prompt方法返回的一定是字符串,所以num1+num2的结果就是字符串.无法调用toFixed方法.
// alert( (num1 + num2).toFixed(2) );
//思考: 是一个一个将Num1和num2转成数字 还是为了节省代码将(num1+num2)看成一个整体然后进行转型
//答案:这里不能为了节省代码. 因为string+string是字符串的拼接
num1 = Number(num1);
num2 = Number(num2);
//这里注意:可以改进,如果结果是NAN 我们应该给用户提示一个"请输入合法的数据"
//思路:将NAN的值弄清楚是什么类型 通过typeof 得知 NAN 是一个String类型
if ( (num1 + num2).toFixed(2) == "NaN") {
alert("请输入合法的数据");
}else{
alert( (num1 + num2).toFixed(2) );
}
</script>
// 根据弹窗,用户输入的数据完成求和运算,能够利用运算符计算用户输入的两数之和
// 为了避免JavaScript的精度问题,将结果保留两位小数。
var num1 = prompt("请输入第一个数字");
var num2 = prompt("请输入第二个数字");
//注意:下面写法是错误的.原因: 因为toFieed方法只能给数字使用
//但是prompt方法返回的一定是字符串,所以num1+num2的结果就是字符串.无法调用toFixed方法.
// alert( (num1 + num2).toFixed(2) );
//思考: 是一个一个将Num1和num2转成数字 还是为了节省代码将(num1+num2)看成一个整体然后进行转型
//答案:这里不能为了节省代码. 因为string+string是字符串的拼接
num1 = Number(num1);
num2 = Number(num2);
//这里注意:可以改进,如果结果是NAN 我们应该给用户提示一个"请输入合法的数据"
//思路:将NAN的值弄清楚是什么类型 通过typeof 得知 NAN 是一个String类型
if ( (num1 + num2).toFixed(2) == "NaN") {
alert("请输入合法的数据");
}else{
alert( (num1 + num2).toFixed(2) );
}
</script>
赋值运算符案例以及讲解
<script>
//赋值运算符:最常见的就是 = 将右边的式子赋给左边.
// var a = 2 ;
//不常见的有如下:
// += *= -= /= %=
//例如
// a = a + 1; 等同于 a+=1;
//习题:
var a = 3;
a += 2;
console.log(a);//5
a -= 2;
console.log(a);//3
a *= 2;
console.log(a);//6
a /= 2;
console.log(a); //3
a %= 2;
console.log(a); //1
a **= 2;
console.log(a); //1
</script>
比较运算符案例以及讲解
<script>
//比较运算符 用来比较两个值 怎么样 返回结果为boolean类型.
//例如常见的有以下: > < >= <= != ==
//了解一下的 === 表示全等于
//==仅仅是判断值是否相等 ===不仅要值相等而且要类型相等
console.log("1" == 1);//true
console.log("1" === 1);//false
</script>
逻辑运算符讲解以及案例
//逻辑运算符的用法主要分为以下4类:
// && 短路与 & 逻辑与
// || 短路或 |逻辑或
//用法完全一致 区别如下:
// 例如 a && b
//如果a和b都为真,返回值才为真. 那么当a为false 将不会执行b
// 例如 a & b
//如果a和b都为真,返回值才为真. 当a为false 将会执行b
// 例如 a || b
//如果a和b只要有一个为真,返回值才为真. 那么当a为true 将不会执行b
// 例如 a | b
//如果a和b只要有一个为真,返回值才为真. 当a为true 将会执行b
var num = 1;
false && num++;
console.log(num);//1
true || num++;
console.log(num);//1
var num = 1;
false & num++;
console.log(num);//2
true | num++;
console.log(num);//3
</script>
三元运算符案例以及讲解
<script>
/*
三元运算符也称为三元表达式
语法如下:
条件表达式 ? 表达式1 : 表达式2
如果条件表达式的值为true,则返回表达式1的执行结果。
如果条件表达式的值为false,则返回表达式2的执行结果。
常用于替代简单的if-else语句
*/
var age = 18;
// if (age>18) {
// alert("成年了");
// } else{
// alert("未成年");
// }
alert( age>18?"成年了":"未成年" );
</script>
流程运算符案例以及讲解
<script>
//流程控制.如果没有流程控制,JS的代码将会从上至下依次执行
//有了流程控制,可以根据需求来进行代码的执行顺序
//JS中的流程控制:无非就是 if 和 switch
//其中if分为 简单的if if-else if else if
// 使用if语句实现只有当年龄(age变量值)大于等于18周岁时,才输出“已成年”,
// 否则无输出。
// var age = 18;
// if (age>=18) {
// alert("已成年");
// }
// 使用if…else语句实现当年龄(age变量值)大于等于18周岁时,输出“已成年”,
// 否则输出“未成年”,示例代码如下。
// var age = 18;
// if (age>=18) {
// alert("已成年");
// }else{
// alert("未成年");
// }
// 使用if…else if…else语句实现对一个学生的考试成绩按分数进行等级的划分:
// 90~100分为优秀,80~90分为良好,70~80分为中等,60~70分为及格,分数小于60则为不及格。
// var score = 75;
// if (score > 90) {
// alert("优秀")
// } else if(score>80) {
// alert("良好");
// }else if(score>60){
// alert("及格");
// }else{
// alert("不及格");
// }
//如果可能性较少 就有2-4种,使用if即可 如果可能很多就推荐使用switch
// switch语句也是多分支语句,相比if…else if…else语句,
// switch语句可以使代码更加清晰简洁、便于阅读,其语法格式如下。
/*
switch ( 表达式 ) {
case 值1:
代码段1;
break;
case 值2
代码段2;
break;
...
default:
代码段n;
}
*/
// 使用switch语句判断变量week的值,若week变量的值为1~6时输出“星期一”~“星期六”,
// 为0时输出“星期日”,若没有与week变量的值相等的case值时输出“错误”。
var week = 2;
switch (week){
case 1:
alert("周1");
break;
case 2:
alert("周2");
break;
case 3:
alert("周3");
break;
case 4:
alert("周4");
break;
case 5:
alert("周5");
break;
case 6:
alert("周6");
break;
case 0:
alert("周日");
break;
default:
alert("没有这个日期");
break;
}
// 注意事项1:break的重要性
//如果case中没有break,那么进入case之后,将不会跳出,而是会直接进入后续的case,并且是无条件进入,直到被break或执行完毕
// 注意事项2:如果存在多个case有相同的结果,怎么节省代码量。
var week = 2;
switch (week){
case 1:
case 2:
case 3:
case 4:
case 5:
alert("工作日");
break;
case 6:
case 0:
alert("节假日");
break;
default:
alert("没有这个日期");
break;
}
</script>
循环结构
<script>
// for (var i = 1; i <= 100; i++) {
// console.log(i); // 输出1、2、3、4、5、6……100
// }
// var i = 1;
// while (i <= 100) {
// console.log(i);
// i++;
// }
// var i = 1;
// do {
// console.log(i);
// i++;
// } while (i <= 100)
//常用的跳转语句如下。
// continue : 跳过本次循环,执行下一次
// break: 直接跳出循环.
//习题: 输出1-100 如果是3的倍数就不输出.如果输出了61就停止输出
for(var i = 1; i<=100;i++){
if(i%3==0){
continue;
}
if (i==61) {
break;
}
console.log(i);
}
>嵌套循环的案例以及讲解
<script>
// 下面以9层金字塔为例,案例效果如下,分别在页面和或控制台输出:
/*
*
***
*****
*******
*********
***********
*************
***************
*****************
*/
//页面输出的方法:
//因为是9层 所有直接定义1-9的循环
// for(var i = 1 ; i<=9;i++){
// //开始思考:每一行由什么组成:
// //答案:空格和星星
// //所以:控制行数的for循环内部:先打印空格,然后打印**
// //找规律: 第一行:8个空格+1个星星 第二行:7个空格+3个星星 第三行:6个空+ 5个星星:
// //结论:第几行的空格数: 空格的个数 = 9-i
// //结论:第几行的星星数: 2*i-1
// for(var j = 1 ; j<=9-i;j++){
// document.write(" ");
// }
// for(var k = 1 ; k<=2*i-1;k++){
// document.write("*");
// }
// //控制行数的for循环的最后一行肯定是换行:
// document.write("<br>"); //注意:页面的换行指的是<br> 控制台的换行才是 \n
// }
// var str = "";
// for(var i = 1 ; i<=9;i++){
// //开始思考:每一行由什么组成:
// //答案:空格和星星
// //所以:控制行数的for循环内部:先打印空格,然后打印**
// //找规律: 第一行:8个空格+1个星星 第二行:7个空格+3个星星 第三行:6个空+ 5个星星:
// //结论:第几行的空格数: 空格的个数 = 9-i
// //结论:第几行的星星数: 2*i-1
// for(var j = 1 ; j<=9-i;j++){
// str = str + " ";
// }
// for(var k = 1 ; k<=2*i-1;k++){
// str = str + "*";
// }
// //控制行数的for循环的最后一行肯定是换行:
// str = str + "\n";//注意:页面的换行指的是<br> 控制台的换行才是 \n
// }
// console.log(str);
//console.log类似于Java中System.out.println();打印就自动换行
//但是JS没有类似于System.out.print();的方法
//所以如果想要在控制台实现类似的效果,应该将所有的内容放在一个字符串内.
//然后通过console.log打印这个一个字符串
// //将99乘法表输出在页面上
// for(var i = 1 ; i<=9;i++){//不仅是行数 而且还是被乘数
// for(var j = 1;j<=i;j++){
// document.write(j + "*" + i + "=" + (i*j) + " " );
// }
// document.write("<hr>");
// }
//将99乘法表输出在控制台上
var str = "";
for(var i = 1 ; i<=9;i++){//不仅是行数 而且还是被乘数
for(var j = 1;j<=i;j++){
str = str + j + "*" + i + "=" + (i*j) + " ";
}
str = str + "\n";
}
console.log(str);
</script>
算数运算符
有如下几种:
+ - * / %
以上五种是最基本的加减乘除和取余
其中取余的注意事项:例题如下
*/
// console.log(10%3);//1
// console.log(10%-3);//1
// console.log(-10%3);//-1
// console.log(-10%-3);//-1
//总结:取余结果的正负取决于%左边的正负,也就是两个数取余,首先全看成正数
//然后结果的正负和%左边的正负一致即可.
//** 幂运算 语法: a ** b 理解为a的b次方
// console.log(2**3);//8
//++ 和 -- 表示自增1 和自减1
//有两种用法: a++ 表示先用在加 ++a表示先加再用
//做算数运算的注意事项: 任何编程语言都有一个通病
//做小数运算会可能损失精度
// console.log(0.1+0.2);//0.300000004
//所以JS提供了一个方法 来避免这种情况出现
// aaa.toFixed(num); 表示保留小数点后面几位小数
// aaa表示某个数 num表示保留几位 如果没写默认就是0
// console.log( (0.1+0.2).toFixed(3) );
//注意事项: 该方法的返回值是string类型.
//字符运算符 就是一个 +
// 字符之间的运算 通过 + 即可完成拼接
// var str1 = "张三";
// var str2 = "是猪";
// console.log(str1+str2);//张三是猪
//注意事项:任何类型 + string = string
//所以:我们不仅可以将字符串转型成数字 也可以将任何类型 转成string
//最常见的做法: 直接和空字符串相加即可.这样不会影响值的本身.
// console.log( typeof (1234 + ""));
赋值运算符
:最常见的就是 = 将右边的式子赋给左边.
var a = 2 ;
不常见的有如下:
+= *= -= /= %=
例如
a = a + 1; 等同于 a+=1;
比较运算符
用来比较两个值 怎么样 返回结果为boolean类型.
例如常见的有以下: > < >= <= != ==
了解一下的 === 表示全等于 ==仅仅是判断值是否相等
===不仅要值相等而且要类型相等
console.log("1" == 1);
true console.log("1" === 1);//false
逻辑运算符
用法主要分为以下4类:
&& 短路与 & 逻辑与
|| 短路或 |逻辑或
用法完全一致 区别如下:
例如 a && b
如果a和b都为真,返回值才为真. 那么当a为false 将不会执行b
例如 a & b
如果a和b都为真,返回值才为真. 当a为false 将会执行b
例如 a || b
如果a和b只要有一个为真,返回值才为真. 那么当a为true 将不会执行b
例如 a | b
如果a和b只要有一个为真,返回值才为真. 当a为true 将会执行b
三元运算符
也称为三元表达式
语法如下:
条件表达式 ? 表达式1 : 表达式2
如果条件表达式的值为true,则返回表达式1的执行结果。
如果条件表达式的值为false,则返回表达式2的执行结果。
常用于替代简单的if-else语句
流程控制
如果没有流程控制,JS的代码将会从上至下依次执行
有了流程控制,可以根据需求来进行代码的执行顺序
JS中的流程控制:无非就是 if 和 switch
其中if分为 简单的if if-else if else if
使用if语句实现只有当年龄(age变量值)大于等于18周岁时,才输出“已成年”,
否则无输出。
var age = 18;
if (age>=18) {
alert("已成年");
}
使用if…else语句实现当年龄(age变量值)大于等于18周岁时,输出“已成年”,
否则输出“未成年”,示例代码如下。
var age = 18;
if (age>=18) {
alert("已成年");
}else{
alert("未成年");
}
使用if…else if…else语句实现对一个学生的考试成绩按分数进行等级的划分:
90~100分为优秀,80~90分为良好,70~80分为中等,60~70分为及格,分数小于60则为不及格。
var score = 75;
if (score > 90) {
alert("优秀")
} else if(score>80) {
alert("良好");
}else if(score>60){
alert("及格");
}else{
alert("不及格");
}
如果可能性较少 就有2-4种,使用if即可 如果可能很多就推荐使用switch
switch语句也是多分支语句,相比if…else if…else语句,
switch语句可以使代码更加清晰简洁、便于阅读,其语法格式如下。
/*
switch ( 表达式 ) {
case 值1:
代码段1;
break;
case 值2
代码段2;
break;
...
default:
代码段n;
}
*/
使用switch语句判断变量week的值,若week变量的值为1~6时输出“星期一”~“星期六”,
为0时输出“星期日”,若没有与week变量的值相等的case值时输出“错误”。
var week = 2;
switch (week){
case 1:
alert("周1");
break;
case 2:
alert("周2");
break;
case 3:
alert("周3");
break;
case 4:
alert("周4");
break;
case 5:
alert("周5");
break;
case 6:
alert("周6");
break;
case 0:
alert("周日");
break;
default:
alert("没有这个日期");
break;
}
注意事项1:break的重要性
如果case中没有break,那么进入case之后,将不会跳出,而是会直接进入后续的case,并且是无条件进入,直到被break或执行完毕
注意事项2:如果存在多个case有相同的结果,怎么节省代码量。
var week = 2;
switch (week){
case 1:
case 2:
case 3:
case 4:
case 5:
alert("工作日");
break;
case 6:
case 0:
alert("节假日");
break;
default:
alert("没有这个日期");
break;
}
for (var i = 1; i <= 100; i++) {
console.log(i); 输出1、2、3、4、5、6……100
}
var i = 1;
while (i <= 100) {
console.log(i);
i++;
}
var i = 1;
do {
console.log(i);
i++;
} while (i <= 100)
常用的跳转语句如下。
continue : 跳过本次循环,执行下一次
break: 直接跳出循环.
习题: 输出1-100 如果是3的倍数就不输出.如果输出了61就停止输出
for(var i = 1; i<=100;i++){
if(i%3==0){
continue;
}
if (i==61) {
break;
}
console.log(i);
}