2.判断A(1,4),B(-=2,3),C(4,5),M(4,3)四点是否在同一圆上?

对 Java 平台的理解主要包括以下三个方面:面向对象和核心类库方面,跨平台方面和虚拟机和垃圾收集

面向对象和核心类库方面

  • Java 是一门面向对象编程语言,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
  • Java 核心类库提供了包含集合容器、线程相关类、IO/NIO、J.U.C 并发包,异常和安全等类库,极大地方便了程序员的开发;
  • JDK 提供的工具包含:基本的编译工具、虚拟机性能检测相关工具等。

所谓的 “一次编写,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力。跟 c/c++ 最大的不同点在于,c/c++ 编程是面向操作系统的,需要开发者极大地关心不同操作系统之间的差异性;而 Java 平台通过虚拟机屏蔽了操作系统的底层细节,使得开发者无需过多地关心不同操作系统之间的差异性。

通过增加一个间接的中间层来进行”解耦 “是计算机领域非常常用的一种” 艺术手法“,虚拟机是这样,操作系统是这样;

另外就是Java 虚拟机和垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。

同时,围绕虚拟机的效率问题展开,将涉及到一些优化技术,例如:JIT、AOT。因为如果虚拟机加载字节码后,一行一行地解释执行,这势必会影响执行效率。所以,对于这个运行环节,虚拟机会进行一些优化处理,例如 JIT 技术,会将热点代码编译成机器码。而 AOT 技术,是在运行前,通过工具直接将字节码转换为机器码。

对于 “Java 是解释执行” 这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

    Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

Java Virtual Machine 是 Java 虚拟机,Java 程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此 Java 语言可以实现跨平台。

Java Runtime Environment 包括 Java 虚拟机和 Java 程序所需的核心类库等。核心类库主要是 java.lang 包:包含了运行 Java 程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

什么是跨平台性?原理是什么

所谓跨平台性,是指 java 语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java 程序是通过 java 虚拟机在系统平台上运行的,只要该系统可以安装相应的 java 虚拟机,该系统就可以运行 java 程序。

Java 语言有哪些特点

简单易学(Java 语言的语法与 C 语言和 C++ 语言很接近)

面向对象(封装,继承,多态)

平台无关性(Java 虚拟机实现平台无关性)

支持网络编程并且很方便(Java 语言诞生本身就是为简化网络编程设计的)

支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

健壮性(Java 语言的强类型机制、异常处理、垃圾的自动收集等)

字节码:Java 源代码经过虚拟机编译器编译后产生的文件(即扩展为. class 的文件),它不面向任何特定的处理器,只面向虚拟机。

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同的计算机上运行。

先看下 java 中的编译器和解释器

Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节码(即扩展为. class 的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java 源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的 Java 的特点的编译与解释并存的解释。

我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 比呀!没办法!!!就算没学过 C++,也要记下来!

  • 都是面向对象的语言,都支持封装、继承和多态
  • Java 不提供指针来直接访问内存,程序内存更加安全
  • Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  • Java 有自动内存管理机制,不需要程序员手动释放无用内存

Java 有哪些数据类型

定义:Java 语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

用最有效率的方法计算 2 乘以 8

当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f

不正确(会报编译错误)。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f =(float)3.4; 或者写成 float f =3.4F;。

Java 语言采用何种编码方案?有何特点?

Java 语言采用 Unicode 编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

定义:用于解释说明程序的文字

    格式: // 注释文字

在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。

注意事项:多行和文档注释都不能嵌套使用。

定义:Java 中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public : 对所有类可见。使用对象:类、接口、变量、方法

& 运算符有两种用法:(1) 按位与;(2) 逻辑与。

&& 运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true。&& 之所以称为短路运算,是因为如果 && 左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。

用于修饰类、属性和方法;

  • 被 final 修饰的类不可以被继承
  • 被 final 修饰的方法不可以被重写
  • 被 final 修饰的变量不可以被改变,被 final 修饰不可变的是变量的引用而不是引用指向的内容引用指向的内容是可以改变的

  • final 可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表
    示该变量是一个常量不能被重新赋值。
  • finally 一般作用在 try-catch 代码块中,在处理异常的时候,通常我们将一定要执行的代码方法 finally 代码块
    中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize 是一个方法,属于 Object 类的一个方法,而 Object 类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用 System.gc() 方法的时候,由垃圾回收器调用 finalize(),回收垃圾,一个对象是否可回收的最后判断。

this 关键字的用法

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针

  1. 普通的直接引用,this 相当于是指向当前对象本身。

  2. 形参与成员名字重名,用 this 来区分:

super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super 也有三种用法:

与 this 类似,super 相当于是指向当前对象的父类的引用,这样就可以用 来引用父类的成员。

  1. 子类中的成员变量或方法与父类中的成员变量或方法同名时,用 super 进行区分
  • super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
  • this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

  • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super. 变量名 super. 成员函数据名(实参)
  • this:它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)
  • super() 和 this() 类似, 区别是,super() 在子类中调用父类的构造方法,this() 在本类内调用本类的其它构造方法。
  • 尽管可以用 this 调用一个构造器,但却不能调用两个。
  • this 和 super 不能同时出现在一个构造函数里面,因为 this 必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  • 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个** Java 关键字**。

