java基础知识整理一

面向对象编程概述

java工作方式

  • Java源代码–>编译器(编译输出字节码文件)–>java虚拟机(解析字节码文件)
    在这里插入图片描述

程序设计的思路

  • 面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程、指令式编程和函数式编程。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。

面向过程的程序设计思想(Process-Oriented Programming),简称 POP

  • 关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。代码结构:以函数为组织单位。是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大。

面向对象的程序设计思想( Object Oriented Programming),简称 OOP

  • 关注的焦点是类:在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,用类来表示。代码结构:以类为组织单位。每种事物都具备自己的属性和行为/功能。是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。

面向对象与面向过程的关系

  • 面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
    注意:千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!

类与对象之间的关系

  • 类:用于描述对象的抽象概念,以程序的方式来表达现实中存在的事物.
  • 对象:现实中实际存在的事物,如人,汽车,动物等,也称为实例.

类的组成

  • 类,是一组相关属性和行为的集合,这也是类最基本的两个成员。
  • 属性:该类事物的状态信息。对应类中的成员变量
    • 成员变量 <=> 属性 <=> Field
  • 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
    • (成员)方法 <=> 函数 <=> Method

类的定义公式

  • 类的定义使用关键字:class。格式如下:
 	[修饰符] class 类名{
		属性声明;
 		方法声明;
	}

创建对象

  • 创建对象,使用关键字:new

  • 创建对象语法:

  • //方式 1:给创建的对象命名
    //把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了
    类名 对象名 = new 类名();

  • //方式 2:
    new 类名()//也称为匿名对象
    举例:

class PersonTest{
public static void main(String[] args){
	//创建 Person 类的对象
	Person per = new Person();
	//创建 Dog 类的对象
	Dog dog = new Dog();
	}
}

对象调用属性或方法

  • 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
    使用"对象名.属性" 或 "对象名.方法"的方式访问对象成员(包括属性和方法)
    举例 1:
//声明 Animal 类
public class Animal { //动物类
 public int legs;
 public void eat() {
 System.out.println("Eating.");
 }
 public void move() {
 System.out.println("Move.");
 }
}
//声明测试类
public class AnimalTest {
 public static void main(String args[]) {
 //创建对象
 Animal xb = new Animal();
 xb.legs = 4;//访问属性
 System.out.println(xb.legs);
 xb.eat();//访问方法
 xb.move();//访问方法
 }
}

变量(field)

语法格式:
[修饰符 1] class 类名{
 [修饰符 2] 数据类型 成员变量名 [= 初始化值];
}

说明:
– 位置要求:必须在类中,方法外
– 修饰符 2(暂不考虑)
• 常用的权限修饰符有:private、缺省、protectedpublic
• 其他修饰符:staticfinal
– 数据类型
• 任何基本数据类型(intBoolean) 或 任何引用数据类型。
– 成员变量名
• 属于标识符,符合命名规则和规范即可。
– 初始化值
• 根据情况,可以显式赋值;也可以不赋值,使用默认值

成员变量与局部变量区别

  • 在方法体外,类体内声明的变量称为成员变量。

  • 在方法体内部等位置声明的变量称为局部变量。

  • 相同点

    • 1.变量声明的格式相同: 数据类型 变量名 = 初始化值
    • 2.变量必须先声明、后初始化、再使用。
    • 3.变量都有其对应的作用域。只在其作用域内是有效的
  • 不同点

    • 1.存放位置不同
      –成员变量存放在堆内存中,
      –局部变量存放在栈内存中.
    • 2.声明位置和方式
      –实例变量:在类中方法外
      –局部变量:在方法体{}中或方法的形参列表、代码块中
    • 3.生命周期
      –实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被 GC 回收而消亡, 而且每一个对象的实例变量是独立的。
      –局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
    • 4.作用域
      –实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量”
      –局部变量:出了作用域就不能使用
    • 5.修饰符
      –实例变量:public,protected,private,final,volatile,transient 等
      –局部变量:final
    • 6.默认值
      –实例变量:有默认值
      –局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。

