写在开头的话
结束了2021年的考研,感慨时光荏苒。考研带给我的不仅仅是基础知识的系统学习,更多的是教会了我如何去自我学习,去思考,也赋予了我今后面对任何事情,只要我想实现它,就不惧困难,一往无前的勇气和毅力。 感谢B站狂神!他算是我Java路上的导师,他的课幽默,但很实用,同时也教会了我很多生活和工作中的经验。我一直很喜欢这种老师(包括考研路上的张宇,刘晓燕,徐涛,腿姐等等),教会你的不仅仅知识,更多的是精神上的共鸣,能够感受到这些老师们的人格魅力,并且潜移默化影响着越来越多人。在寒假我打算再重新系统的学习Java,从JavaSE到分布式,并用博客来记录这一路的收获和心得。 分享很喜欢的一句话:只要满怀希望,就会所向披靡! 2022年1月1日
基本Dos命令
打开CMD的方式
1.开始+系统+命令提示符 2.按Win+R 输入cmd(推荐)
3.在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令窗口 4.资源管理器的地址前面加上cmd路径
以管理员方式运行:获取最高权限
常用的Dos命令
1.E:(进入E盘) 2.dir 查看当前盘全部文件 3.在D盘去F盘下某个文件(QQLive)用/d操作: cd /d F:\QQLive 4.返回上一级cd… 5.进去此盘下的某文件夹cd 文件夹名(QQLive) 6.清理屏幕cls 7.退出终端exit 8.查看电脑ip ipconfig 9.打开计算机calc 10.打卡画图工具mspaint 11.打卡记事本notepad 12.得到网站IP信息 ping (别Ctrl+v,鼠标右键为粘贴) 13.创建文件夹md 14.创建文本cd>a.txt 创建文档cd>a.docx 15.删除文本(文档)del a.docx 16.删除文件夹rd test
生成JavaDoc
1.用IDEA工具 2.可以通过DOS命令
Java帝国的诞生
-
1972年C诞生
- 贴近硬件,运作极快,效率很高
- 操作系统,编译器,数据库,网络系统等
- 指针和内存管理
-
1982年C++诞生
反抗
- 我们需要建立一个新的语言:
- 语法像C
- 没有指针
- 没有内存管理
- 真正的可移植,编写一次,到处运行
- 面向对象
- 类型安全
- 高质量的内库
- 。。。。。。
Java诞生
- Java初始
- 1995年的网页简单而粗糙,缺乏互动性
- 图形界面的程序(Applet)
- Bill Gates说:这是迄今为止设计的最好的语言!
- Java 2 标准版(J2SE):去占领桌面
- Java 2 移动端(J2ME :去占领手机
- Java 2 企业版(J2EE):去占领服务器
- Java发展
Java特性和优势
- 简单性
- 面向对象
- 可移植性
- 高性能
- 分布式
- 动态性:反射
- 多线程
- 安全性
- 健壮性
JDK,JRE,JVM
Java基础
方法
面向过程和面向对象
类和对象的创建
类和对象关系
创建对象内存分析
总结
- 类与对象
类是一个模板:抽象;对象是一个具体的实例 - 方法
定义,调用 - 对应的引用
引用类型:基本类型(8) 对象是通过引用来操作的:栈——>堆 - 属性:字段Field 成员变量
默认初始化: 数字:0 0.0 char : u0o00 booLean:false 引用: null 修饰符 属性类型 属性名=属性值! - 对象的创建和使用
必须使用new关键字创造对象,构造器 (Person kuangshen = new Person();) 对象的属性kuangshen.name 对象的方法kuangshen.sleep() - 类
静态的属性:属性 动态的行为:方法
构造器
构造器一般用来赋初值
无参构造器
package learn;
public class Person {
String name;
}
package learn;
public class way {
public static void main(String[] args) {
Person zs = new Person();
System.out.println(zs.name);
}
}
有参构造器
小技巧,快捷键生成构造器:alt+inset
封装
- 该露的露,该藏的藏
我们程序设计要追==“高内聚,低耦合”==,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。 - 封装(数据的隐藏)
通常,应该禁止直接访问一个对象中的数据的实际表示,而应该通过操作接口来访问,这称为信息隐藏。 - 记住这句话:属性私有, get/set
- 小技巧:alt+insert
package learn;
public class Student {
private String name;
private int id;
private char sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age>0&&age<120){
this.age=age;
}else
this.age=3;
}
}
package learn;
public class way {
public static void main(String[] args) {
Student LiMing=new Student();
LiMing.setAge(-1);
System.out.println(LiMing.getAge());
}
}
封装的意义
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护性增加了
继承
package learn;
public class Father {
public String house="别墅";
private int monkey=10_0000_0000;
public void say(){
System.out.println("说了一句话");
}
}
package learn;
public class Son extends Father{
}
package learn;
public class way {
public static void main(String[] args) {
Son son = new Son();
son.say();
System.out.println(son.house);
System.out.println(son.monkey);
}
}
那private怎么用?——那,就封装的思想!回见封装 小技巧,按Ctrl+H,可以看见继承树
super——父类,this——自己
重难点来了 前面说了,在子类里的无参构造器会默认先执行隐藏代码super();,但是如果父类没有无参构造器,只有有参构造器时,会怎么样?——爆红 那怎么解决? 手动调用父类有参 综上总结
-
super注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中!
- super和this不能同时调用构造方法!
-
this注意点:
- 代表的对象不同
- this:本身调用这个对象
- super代表父类对象的应用
- 前提
- this:没有继承也可以使用
- super:只能在继承条件下才可以使用
- 构造方法
- this();本类的构造
- super( );父类的构造;
方法的重写 先看两个小栗子
package learn;
public class Father {
public static void test(){
System.out.println("B=>>");
}
}
package learn;
public class Son extends Father{
public static void test(){
System.out.println("A==>");
}
}
package learn;
public class way {
public static void main(String[] args) {
Son son = new Son();
Father father=new Son();
son.test();
father.test();
}
}
- 不加static ,可以明显看到父类多了向下的图标,子类多了向上的图标,这就是重写的标识
小技巧,alt+insert可以快速生成重写,有@override注解 总结
- 重写:需要有继承关系,子类重写父类的方法!
1.方法名必须相同 2.参数列表列表必须相同 3.修饰符:范围可以扩大但不能缩小:public>Protected>Default>private 4.抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大) - 重写,子类的方法和父类必要一致;方法体不同!
- 为什么需要重写:父类的功能,子类不一定需要,或者不一定满足!
多态
先看小栗子
- son继承了全部父类的方法
- 子类进行了重写,father和son对象的test方法就都按子类重写的方法了
- 父类不能调用子类独有的,除非强制转换
package learn;
public class Father {
public void test(){
System.out.println("Father");
}
}
package learn;
public class Son extends Father{
@Override
public void test() {
System.out.println("Son");
}
public void eat(){
System.out.println("Son eat");
}
}
package learn;
public class way {
public static void main(String[] args) {
Son son = new Son();
Father father=new Son();
Object object=new Son();
son.test();
father.test();
father.eat();
}
}
总结 多态注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系类型转换异常! CLasscastException !
- 存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new Son( );
不能重写的情况
- static方法,属于类,它不属于实例
- final常量;
- private方法;
instanceof和类型转换
instanceof
画继承走向,只能父转子
package learn;
public class Father {
public void test(){
System.out.println("Father");
}
}
package learn;
public class Son extends Father{
@Override
public void test() {
System.out.println("Son");
}
public void eat(){
System.out.println("Son eat");
}
}
package learn;
public class Application {
public static void main(String[] args) {
Object object=new Son();
System.out.println(object instanceof Son);
System.out.println(object instanceof daughter);
System.out.println(object instanceof Father);
System.out.println(object instanceof String);
System.out.println(object instanceof Object);
System.out.println("==========================================");
Father father=new Son();
System.out.println(father instanceof Son);
System.out.println(father instanceof daughter);
System.out.println("==========================================");
Son son=new Son();
}
}
类型转换
Static详解(必看)
static跟类一起加载
属性
方法
代码块
package learn;
public class Application {
{
System.out.println("匿名代码块");
}
static {
System.out.println("静态代码块");
}
public Application() {
System.out.println("无参构造器");
}
public static void main(String[] args) {
Application application=new Application();
}
}
总结
- 静态代码块(static)跟类一起,只执行一次
- 匿名代码块同创建的对象一起执行
- 代码块比构造器优先级高
静态导入
抽象类
接口
=抽象MAx——只写需要进行的操作就行了
package learn;
public interface MyAction {
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package learn;
public interface YourAction {
void eat();
}
去实现多个接口
package learn;
public class MyActionImpl implements MyAction,YourAction{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void eat() {
}
}
N种内部类
局部内部类/内部类
package learn;
public class Outer {
private int id=10;
public void out(){
System.out.println("这是外部类的方法");
class Inner3{
public void in(){
System.out.println("这是内部类的方法3");
}
}
}
public class Inner1{
public void in(){
System.out.println("这是内部类的方法1");
}
public void getId() {
System.out.println(id);
}
public void getout() {
out();
}
}
}
class Inner2{
public void in(){
System.out.println("这是内部类的方法2");
}
}
package learn;
public class Application {
public static void main(String[] args) {
Outer outer= new Outer();
outer.out();
Outer.Inner1 inner1=outer.new Inner1();
inner1.getId();
inner1.in();
inner1.getout();
}
}
匿名内部类
package learn;
public class Application {
public static void main(String[] args) {
new Apple().eat();
new UserService() {
@Override
public void add() {
}
};
}
}
class Apple {
public void eat() {
System.out.println("1");
}
}
interface UserService {
void add();
}
异常机制
常见异常
捕获和抛出异常
小技巧,Ctrl+alt+T,生成环绕代码块 Ctrl+D,直接复制当前光标所在行 当去捕获和处理异常后,代码可以继续运行,区别于不加,代码直接终止
package learn;
public class test {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println(a / b);
} catch (Exception e) {
System.out.println("Exception");
} catch (Error e) {
System.out.println("Error");
} catch (Throwable e) {
System.out.println("Throwable");
} finally {
System.out.println("finally");
}
try {
new test().a();
} catch (Exception e) {
System.out.println("Exception");
} catch (Error e) {
System.out.println("Error");
} catch (Throwable e) {
System.out.println("Throwable");
} finally {
System.out.println("finally");
}
}
public void a() {
b();
}
public void b() {
a();
}
}
主动去抛出
自定义异常,用于处理问题的的解决方法
package learn;
public class MyException extends Exception{
private int detail;
public MyException(int detail) {
this.detail = detail;
}
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
package learn;
public class test {
public static void test(int a) throws MyException {
System.out.println("传递的参数为"+a);
if (a>10){
throw new MyException(a);
}
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println("MyException=>"+e);
e.printStackTrace();
}
}
}
思维导图
|