static 的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法

static 关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static 块可以置于类中的任何地方,类中可以有多个 static 块。在类初次被加载的时候,会按照 static 块的顺序来执行每个 static 块,并且只会执行一次。

为什么说 static 块可以用来优化程序性能,是因为它的特性: 只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在 static 代码块中进行。

1、被 static 修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享

怎么理解 “被类的实例对象所共享” 这句话呢?就是说,一个类的静态成员,它是属于大伙的【大伙指的是这个类的多个对象实例,我们都知道一个类可以创建多个实例!】,所有的类对象共享的,不像成员变量是自个的【自个指的是这个类的单个实例对象】… 我觉得我已经讲的很通俗了,你明白了咩?

2、在该类被第一次加载的时候,就会去加载被 static 修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

3、static 变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!

4、被 static 修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

因为 static 是被类的实例对象所共享,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量

因此比较常见的 static 应用场景有:

1、修饰成员变量 2、修饰成员方法 3、静态代码块 4、修饰类【只能修饰内部类也就是静态内部类】 5、静态导包

1、静态只能访问静态。 2、非静态既可以访问非静态的,也可以访问静态的。

break 跳出总上一层循环,不再执行循环 (结束当前的循环体)

continue 跳出本次循环,继续执行下次循环 (结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码 (结束当前的方法 直接返回)

在 Java 中,如何跳出当前的多重嵌套循环

在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句,即可跳出外层循环。例如:

面向对象和面向过程的区别

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源; 比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:性能比面向过程低

面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

面向对象的特征有哪些方面

面向对象的特征主要有以下几个方面

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

其中 Java 面向对象编程三大特性:封装 继承 多态

**封装: **隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

继承: 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码

关于继承如下 3 点请记住:

  1. 子类拥有父类非 private 的属性和方法。
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。(以后介绍)。

多态: 父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

Java 实现多态有三个必要条件:继承、重写、向上转型。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备调用父类和子类的方法的技能。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

面向对象五大基本原则是什么(可选)

    一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
  • 子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
  • 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的 xx 省,xx 市,xx 县。你要依赖的抽象是中国人,而不是你是 xx 村的。
  • 设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。

从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

  • 接口和抽象类都不能实例化
  • 都位于继承的顶端,用于被其他实现或继承
  • 都包含抽象方法,其子类都必须覆写这些抽象方法
抽象类使用 abstract关键字声明
子类使用 extends 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 子类使用 implements 关键字来实现接口。它需要提供接口中所有声明的方法的实现
抽象类可以有构造器、初始化块,构造器用于被其子类调用 由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义
抽象类中的方法可以是任意访问修饰符 修饰符可以是public或者省略,如果省略了public访问控制符,则默认采用包权限访问控制符
一个类最多只能继承一个抽象类 一个类可以实现多个接口
抽象类可以定义各种类型的成员变量 在接口中定义成员变量时,不管是否使用public static final修饰符,接口里的成员变量总是使用这三个修饰符来修饰。而且接口里没有构造器和初始化块,因此接口里定义的成员变量只能在定义时指定默认值。
可以包含普通方法,可以为普通方法提供实现 接口里定义的方法只能是抽象方法、类方法或默认方法,因此如果不是定义默认方法,系统将自动为普通方法增加abstract修饰符;定义接口里的普通方法时不管是否使用public abstract修饰符,接口里的普通方法总是使用public abstract来修饰。接口里的普通方法不能有方法实现(方法体);但类方法、默认方法都必须有方法实现(方法体),他们的默认用public修饰。

备注:Java8 中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。
现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

接口里定义的是多个类共同的公共行为规范,因此接口里的所有成员,包括常量、方法、内部类和内部枚举都是public访问权限。

接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

  • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
  • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。


普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

new 关键字,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球); 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)