静态变量

  • static 可以将成员变量分为两大类,静态变量和非静态变量。其中静态变量又称为类变量,非静态变量又称为实例变量或者属性。
  • 静态变量随着类的加载而加载,成员变量随着对象的创建而创建.

方法(method、函数)的理解

  • 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码 ,Java 里的方法不能独立存在,所有的方法必须定义在类里

声明方法的语法格式

[修饰符] 返回值类型 方法名([形参列表])[throws 异常列表]{
 方法体的功能代码
}
  • 一个完整的方法 = 方法头 + 方法体。
    方法头就是[修饰符] 返回值类型 方法名([形参列表])[throws 异常列表],也称为方法签名。
    通常调用方法时只需要关注方法头就可以,从方法头可以看出这个方法的功能和调用格式。
    方法体就是方法被调用后要执行的代码。对于调用者来说,不了解方法体如何实现的,并不影响方法的使用。

方法头可能包含 5 个部分

  • 修饰符:
    可选的。方法的修饰符有很多,例如:public、protected、private、static、abstract、native、final、synchronized 等。
    – 权限修饰符有 public、protected、private。
    – 根据是否有 static,可以将方法分为静态方法和非静态方法。其中静态方法又称为类方法,非静态方法又称为实例方法。
    返回值类型:
    表示方法运行的结果的数据类型,方法执行后将结果返回到调用者。
    – 无返回值,则声明:void
    – 有返回值,则声明出返回值类型(可以是任意类型)。与方法体中“return返回值”搭配使用
    方法名:
    属于标识符,命名时遵循标识符命名规则和规范,“见名知意”
    形参列表:
    表示完成方法体功能时需要外部提供的数据列表。可以包含零个,一个或多个参数。
    – 无论是否有参数,()不能省略
    – 如果有参数,每一个参数都要指定数据类型和参数名,多个参数之间使用逗号分隔,例如:
    • 一个参数: (数据类型 参数名)
    • 二个参数: (数据类型 1 参数 1, 数据类型 2 参数 2)
    – 参数的类型可以是基本数据类型、引用数据类型

方法体:

  • 方法体必须有{}括起来,在{}中编写完成方法功能的代码

关于方法体中 return 语句的说明:

  • return 语句的作用是无返回值方法结束方法的执行,有返回值方法将方法的结果返回去
    1.如果返回值类型不是 void ,方法体中必须保证一定有 return 返回值 ; 语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。
    2.如果返回值类型为 void 时,方法体中可以没有 return 语句,如果要用 return 语句提前结束方法的执行 ,那么 return 后面不能跟返回值,直接写 return; 就可以。return 语句后面就不能再写其他代码了,否则会报错:Unreachable code
    return 在方法中的作用:
    – 作用 1:结束一个方法
    – 作用 2:结束一个方法的同时,可以返回数据给方法的调用者
    注意点:在 return 关键字的直接后面不能声明执行语句

方法的调用

  • 方法通过方法名被调用,且只有被调用才会执行。

方法调用语法格式

	对象.方法名([实参列表])

方法特性

  • (1)必须先声明后使用,且方法必须定义在类的内部
    (2)调用一次就执行一次,不调用不执行 。
    (3)方法中可以调用类中的方法或属性,不可以在方法内部定义方法。

方法调用内存分析

  • 方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储 。
    方法被调用的时候,需要进入到栈内存中运行 。方法每调用一次就会在栈中有一个入栈动作 ,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值。当方法执行结束后,会释放该内存,称为出栈 ,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。
    栈结构:先进后出,后进先出

对象数组

  • –数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时,我们称为对象数组

  • –对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不==创建,数组的元素的默认值就是 null,所以很容易出现空指针异常 NullPointerException

方法的重载(overload)

概念及特点

  • 方法重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可(方法名相同参数列表不同) 。
    重载的特点:与修饰符、返回值类型无关,只看参数列表,且参数列表必须不同 。(参数个数或参数类型) 。调用时,根据方法参数列表的不同来区别。
    重载方法调用:JVM 通过方法的参数列表,调用匹配的方法。
    – 先找个数、类型最匹配的
    – 再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错

