0%

注:以下文稿写于2020年,虽未完整,为了不卡杂记的序号,还是发出来了。
日后会在这里添加更多内容,也可能另起一篇拾遗(

这一篇是真正的“杂”记。这段时间在刷LeetCode的同时,阅览了一些Java中常见的问题,鉴于Java与C#的殊途同归,也有了些收获。

为查漏补缺,将之前理解还不够明了的部分记在这里,主要是涉及OOP思想的一些概念。

关于多态

面向对象设计有四大特征:

  • 抽象:通过类和接口的属性与方法实现
  • 继承:通过类和接口的继承实现
  • 封装:通过访问控制符实现
  • 多态:???

多态这个概念比较神秘。以前看到一个解释是这么说的:

继承是子类引用父类方法;多态是父类引用子类方法。

当时看了觉得有点奇怪,父类怎么能引用子类方法呢?现在我的理解是如下:

子类对象继承了父类方法,但是可能又对继承过来的父类方法进行了重写覆盖。而一切出现父类的地方都可以用其子类向上转型进行替换(里氏替换原则),调用方法时调用的会是在子类里被重写的子类方法。继承、重写和向上转型,这是实现多态的三要素。

这样,如果一个父类有多个子类,它们又分别用不同方式重写了继承下来的同一个方法,那么在把这些子类都当父类使用时,就会展现出多态性:明明是对同一个类的对象调用了同一个方法,但行为却完全不同。

举个例子,假如有个扬声器类,包含一个大叫()方法,调用时会“嘤嘤嘤”;而继承自它的有大叫“洒↓比↑”的喇叭类和大叫“哼,哼,啊啊啊啊啊啊啊”的野兽先辈类:

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
//这段代码甚至真的可以跑,C#支持用汉字做标识符,大概是因为用了Unicode
using System;
using System.Collections.Generic;

namespace PlayGround
{
class 扬声器
{
public virtual void 大叫() => Console.WriteLine("嘤嘤嘤");
}

class 喇叭 : 扬声器
{
public override void 大叫() => Console.WriteLine("洒↓比↑");
}

class 野兽先辈 : 扬声器
{
public override void 大叫() => Console.WriteLine("哼,哼,啊啊啊啊啊啊啊");
}

class 屑狐狸 : 扬声器
{
public override void 大叫() => Console.WriteLine("呜呜呜呜,好可怜啊");
}

class Program
{
static void Main(string[] args)
{
var 一堆扬声器 = new List<扬声器>() { new 扬声器(), new 喇叭(), new 野兽先辈(), new 屑狐狸() };

foreach (var 某个扬声器 in 一堆扬声器)
{
某个扬声器.大叫();
// 输出:
// 嘤嘤嘤
// 洒↓比↑
// 哼,哼,啊啊啊啊啊啊啊
// 呜呜呜呜,好可怜啊
}
}
}
}
阅读全文 »

以下所介绍的部分命令,在设备上是由适合嵌入式 Linux 的工具集 BusyBox 提供,行为和 Linux 桌面发行版上不完全一致,这里均采用 BusyBox 所提供的指令用法。

ifconfig:查看接口状态

ifconfig 可设置网卡接口的状态,或是显示目前的设置。以下是一些主要的设置参数。

语法格式:ifconfig < -a > [网卡名称] <参数>

参数 作用
add <地址> 设置网卡的IPv6地址。
del <地址> 删除网卡的IPv6地址。
up 启动指定的网卡。
down 关闭指定的网卡。
metric <数目> 指定在计算数据包的转送次数时,所要加上的数目。
mtu <字节> 设置网卡的MTU(最大数据包大小)。
netmask <子网掩码> 设置网卡的子网掩码。
-broadcast <地址> 将要送往指定地址的数据包当成广播数据包来处理。
[IP地址] 指定网卡的IP地址。

直接输入 ifconfig 就会列出目前已激活的网卡,不论这个卡是否有给予 IP ,都会被显示出来。带接口的 ifconfig eth0 则仅会表示接口 eth0 的相关数据,无论其是否启动。使用 -a 选项,则会展示所有网卡的属性。

示例

1
2
3
4
5
6
7
8
$ ifconfig ra8
ra8 Link encap:Ethernet HWaddr 02:A1:BB:01:23:48
inet6 addr: fe80::a1:bbff:fe01:2348/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:130 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13971 (13.6 KiB) TX bytes:7767 (7.5 KiB)
阅读全文 »

定位linux内存异常问题思路

内存访问异常

  • 空指针访问:常见,易解决
  • “踩内存”:对不属于你的内存进行读写,难点在于踩内存发生的时间与程序崩溃的时间没有任何关系

被踩内存/踩内存的关系分类

  1. 越界踩内存
    定义或申请的内存小了
  2. 使用已释放的内存
    释放掉的内存又被使用
  3. 随机踩内存(最难排查)
    踩坏的位置与使用的内存没有直接关系,每次崩溃的情况可能都不一样

被踩坏内存的位置分类

  1. 堆踩坏
    malloc/new/kmalloc/vmalloc申请的内存
  2. 栈踩坏
  3. 全局变量踩坏

被踩坏内存的内容分类

  1. 字符串
  2. 指针
  3. 随机值
阅读全文 »

WLAN历史

WLAN是Wireless Local Area Network(无线局域网)的缩写,实际上就是要在不采用网线的情况下,提供以太网的互联功能。

我们更常见到的词是Wi-Fi(Wireless Fidelity, 无线保真),但其实Wi-Fi是实现WLAN的技术之一,它遵循IEEE 802.11标准。实现WLAN的技术还可以是IrDA红外,Bluetooth蓝牙,HomeRF,乃至于GSM和LTE等,但Wi-Fi具有巨大的优势,以至于现在说到WLAN,基本就等于Wi-Fi。

Wi-Fi同时作为一个商标,被WiFi联盟WFA持有,新产品要通过Wi-Fi联盟的测试和认证后,才被允许使用“Wi-Fi”logo。这实际上是为了保证产品之间的兼容性。

Wi-Fi技术伴随着802.11标准演进。这一过程带来了更多的子载波、更高的调制方式、更高的编码率、更短的GI、更宽的带宽、还有MAC层的报文聚合等等。当然,它们的共同目的都是不断提升无线网络的吞吐量,降低时延。

历代Wi-Fi

阅读全文 »