成员变量与局部变量的区别有哪些

  • 成员变量:作用范围是整个类,相当于C中的全局变量,定义在方法体和语句块之外,一般定义在类的声明之下;成员变量包括实例变量和静态变量(类变量);
  • 实例变量:独立于与方法之外的变量,无static修饰,声明在一个类中,但在方法、构造方法和语句块之外,数值型变量默认值为0,布尔型默认值为false,引用类型默认值为null;
  • 静态变量(类变量):独立于方法之外的变量,用static修饰,默认值与实例变量相似,一个类中只有一份,属于对象共有,存储在静态存储区,经常被声明为常量,调用一般是类名.静态变量名,也可以用对象名.静态变量名调用;
  • 局部变量:类的方法中的变量,访问修饰符不能用于局部变量,声明在方法、构造方法或语句块中,在栈上分配,无默认值,必须初始化后才能使用;

成员变量和局部变量的区别

在方法或者语句块内有效
随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中 在方法被调用的时候存在,方法调用完会自动释放,存储在栈内存中
没有默认初始值,使用前必须赋值
就近原则,首先在局部位置找,有就使用;接着在成员位置找

Java所有数据类型的默认值对照表

Java 程序在执行子类的构造方法之前,如果没有用 super()来调用父类特定的构造方法,则会调用父类中 “没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

帮助子类做初始化工作。

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

没有返回值,但不能用 void 声明构造函数;

生成类的对象时自动执行,无需调用。

静态变量和实例变量区别

静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM 只为静态变量分配一次内存空间。

实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。

静态变量与普通变量区别

static 变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

还有一点就是 static 成员变量的初始化顺序按照定义的顺序进行初始化。

静态方法和实例方法有何不同?

静态方法和实例方法的区别主要体现在两个方面:

  1. 在外部调用静态方法时,可以使用 “类名. 方法名” 的方式,也可以使用 “对象名. 方法名” 的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用: 接收出结果,使得它可以用于其他的操作!

在 Java 中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。

内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类

定义在类内部的静态类,就是静态内部类。

静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;静态内部类的创建方式,new 外部类. 静态内部类 (),如下:

定义在类内部,成员位置上的非静态类,就是成员内部类。

成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例,它的创建方式外部类实例. new 内部类 (),如下:

定义在方法中的内部类,就是局部内部类。

定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new 内部类 (),如下:

匿名内部类就是没有名字的内部类,日常开发中使用的比较多。

除了没有名字,匿名内部类还有以下特点:

  • 匿名内部类必须继承一个抽象类或者实现一个接口。
  • 匿名内部类不能定义任何静态成员和静态方法。
  • 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

我们为什么要使用内部类呢?因为它有以下优点:

  • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
  • 内部类不为同一包的其他类所见,具有很好的封装性;
  • 内部类有效实现了 “多重继承”,优化 java 单继承的缺陷。
  • 匿名内部类可以很方便的定义回调。

  1. 解决一些非面向对象的语句块。
  2. 适当使用内部类,使得代码更加灵活和富有扩展性。
  3. 当某个类除了它的外部类,不再被其他的类使用时。

局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上 final 呢?它内部原理是什么呢?

以上例子,为什么要加 final 呢?是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非 final 的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了 final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。

内部类相关,看程序说出运行结果

构造器不能被继承,因此不能被重写,但可以被重载。

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为 private 则子类中就不是重写。

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过 “==” 比较这两个对象。

情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

  • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。

散列表存储的是键值对 (key-value),它的特点是:能根据“键” 快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

我们以 “HashSet 如何检查重复” 为例子来说明为什么要有 hashCode

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals() 方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的 Java 启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

如果两个对象相等,则 hashcode 一定也是相同的

两个对象相等,对两个对象分别调用 equals 方法都返回 true

两个对象有相同的 hashcode 值,它们也不一定是相等的

因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。

是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的

为什么 Java 中只有值传递

首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用 (call by value) 表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。  它用来描述各种程序设计语言(不只是 Java) 中方法参数传递方式。

Java 程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

下面通过 3 个例子来给大家说明

在 swap 方法中,a、b 的值进行交换,并不会影响到 num1、num2。因为,a、b 中的值,只是从 num1、num2 的复制过来的。也就是说,a、b 相当于 num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。

通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看 example2.

array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。

通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

很多程序设计语言(特别是,C++ 和 Pascal) 提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的作者)认为 Java 程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。

通过上面两张图可以很清晰的看出: 方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap 方法的参数 x 和 y 被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝

Java 程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

下面再总结一下 Java 中方法参数的使用情况:

  • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象。

值传递和引用传递有什么区别

值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。

引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

JDK 中常用的包有哪些

  • java.lang:这个是系统的基础类;
  • :这里面是所有输入输出有关的类,比如文件操作等;
  • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
  • :这里面是与网络有关的类;
  • java.util:这个是系统辅助类,特别是集合类;
  • java.sql:这个是数据库操作的类。

刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准 API 的一部分。

所以,实际上 java 和 javax 没有区别。这都是一个名字。

  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流。

Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