可变个数的形参

  • 在 JDK 5.0 中提供了 Varargs(variable number of arguments)机制。即当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变个数的形参。
    格式:
	方法名(参数的类型名 ...参数名)

形参和实参

  • 形参(formal parameter):在定义方法时,方法名后面括号()中声明的变量称为形式参数 ,简称形参。
  • 实参(actual parameter):在调用方法时,方法名后面括号()中的使用的值/变量/表达式称为实际参数,简称实参。

参数传递机制:值传递

  • Java 里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
    形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
    形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

递归(recursion)方法

  • 递归方法调用:方法自己调用自己的现象就称为递归。
    递归的分类: 直接递归、间接递归。
  • 直接递归:方法自身调用自己。
public void methodA(){
	methodA();
}
  • 间接递归:可以理解为 A()方法调用 B()方法,B()方法调用 C()方法,C()方法调用 A()方法。
public static void A(){
	B();
}
public static void B(){
	C();
}
public static void C(){
	A();
}
  • 说明:
    递归方法包含了一种隐式的循环。
    递归方法会重复执行某段代码,但这种重复执行无须循环控制。
    递归一定要向已知方向递归,否则这种递归就变成了无穷递归,停不下来,类似于死循环。最终发生栈内存溢出。
  • 注意:
    递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多 ,所以在使用递归时要慎重。
    在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。考虑使用循环迭代

关键字:package、import

package(包)

  • package,称为包,用于指明文件中定义的类、接口等结构所在的包。

  • 语法格式

  • package 顶层包名.子包名 ;
    举例:pack1\pack2\PackageTest.java

  • 说明:

    • 一个源文件只能有一个声明包的 package 语句
    • package 语句作为 Java 源文件的第一条语句出现。若缺省该语句,则指定为无名包。
    • 包名,属于标识符,满足标识符命名的规则和规范(全部小写 )、见名知意
      • 包通常使用所在公司域名的倒置:com.baidu.xxx。
      • 取包名时不要使用"java.xx"包
    • 包对应于文件系统的目录,package 语句中用 “.” 来指明包(目录)的层次,每.一次就表示一层文件目录。
    • 同一个包下可以声明多个结构(类、接口),但是不能定义同名的结构(类、接口)。不同的包下可以定义同名的结构(类、接口)
  • 包的作用

    • 包可以包含类和子包,划分项目层次,便于管理
    • 帮助管理大型软件系统:将功能相近的类划分到同一个包中。
    • 解决类命名冲突的问题
    • 控制访问权限
  • JDK 中主要的包介绍

    • java.lang----包含一些 Java 语言的核心类,如 String、Math、Integer、System 和 Thread,提供常用功能
    • java.net----包含执行与网络相关的操作的类和接口。
    • java.io ----包含能提供多种输入/输出功能的类。
    • java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
    • java.text----包含了一些 java 格式化相关的类
    • java.sql----包含了 java 进行 JDBC 数据库编程的相关类/接口
    • java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。

import(导入)

  • 为了使用定义在其它包中的 Java 类,需用 import 语句来显式引入指定包下所
    需要的类。相当于 import 语句告诉编译器到哪里去寻找这个类。
  • 语法格式

    • import 包名.类名;
  • 注意事项

    • import 语句,声明在包的声明和类的声明之间。
    • 如果需要导入多个类或接口,那么就并列显式多个 import 语句即可
    • 如果使用 a.*导入结构,表示可以导入 a 包下的所有的结构。举例:可以使用java.util.*的方式,一次性导入 util 包下所有的类或接口。
    • 如果导入的类或接口是 java.lang 包下的,或者是当前包下的,则可以省略此 import语句。
    • 如果已经导入 java.a 包下的类,那么如果需要使用 a 包的子包下的类的话,仍然需要导入。
    • 如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类。
    • (了解)import static 组合的使用:调用指定类或接口下的静态的属性或方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值