main函数

为什么 main 方法是 public static void?

荒凉一梦 提交于 2020-02-29 02:44:20
0、 引言: 之前在校招时,旁边的面试官问过这样一个问题:如何不在 main 函数里打印出一行字符串呢(也不允许在main里调用函数)? 如果你不能回答上来没关系,看了本文你就会有了答案。其实 main 函数我们每天 coding 都会接触,但是不一定每个同学都了解或注意到它为什么要这么设计,为什么不能那么写? 言归正传,Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public、static、void 的?当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么main方式是public、static、void,这篇文章尝试去找到一些答案。 Main方法是Java程序的入口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。 Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数: public static void main(String

Java学习笔记(十三)面向对象---异常

一曲冷凌霜 提交于 2020-02-28 22:50:10
概述 对异常的理解 程序在运行过程中出现不正常情况。是对问题的描述,将问题进行对象的封装。 异常的由来 问题也是现实生活中一个具体的事物,也可以通过Java的类的形式进行描述,并封装成对象。 对于问题的划分 一种是严重的问题,一种是非严重的问题。 对于严重的:Java通过Error类进行描述。 对于Error一般不编写针对性的代码对其进行处理。 对于非严重的:Java通过Exception类进行描述。 对于Exception可以使用针对性的处理方式进行处理。 无论Error还是Exception都具有一些共性内容。 比如:不正常情况的信息,引发原因。 异常体系 Throwable |--Error |--Exception |--RuntimeException 异常体系的特点: 异常体系中的所有类以及被建立的对象都具备可抛性。 异常的处理 代码语句格式 try { 需要被检测的代码 } catch(异常类 变量) { 处理异常的代码(处理方式) } finally { 一定会执行的语句; } 对异常的常见操作方法 String getMessage(); String toString(); void printStackTrace(); class Demo { int div(int x,int y) { return x/y; } } public class

BP算法

时光总嘲笑我的痴心妄想 提交于 2020-02-28 17:40:56
# define _CRT_SECURE_NO_WARNINGS # include "string.h" # include "stdio.h" /*BP算法的实现 *@auther:ck */ /*函数声明*/ int Index ( char * Buffer , char * buffer , int pos , int Count ) ; int Strlen ( char * Buffer ) ; /*main*/ void main ( void ) { int index ; int count ; char Buffer [ 20 ] = "acfgyhgtuoitmn" ; char buffer [ 6 ] = "tuoit" ; count = Strlen ( buffer ) ; index = Index ( Buffer , buffer , 2 , count ) ; for ( int i = 0 ; i < count ; i ++ ) { printf ( "%c" , Buffer [ index ++ ] ) ; } printf ( "\n" ) ; system ( "pause" ) ; } /* *@param:pos:need found position *@return:if found return position

Java 多线程核心知识点整理

时光总嘲笑我的痴心妄想 提交于 2020-02-28 17:06:33
开篇 本文内容是综合各种资料( 博客+视频+书籍 )整理而来。具体链接没有记录,望见谅! 正文 在学习多线程知识时,除了线程定义及使用方法之外,我们经常会了解到以下概念: 进程与线程 时间片 CPU 执行权 上线文切换 并发 和 并行 守护线程 等等 如果没有计算机基础,上面很多概念一时半会儿无法理解的。下面就针对这些知识点来一一说明下。 进程与线程的关系 举个例子,当我们启动 Java 中的 main 函数时,就等于启动了一个 JVM 进程,而 main 函数所在的线程就是 JVM 进程中一个线程(我们经常称之为主线程)。 public class App { public static void main( String[] args ){ while (true){ // doSomething } } } # jstack 打印出的堆栈信息 "main" #1 prio=5 os_prio=31 tid=0x00007ff38c801800 nid=0x2503 runnable [0x00007000076f6000] java.lang.Thread.State: RUNNABLE at com.nimo.App.main(App.java:9) 当我们在 main 函数中,再次启动一个线程时: public class App { public static void

模块和包

巧了我就是萌 提交于 2020-02-28 10:32:56
导入模块 总结: import import 模块名 import 模块名 as 别名 import 模块名1,模块名2,模块名3...(不建议) from ... import from 模块名 import 模块文件里具体的功能名字 from 模块名 import 模块文件里具体的功能名字 as 别名 from 模块名 import * (不建议) #以下两种仅仅针对*号做设置 1> 在模块文件里的功能名字前加_下划线 那么*里就不包含此功能 仅仅针对这里的* 2>在模块文件里设置 __all__['功能名1',“功能名2”...] 仅仅设置的包含在*号里,并不是所有 举例说明: ##重点: 源文件和现文件的名称空间 模块文件 spam.py #spam.py print('from the spam.py') money=1000 def read1(): print('spam->read1->money',money) def read2(): print('spam->read2 calling read') read1() def change(): global money money=0 #import导入 import spam print(spam.money) print(spam.read1()) #调用的时候 需要加模块名作为前缀 #from ...

Python(线程进程2)

纵饮孤独 提交于 2020-02-28 07:13:22
新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:   1. 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)   2. 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。 关于创建的子进程,UNIX和windows   1.相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。   2.不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。 二 threading模块 ''' 进程包括多个线程,线程之间切换的开销远小于进程之间切换的开销 线程一定是寄托于进程而存在的 进程:最小的资源管理单元 线程:最小的执行单元 python锁的机制,一个进程一把锁,一个进程一个时间只能取出一个线程,所以无法实现真正的进程中的线程并行 I/O密集型任务 计算密集型任务 ''' 2.1 线程对象的创建 2

Go Web:处理请求

丶灬走出姿态 提交于 2020-02-28 07:00:59
处理请求 Request和Response http Requset和Response的内容包括以下几项: Request or response line Zero or more headers An empty line, followed by … … an optional message body 例如一个http Request: GET /Protocols/rfc2616/rfc2616.html HTTP/1.1 Host: www.w3.org User-Agent: Mozilla/5.0 (empty line) 如果是POST方法,在empty line后还包含请求体。 一个http Response: HTTP/1.1 200 OK Content-type: text/html Content-length: 24204 (empty line) and then 24,204 bytes of HTML code go http包分为两种角色:http Client和http Server。http Client可以发送请求,比如写爬虫程序时语言扮演的角色就是http Client;http Server用来提供web服务,可以处理http请求并响应。 对于Request,作为http客户端(如编写爬虫类工具)常需要关注的是URL和User

学点 C 语言(34): 函数 - 关于变量(auto、static、register、extern、volatile、restrict)

妖精的绣舞 提交于 2020-02-28 06:16:43
1. 局部变量: 局部变量也叫自动变量, 它声明在函数开始, 生存于栈, 它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是 auto; 因可以省略, 几乎没人使用 */ printf("%d\n", i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外, 一般应在函数前; 每个函数都可以使用它, 不过全局变量应尽量少用. #include <stdio.h> void add(void); void mul(void); int gi = 3; /* 全局变量 */ int main(void) { printf("%d\n", gi); /* 3 */ add(); printf("%d\n", gi); /* 5 */ mul(); printf("%d\n", gi); /* 10 */ getchar(); return 0; } void add(void) { gi += 2; } void mul(void) { gi *= 2; } 全局变量会被初始化为空, 而局部变量在没有赋值前是一个垃圾值: #include <stdio.h> int gi; /* 全局变量 */ int main(void) { int

Java synchronized 关键字详解

旧巷老猫 提交于 2020-02-28 02:16:38
Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 synchronized public void sync(){ } 修饰静态成员方法 synchronized public static void sync(){ } 类锁代码块 synchronized (类.class){ } 对象锁代码块 synchronized (this|对象){ } synchronized 修饰非静态方法时可以看做是锁 this 对象,修饰静态方法时可以看做是锁方法所在的类。 synchronized 关键字的根本机制 各个线程想要访问被 synchronized 修饰的代码块,就要取得 synchronized 声明的锁。如果两个线程的目标是同一个锁,就会出现阻塞的现象,所以两个线程不能同时访问同一个锁下的代码,保证了多线程在执行时最终结果不会出错。这与共享变量是否为静态无关。 几个例子 对象锁 public class ThreadDemo extends Thread { @Override public synchronized void run() { for (int i = 0; i < 10000; i++) { Main.i++; }

java学习记录---CAS乐观锁

最后都变了- 提交于 2020-02-27 22:48:52
CAS,全称 Compare And Swap (比较与交换),是一种乐观锁,同样是锁相比 synchronized 性能却要高不少,因为是 synchronized 阻塞的,而CAS是非阻塞的。CAS主要有3个操作数,内存值V,预期的旧值A,需要修改的新值B,可以这样理解:在V的地址把A改成B,当V位置的值与预期的旧值A相同时候,则修改成B,否则不更新。 下面看个图简单理解一下CAS:当线程1和线程2同时操作内存V,线程1想要把内存V的变量值从A(2)改成B(1)而线程2想要把V的变量值从A(2)改成B(3)。假设这个时候是线程1优先抢到资源所以线程1先进行CAS操作,这个时候预期旧值2是相等的则执行了更新,更新完后内存V的变量值就变成1,这个时候线程2才进入比较预期的A值与V中实际的变量值已经不相同了,所以更新失败。 这个图看上去是 Compare And Swap 是同时操作,但实际上是分2部执行:1.比较(compare),2.交换(swap),它的原子性是通过硬件实现的,而不是我们java代码实现 java提供的CAS操作类 我们随便找其中一个Atomic类学习 当V的值与A相等则更新成功 public static void main(String[] args) { // 定义 Integer 的 CAS 类 AtomicInteger AI = new