按操作方式分类结构图:

按操作对象分类结构图:

Files 的常用方法都有哪些?

JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

  • **静态编译:**在编译时确定类型,绑定对象
  • **动态编译:**运行时确定类型,绑定对象

  • 优点:  运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点:  性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。

  1. 反射调用过程中会产生大量的临时对象,这些对象会占用内存,可能会导致频繁 gc,从而影响性能。
  2. 反射调用方法时会从方法数组中遍历查找,并且检查可见性等操作会比较耗时。
  3. 反射在达到一定次数时,会动态编写字节码并加载到内存中,这个字节码没有经过编译器优化,也不能享受 JIT 优化。
  4. 反射一般会涉及自动装箱/拆箱和类型转换,都会带来一定的资源开销。

反射机制的应用场景有哪些?

反射是框架设计的灵魂。

在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

注解 的实现也用到了反射
为什么你使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?
这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理。

②Spring 框架也用到很多反射机制,最经典的就是 xml 的配置模式。

    2)Java 类里面解析 xml 或 properties 里面的内容,得到**对应实体类的字节码字符串以及相关的属性信息; **
  1. 使用反射机制,根据这个字符串获得某个类的 Class 实例;

Java 获取反射的三种方法

  1. 通过 new 对象实现反射机制 2. 通过路径实现反射机制 3. 通过类名实现反射机制

Annontation (注解) 是Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量。

注解在我的理解下,就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。

注解本质是一个继承了Annotation 的特殊接口:

– 定义该注解的生命周期

  • RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
  • RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

@Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。

注解只有被解析之后才会生效,常见的解析方法有两种:

  • 编译期直接扫描 :编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用@Override 注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。
  • 运行期通过反射处理 :像框架中自带的注解(比如 Spring 框架的 @Value 、@Component)都是通过反射来进行处理的。

JDK 提供了很多内置的注解(比如 @Override 、@Deprecated),同时,我们还可以自定义注解。

为什么你使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?
这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理
一般来说,我们自己定义的注解都是RUNTIME级别的,因为大多数情况我们是根据运行时环境去做一些处理。

Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java 的泛型是伪泛型,这是因为 Java 在运行期间,所有的泛型信息都会被擦掉,这也就是通常所说泛型擦除 。

在Java中的泛型简单来说就是:在创建对象或调用方法的时候才明确下具体的类型
使用泛型的好处就是代码更加简洁(不再需要强制转换),程序更加健壮(在编译期间没有警告,在运行期就不会出现ClassCastException异常)

//这里直接添加会报错 //但是通过反射添加是可以的 //这就说明在运行期间所有的泛型信息都会被擦掉

泛型一般有三种使用方式: 泛型类、泛型接口、泛型方法。

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型

实现泛型接口,不指定类型:

实现泛型接口,指定类型:

常用的通配符为: T,E,K,V,?

  • ? 表示不确定的 Java 类型

你的项目中哪里用到了泛型?

  • 可用于定义通用返回结果 CommonResult 通过参数 T 可根据具体的返回类型动态指定结果的数据类型

代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象 (real object) 的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。

代理模型有静态代理和动态代理。静态代理需要自己写代理类,实现对应的接口,比较麻烦。
在Java中,动态代理常见的又有两种实现方式:JDK动态代理和CGLIB代理。

JDK动态代理其实就是运用了反射的机制,而CGLIB代理则用的是利用ASM框架,通过修改其字节码生成子类来处理。JDK动态代理会帮我们实现接口的方法,通过invokeHandler对所需要的方法进行增强。

  • JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。  另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。
  • 就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显。

动态代理这一技术在实际或者框架原理中是非常常见的,像Mybatis不用写实现类,只写接口就可以执行SQL,又或是SpringAOP 等等好用的技术,实际上用的就是动态代理。

什么是序列化?什么是反序列化?

如果我们需要持久化Java对象比如将Java对象保存在文件中,或者在网络传输Java对象,这些场景都需要用到序列化。

  • 序列化: 将数据结构或对象转换成二进制字节流的过程
  • 反序列化:将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程

对于Java这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class),但是在C++这种半面向对象的语言中,struct(结构体)定义的是数据结构类型,而class 对应的是对象类型。

