做公司网站一般多少钱百度下载并安装最新版
- 继承:面相对象编程中的核心概念,子类可以使用父类的属性和方法,无需重新编写,子类还可以添加新的属性和方法来提供特定的实现
- 多态:同一件事,发生在不同的对象上,会产生不同的结果,传递不同的对象会调用对应类中的方法
- 重载(Overload),同一个类中多个同名的方法,参数列表不同,提高代码复用性
- 重写(Override),是继承中的一个概念,子类可以重写父类的方法,以后默认情况调用该方法都会执行子类的重写版本,如果还想执行父类版本的方法,可以在重写的方法里加上super.方法()
多态实现的必要条件:
-
继承:多态性发生在有继承关系的类之间。子类继承自父类,能够继承父类的属性和方法。
-
方法重写:子类需要重写父类中的方法(对于
private
和static
方法不适用多态,因为它们不受继承影响)。这样,当通过父类引用调用该方法时,可以执行到子类中的实现。 -
父类引用指向子类对象:(Animal myDog = new Dog);在程序中,需要有父类类型的引用变量指向子类对象。这是实现多态的关键,因为它允许我们以统一的接口(即父类接口)来操作不同的子类对象。
实现多态的三个方法
通过继承实现多态
// 父类
class Animal {void eat() {System.out.println("This animal eats food.");}
}// 子类 Dog
class Dog extends Animal {@Overridevoid eat() {System.out.println("Dog eats meat.");}
}// 测试类
public class TestInheritancePolymorphism {public static void main(String[] args) {Animal myDog = new Dog(); // 父类引用指向子类对象myDog.eat(); // 输出: Dog eats meat.}
}
通过接口实现多态(Override)
// 接口
interface Speakable {void speak();
}// 实现接口的类 Dog
class Dog implements Speakable {@Overridepublic void speak() {System.out.println("Woof!");}
}// 测试类
public class TestInterfacePolymorphism {public static void main(String[] args) {Speakable myDog = new Dog(); // 接口引用指向实现类对象myDog.speak(); // 输出: Woof!}
}
使用抽象类实现多态(虽然抽象类本身不直接实现多态,但它与继承一起使用时可以)
// 抽象类
abstract class Vehicle {abstract void move();
}// 继承自抽象类的子类 Car
class Car extends Vehicle {@Overridevoid move() {System.out.println("Car is moving on wheels.");}
}// 测试类
public class TestAbstractClassPolymorphism {public static void main(String[] args) {Vehicle myCar = new Car(); // 抽象类引用指向子类对象myCar.move(); // 输出: Car is moving on wheels.}
}
输入一个URL的过程
输入一个URL到浏览器并按下回车键后,浏览器会执行一系列的操作来加载和显示网页,这个过程大致可以分为以下几个步骤:
解析URL:浏览器首先会对输入的URL进行解析,以确定协议(如HTTP、HTTPS)、主机名(域名)、端口号(默认为80或443)和路径等。
DNS查询:如果URL中的主机名是域名,浏览器会向DNS服务器发送请求,将域名解析为IP地址。
建立TCP连接:浏览器通过解析得到的IP地址和端口号,与服务器建立TCP连接。如果是HTTPS,则还会在TCP连接的基础上建立SSL/TLS安全连接。
发送HTTP请求:浏览器向服务器发送HTTP请求,请求中包含了请求方法(如GET、POST)、URL、协议版本、请求头等信息。
服务器处理请求:服务器接收到请求后,会根据请求的内容进行相应的处理,如读取文件、执行数据库查询等。
服务器返回响应:服务器处理完请求后,会向浏览器返回HTTP响应,响应中包含了状态码、响应头、响应体(即网页的内容)等信息。
浏览器渲染网页:浏览器接收到响应后,会解析响应体中的HTML、CSS、JavaScript等内容,并渲染出网页的视觉效果。
连接关闭:浏览器和服务器之间的TCP连接在完成数据传输后会被关闭。如果是HTTP/1.1协议,可能会使用持久连接(Keep-Alive)来复用连接。
死锁产生的原理和条件
死锁产生的原理主要涉及到多个进程或线程在执行过程中,因争夺资源而陷入的一种相互等待的状态,其中每个进程或线程都在等待对方释放资源以继续执行,但因为没有外力的干预,它们都无法继续推进,从而形成了死锁。
死锁产生的条件,也被称为死锁的四个必要条件,包括:
互斥条件(Mutual Exclusion):资源至少被一个进程或线程所占用,且该资源在一段时间内只能被一个进程或线程占用。即,资源是互斥的,不能被多个进程或线程同时访问。
请求与保持条件(Hold and Wait):进程或线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程或线程占用。此时,请求的进程或线程被阻塞,但它对已获得的资源保持不放。
不剥夺条件(No Preemption):进程或线程已获得的资源,在未使用完之前,不能被其他进程或线程强行剥夺。即,资源只能由持有它的进程或线程自愿释放。
循环等待条件(Circular Wait):系统中若干进程或线程之间形成了一种头尾相接的循环等待资源的关系。每个进程或线程都在等待链中下一个进程或线程所占有的资源。
当这四个条件同时满足时,就可能发生死锁。为了避免死锁的发生,可以采取一些预防措施,如破坏死锁的四个必要条件中的至少一个,或者在检测到死锁后采取恢复措施,如撤销一些进程或线程,以解除死锁状态
进程是资源调度的独立单元:(很多app在后台,互不影响),它确保了每个程序都有自己独立的资源集合;
线程则是资源调度的基本单位:(其中一个浏览器里的一个标签页,共享浏览器的内存空间),它使得程序能够高效地并发执行多个任务。
进程和线程的定义及区别
- 进程:是程序运行的实例,拥有独立的资源空间,是系统资源分配和调度的基本单位。
- 线程:是进程内的实体,共享进程资源,是CPU调度的基本单位,负责进程中的具体执行流。
区别:
- 进程是包含线程的,每个进程里最少有一个线程
- 进程和进程之间不共享内存空间,同一个进程里的线程共享同一个内存空间
- 进程是系统分配资源的最小单位,进程是系统调度的最小单位
进程通信的几种方式
在操作系统中,进程之间需要进行通信以实现协作和数据共享。以下是几种常见的进程通信方式:
1)管道(Pipe):管道是一种半双工的通信方式,它可以在两个进程之间传递数据。管道的特点是数据只能单向流动,而且通常只用于具有亲缘关系的进程之间进行通信,例如父子进程之间。
2)命名管道(Named Pipe):命名管道与管道类似,但是它可以在不具有亲缘关系的进程之间进行通信。与管道不同的是,命名管道具有一个唯一的名称,可以在文件系统中进行访问。
3)信号(Signal):信号是一种异步通信方式,它允许一个进程向另一个进程发送一个信号。信号通常用于处理异步事件,例如键盘中断、终端关闭等。
4)共享内存(Shared Memory):共享内存是一种高效的进程通信方式,它允许多个进程访问同一块物理内存,从而实现数据共享。共享内存的优点是速度快,但是需要处理并发访问和同步问题。
5)信号量(Semaphore):信号量是一种进程间同步和互斥的机制,它可以用于控制进程对共享资源的访问。信号量通常用于进程之间的同步和互斥,例如保护共享内存中的数据。
6)消息队列(Message Queue):消息队列是一种进程间通信方式,它允许进程之间传递消息。消息队列通常用于进程之间传递结构化的数据,例如进程之间传递命令和数据等。
7)套接字(Socket):套接字是一种进程间通信方式,它可以在不同的计算机之间进行通信。套接字通常用于实现分布式系统和网络通信。