综上:序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。

  1. 对象在进行网络传输(比如远程方法调用RPC的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  2. 将对象存储到文件中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
  3. 将对象存储到缓存数据库(如 Redis)时需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。

对于不想进行序列化的变量,使用 transient 关键字修饰。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。

  • transient 只能修饰变量,不能修饰类和方法。
  • transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0。
  • static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化

Object 类的常见方法有哪些?

Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:

//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
//native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。
//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。
//返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方法。
//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
//native方法,并且不能重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁 。timeout是等待时间。
//多了nanos参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上nanos毫秒。
//跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
//实例被垃圾回收器回收的时候触发的操作

字符型常量和字符串常量的区别

  1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
  2. 含义上: 字符常量相当于一个整形值 (ASCII 值), 可以参加表达式运算 字符串常量代表一个地址值 (该字符串在内存中存放位置)
  3. 占内存大小 字符常量只占一个字节 字符串常量占若干个字节 (至少一个字符结束标志)

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

String 是最基本的数据类型吗

这是很基础的东西,但是很多初学者却容易忽视,Java 的 8 种基本数据类型中不包括 String,基本数据类型中用来描述文本数据的是 char,但是它只能表示单个字符,比如 ‘a’,‘好’ 之类的,如果要描述一段文本,就需要用多个 char 类型的变量,也就是一个 char 类型数组,比如 “你好” 就是长度为 2 的数组 char[] chars = {‘你’,‘好’};

但是使用数组过于麻烦,所以就有了 String,String 底层就是一个 char 类型的数组,只是使用的时候开发者不需要直接操作底层数组,用更加简便的方式即可完成对字符串的使用。

  • 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。
  • 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。

String 为什么是不可变的吗?

简单来说就是 String 类利用了 final 修饰的 char 类型数组存储字符,源码如下图所以:

String 真的是不可变的吗?

我觉得如果别人问这个问题的话,回答不可变就可以了。 下面只是给大家看两个有代表性的例子:

1) String 不可变但不代表引用不可以变

实际上,原来 String 的内容是不变的,只是 str 由原来指向 “Hello” 的内存地址转为指向 “Hello World” 的内存地址而已,也就是说多开辟了一块内存区域给 “Hello World” 字符串。

2) 通过反射是可以修改所谓的 “不可变” 对象

用反射可以访问私有成员, 然后反射出 String 对象中的 value 属性, 进而改变通过获得的 value 引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

不一样,因为内存的分配方式不一样。String str=“i” 的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

两个对象,一个是静态区的 “xyz”,一个是用 new 创建在堆上的对象。

String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • length():返回字符串长度。

HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。

对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

如果要操作少量的数据用 = String

单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的元素符。

不过,在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象
StringBuilder 对象是在循环内部被创建的,这意味着每循环一次就会创建一个 StringBuilder 对象。
如果直接使用 StringBuilder 对象进行字符串拼接的话,就不会存在这个问题了

装箱:将基本类型用它们对应的引用类型包装起来;

拆箱:将包装类型转换为基本数据类型;

Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱 / 拆箱机制,使得二者可以相互转换。

Java 为每个原始类型提供了包装类型:

对于对象引用类型:== 比较的是对象的内存地址。
对于基本数据类型:== 比较的是值。

如果整型字面量的值在 - 128 到 127 之间,那么自动装箱时不会 new 新的 Integer 对象,而是直接引用常量池中的 Integer 对象,超过范围 a1==b1 的结果是 false

}

从小学到高中的所有数学公式  

1 每份数×份数=总数 总数÷每份数=份数 总数÷份数=每份数
2
1倍数×倍数=几倍数 几倍数÷1倍数=倍数 几倍数÷倍数= 3
速度×时间=路程 路程÷速度=时间 路程÷时间=速度
4
单价×数量=总价 总价÷单价=数量 总价÷数量=单价

5
工作效率×工作时间=工作总量 工作总量÷工作效率=工作时间
工作总量÷工作时间=工作效率
6
加数+加数=和 和-一个加数=另一个加数

7
被减数-减数=差 被减数-差=减数 差+减数=被减数

8
因数×因数=积 ÷一个因数=另一个因数

9
被除数÷除数=商 被除数÷商=除数 ×除数=被除数
小学数学图形计算公式 1、正方形:C周长 S面积 a边长 周长=边长×4C=4a 面积=边长×边长S=a×a
2
、正方体:V:体积 a:棱长 表面积=棱长×棱长×6
(1)
侧面积=底面周长×

(2)
表面积=侧面积+底面积
×2
(3)
体积=底面积×

(4)
体积=侧面积÷2×半径

10
、圆锥体:v体积 h s底面积 r底面半径 体积=底面积×
÷3 总数÷总份数=平均数 和差问题的公式
(
和-差)÷2=小数
和倍问题 ÷(倍数-1)=小数 (或者 和-小数=大数
) 差倍问题
÷(倍数-1)=小数
小数×倍数=大数
(
小数+差=大数
) 植树问题
1
、非封闭线路上的植树问题主要可分为以下三种情形
: ⑴如果在非封闭线路的两端都要植树,那么: 株数=段数+1=全长÷株距-1 全长=株距×(株数-1) 株距=全长÷(株数-1) ⑵如果在非封闭线路的一端要植树,另一端不要植树,那么: 株数=段数=全长÷株距 全长=株距×株数 株距=全长÷株数
⑶如果在非封闭线路的两端都不要植树,那么
: 株数=段数-1=全长÷株距-1 全长=株距×(株数+1) 株距=全长÷(株数+1)

、封闭线路上的植树问题的数量关系如下 株数=段数=全长÷株距 全长=株距×株数 株距=全长÷株数 盈亏问题
(
盈+亏两次分配量之差=参加分配的份数

(
大盈-小盈两次分配量之差=参加分配的份数

(
大亏-小亏两次分配量之差=参加分配的份数
相遇问题 相遇路程=速度和×相遇时间
相遇时间=相遇路程÷速度和
速度和=相遇路程÷相遇时间 追及问题
追及距离=速度差×追及时间
追及时间=追及距离÷速度差
速度差=追及距离÷追及时间
流水问题 顺流速度=静水速度+水流速度
逆流速度=静水速度-水流速度
静水速度=(顺流速度+逆流速度)÷2 水流速度=(顺流速度-逆流速度)÷2 浓度问题 溶质的重量+溶剂的重量=溶液的重量
溶质的重量÷溶液的重量×100%=浓度
溶液的重量×浓度=溶质的重量 溶质的重量÷浓度=溶液的重量 利润与折扣问题 利润=售出价-成本
利润率=利润÷成本×100%(售出价÷成本-
1)×100% 涨跌金额=本金×涨跌百分比
折扣=实际售价÷原售价×100%(折扣<
1) 利息=本金×利率×时间
税后利息=本金×利率×时间×(1
20%) 长度单位换算
1
厘米=10毫米
面积单位换算
1
平方千米=100公顷

1
平方米=100平方分米

1
平方分米=100平方厘米

1
平方厘米=100平方毫米
()积单位换算
1
立方米=1000立方分米

1
立方分米=1000立方厘米

1
立方米=1000
重量单位换算
1
千克=1公斤
人民币单位换算
1
=100
时间单位换算
平年全年365, 闰年全年366

1
=60 1小时=3600
小学数学几何形体周长 面积 体积计算公式 2
、正方形的周长=边长
×4 C=4a
3
、长方形的面积=×
S=ab
6
、平行四边形的面积=×
S=ah
7
、梯形的面积=(上底+下底)×÷2 9、圆的周长=圆周率×直径=圆周率×半径
×2 c=πd =2πr
10
、圆的面积=圆周率×半径×半径
常见的初中数学公式 过两点有且只有一条直线
3
同角或等角的补角相等

4
同角或等角的余角相等

5
过一点有且只有一条直线和已知直线垂直

6
直线外一点与直线上各点连接的所有线段中,垂线段最短

7
平行公理 经过直线外一点,有且只有一条直线与这条直线平行

8
如果两条直线都和第三条直线平行,这两条直线也互相平行

9
同位角相等,两直线平行

10
内错角相等,两直线平行

11
同旁内角互补,两直线平行

12
两直线平行,同位角相等

13
两直线平行,内错角相等

14
两直线平行,同旁内角互补

15
定理 三角形两边的和大于第三边

16
推论 三角形两边的差小于第三边

17
三角形内角和定理 三角形三个内角的和等于
180°
18
推论1 直角三角形的两个锐角互余

19
推论2 三角形的一个外角等于和它不相邻的两个内角的和

20
推论3 三角形的一个外角大于任何一个和它不相邻的内角

21
全等三角形的对应边、对应角相等

22
边角边公理(SAS) 有两边和它们的夹角对应相等的两个三角形全等

23
角边角公理(ASA) 有两角和它们的夹边对应相等的两个三角形全等

24
推论(AAS) 有两角和其中一角的对边对应相等的两个三角形全等

25
边边边公理(SSS) 有三边对应相等的两个三角形全等

26
斜边、直角边公理(HL) 有斜边和一条直角边对应相等的两个直角三角形
全等
27
定理1 在角的平分线上的点到这个角的两边的距离相等

28
定理2 到一个角的两边的距离相同的点,在这个角的平分线上

29
角的平分线是到角的两边距离相等的所有点的集合

30
等腰三角形的性质定理 等腰三角形的两个底角相等 (即等边对等角)

31
推论1 等腰三角形顶角的平分线平分底边并且垂直于底边

32
等腰三角形的顶角平分线、底边上的中线和底边上的高互相重合

33
推论3 等边三角形的各角都相等,并且每一个角都等于
60°
34
等腰三角形的判定定理 如果一个三角形有两个角相等,那么这两个角
所对的边也相等(等角对等边)
35
推论1 三个角都相等的三角形是等边三角形

36
推论2 有一个角等于60°的等腰三角形是等边三角形

37
在直角三角形中,如果一个锐角等于30°那么它所对的直角边等于斜边的
一半
38
直角三角形斜边上的中线等于斜边上的一半

39
定理 线段垂直平分线上的点和这条线段两个端点的距离相等
40
逆定理 和一条线段两个端点距离相等的点,在这条线段的垂直平分线上

41
线段的垂直平分线可看作和线段两端点距离相等的所有点的集合

42
定理1 关于某条直线对称的两个图形是全等形
43
定理2 如果两个图形关于某直线对称,那么对称轴是对应点连线的垂直
平分线
44
定理3 两个图形关于某直线对称,如果它们的对应线段或延长线相交,
那么交点在对称轴上
45
逆定理 如果两个图形的对应点连线被同一条直线垂直平分,那么这两
个图形关于这条直线对称
直角三角形两直角边ab的平方和、等于斜边c的平方,
a^2+b^2=c^2
47
勾股定理的逆定理 如果三角形的三边长abc有关系a^2+b^2=c^2
那么这个三角形是直角三角形
48
定理 四边形的内角和等于
360°
49
四边形的外角和等于
360°
50
多边形内角和定理 n边形的内角的和等于(n-2
×180°
51
推论 任意多边的外角和等于
360°
52
平行四边形性质定理 1 平行四边形的对角相等

53
平行四边形性质定理 2 平行四边形的对边相等

54
推论 夹在两条平行线间的平行线段相等

55
平行四边形性质定理 3 平行四边形的对角线互相平分

56
平行四边形判定定理 1 两组对角分别相等的四边形是平行四边形

57
平行四边形判定定理 2 两组对边分别相等的四边形是平行四边形

58
平行四边形判定定理 3 对角线互相平分的四边形是平行四边形

59
平行四边形判定定理 4 一组对边平行相等的四边形是平行四边形

60
矩形性质定理 1 矩形的四个角都是直角

61
矩形性质定理 2 矩形的对角线相等

62
矩形判定定理 1 有三个角是直角的四边形是矩形

63
矩形判定定理 2 对角线相等的平行四边形是矩形

64
菱形性质定理 1 菱形的四条边都相等

65
菱形性质定理 2 菱形的对角线互相垂直,并且每一条对角线平分一组对角

66
菱形面积=对角线乘积的一半,即 S=a×b
÷2
67
菱形判定定理 1 四边都相等的四边形是菱形

68
菱形判定定理 2 对角线互相垂直的平行四边形是菱形

69
正方形性质定理 1 正方形的四个角都是直角,四条边都相等

70
正方形性质定理 2 正方形的两条对角线相等,并且互相垂直平分,每
条对角线平分一组对角
71
定理1 关于中心对称的两个图形是全等的

72
定理2 关于中心对称的两个图形,对称点连线都经过对称中心,并且被
对称中心平分
73
逆定理 如果两个图形的对应点连线都经过某一点,并且被这一点平分,
那么这两个图形关于这一点对称
74
等腰梯形性质定理 等腰梯形在同一底上的两个角相等

75
等腰梯形的两条对角线相等

76
等腰梯形判定定理 在同一底上的两个角相等的梯形是等腰梯形

77
对角线相等的梯形是等腰梯形

78
平行线等分线段定理 如果一组平行线在一条直线上截得的线段相等,
那么在其他直线上截得的线段也相等
79
推论 1 经过梯形一腰的中点与底平行的直线,必平分另一腰

80
推论 2 经过三角形一边的中点与另一边平行的直线,必平分第三边

81
三角形中位线定理 三角形的中位线平行于第三边,并且等于它的一半

82
梯形中位线定理 梯形的中位线平行于两底,并且等于两底和的一半

86
平行线分线段成比例定理 三条平行线截两条直线,所得的对应线段成
比例
87
推论 平行于三角形一边的直线截其他两边(或两边的延长线),所得
的应线段成比例
88
定理 如果一条直线截三角形的两边(或两边的延长线)所得的对应线
段成比例,那么这条直线平行于三角形的第三边
89
平行于三角形的一边,并且和其他两边相交的直线,所截得的三角形的
三边与原三角形三边对应成比例
90
定理 平行于三角形一边的直线和其他两边(或两边的延长线)相交,
所构成的三角形与原三角形相似
91
相似三角形判定定理 1 两角对应相等,两三角形相似(ASA

92
直角三角形被斜边上的高分成的两个直角三角形和原三角形相似

93
判定定理 2 两边对应成比例且夹角相等,两三角形相似(SAS

94
判定定理 3 三边对应成比例,两三角形相似(SSS

95
定理 如果一个直角三角形的斜边和一条直角边与另一个直角三角形的
斜边和一条直角边对应成比例,那么这两个直角三角形相似
96
性质定理 1 相似三角形对应高的比,对应中线的比与对应角平分线的比都等于相似比
97
性质定理 2 相似三角形周长的比等于相似比

98
性质定理 3 相似三角形面积的比等于相似比的平方

99
任意锐角的正弦值等于它的余角的余弦值,任意锐角的余弦值等于它的
余角的正弦值
100
任意锐角的正切值等于它的余角的余切值,任意锐角的余切值等于它的
余角的正切值
101
圆是定点的距离等于定长的点的集合

102
圆的内部可以看作是圆心的距离小于半径的点的集合

103
圆的外部可以看作是圆心的距离大于半径的点的集合

104
同圆或等圆的半径相等

105
到定点的距离等于定长的点的轨迹,是以定点为圆心,定长为半径的圆

106
和已知线段两个端点的距离相等的点的轨迹,是着条线段的垂直平分线

107
到已知角的两边距离相等的点的轨迹,是这个角的平分线

108
到两条平行线距离相等的点的轨迹,是和这两条平行线平行且距离相等
的一条直线
109
定理 不在同一直线上的三点确定一个圆。

110
垂径定理 垂直于弦的直径平分这条弦并且平分弦所对的两条弧

111
推论
1 ①平分弦(不是直径)的直径垂直于弦,并且平分弦所对的两条弧 ②弦的垂直平分线经过圆心,并且平分弦所对的两条弧
③平分弦所对的一条弧的直径,垂直平分弦,并且平分弦所对的另一条弧

112
推论2 圆的两条平行弦所夹的弧相等

113
圆是以圆心为对称中心的中心对称图形

114
定理 在同圆或等圆中,相等的圆心角所对的弧相等,所对的弦相等,
所对的弦的弦心距相等
115
推论 在同圆或等圆中,如果两个圆心角、两条弧、两条弦或两弦的弦
心距中有一组量相等那么它们所对应的其余各组量都相等
116
定理 一条弧所对的圆周角等于它所对的圆心角的一半

117
推论 1 同弧或等弧所对的圆周角相等;同圆或等圆中,相等的圆周角
所对的弧也相等
118
推论 2 半圆(或直径)所对的圆周角是直角;90° 的圆周角所对的弦
是直径
119
推论 3 如果三角形一边上的中线等于这边的一半,那么这个三角形是
直角三角形
120
定理 圆的内接四边形的对角互补,并且任何一个外角都等于它的内对

②直线L和⊙O相切
d=r ③直线L和⊙O相离 122 切线的判定定理 经过半径的外端并且垂直于这条半径的直线是圆的切线
123
切线的性质定理 圆的切线垂直于经过切点的半径

124
推论 1 经过圆心且垂直于切线的直线必经过切点

125
推论 2 经过切点且垂直于切线的直线必经过圆心

126
切线长定理 从圆外一点引圆的两条切线,它们的切线长相等,圆心和
这一点的连线平分两条切线的夹角
127
圆的外切四边形的两组对边的和相等
128
弦切角定理 弦切角等于它所夹的弧对的圆周角

129
推论 如果两个弦切角所夹的弧相等,那么这两个弦切角也相等

130
相交弦定理 圆内的两条相交弦,被交点分成的两条线段长的积相等

131
推论 如果弦与直径垂直相交,那么弦的一半是它分直径所成的两条线
段的比例中项
132
切割线定理 从圆外一点引圆的切线和割线,切线长是这点到割线与圆
交点的两条线段长的比例中项
133
推论 从圆外一点引圆的两条割线,这一点到每条割线与圆的交点的两
条线段长的积相等
134
如果两个圆相切,那么切点一定在连心线上

136
定理 相交两圆的连心线垂直平分两圆的公共弦

137
定理 把圆分成
n(n≥3): ⑴依次连结各分点所得的多边形是这个圆的内接正n边形
⑵经过各分点作圆的切线,以相邻切线的交点为顶点的多边形是这个圆
的外切正n边形
138
定理 任何正多边形都有一个外接圆和一个内切圆,这两个圆是同心圆

139
n边形的每个内角都等于(n-2×180°
n
140
定理 n边形的半径和边心距把正n边形分成2n个全等的直角三角形

142
正三角形面积 √3a4 a表示边长

如果在一个顶点周围有k个正n边形的角,由于这些角的和应为360°,因
k×(n-2)180°n=360°化为(n-2(k-2)=4
公式表达式
乘法与因式分解
}

我要回帖

更多关于 磁感应强度b的方向怎么判断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信