一、JAVA 函数
1、基本概念
(1)函数的概念
Java函数就是将具有特定功能的代码封装起来,然后在需要的时候调用即可(在主函数中调用)。
(2)定义函数的语法
访问修饰符 返回值数据类型 函数名([参数列表]){ //中括号可有可无
特定功能的代码块;
[return 值];
}
- 访问修饰符
public protected private default
- 返回值数据类型
函数的参数返回类型可以是8个基本数据类型,一个包装类String,一个引用类(数组),也可以是空返回值void。 - 参数列表:根据需求添加参数
语法:数据类型 参数名 多个参数之间用逗号隔开
public static int add(int a,int b){
return sum = a + b;
}
- return 值:返回值数据类型和return的关系
- 怎么确定返回值数据类型:
没有返回值的时候,返回值数据类型设置为void,如果是void,不能有返回值,可以有return,只是return后面不能跟有变量或值;
如果不是void,那么必须跟有return,还要跟值,而且返回值数据类型和return后面返回的变量数据类型必须一致。 - return的作用:
当有返回值的时候,则是将函数里面的值传到函数外面;
当没有返回值的时候,作为函数的结束标志,在return的前面将不能再写代码,否则报错。
- 怎么确定返回值数据类型:
public void add(){
int a = 10;
int b = 100;
int c = a + b;
}
注意:方法定义了并不会全部运行,
2、方法特点
提高复用性,具有封装性,最好功能单一,函数功能越单一,功能越大,复用性越高。
3、方法的重载
在同一个类中,有着相同的函数名,不同的参数列表(参数的个数或者参数数据类型或者参数顺序不一样),和返回值无关。
4、构造函数
(1)每一个类都有一个构造函数,当我们没有自己写构造函数的时候,那么虚拟机会自动添加一个无参的构造函数。 如果自己写了构造函数,虚拟机将不会给无参的构造函数。
构造函数的函数名与类名相同,不用定义返回值类型,也不用写return语句。多个构造函数是以重载的方式存在的。
(2)语法
访问修饰符 类名([参数列表]){ }
比如:
public Person(){
//无参函数
}
如果在类中写了有参构造函数,则必须要写上无参构造。
构造函数示例
public class Person{
private int id;
private String name;
private String age;
public Person(){ //无参构造函数
}
public Person(int id){ //有参构造函数
this.id = id;
}
public Person(String name,String age){ //有参构造函数
this.name = name;
this.age = age;
}
}
(3)作用:用于初始化成员变量的值,即用于给对象进行初始化。
5、构造代码块
(1)构造代码块:还有大括号括起来的主体,没有函数声明和定义。
{
System.out.println("构造代码块");
}
(2)构造代码块在对象一建立的时候就会运行,会优先于构造函数之前执行,构造代码块的作用也是初始化变量值,但是是给所有对象进行统一初始化。
(3)Demo
public class Demo {
public static Demo d1 = new Demo();
public static Demo d2 = new Demo();
{
System.out.println("构造代码块");
}
static{
System.out.println("静态代码块");
}
//构造函数
public Demo() {
System.out.println("构造函数");
}
//main函数
public static void main(String[] args) {
Demo d3 = new Demo();
}
}
结果:
构造代码块
构造函数
构造代码块
构造函数
静态代码块
构造代码块
构造函数
6、局部变量和全局变量
(1)局部变量:只有一部分可以使用改变量;
全局变量:定义在类里面的变量叫做全局变量,又叫成员变量。
public class Demo{
public static void main(String[] args){
int sum =0;
for(int i = 0; i < 100; i++){
sum = sum +i;
}
System.out.println(sum);
}
}
在示例中,变量sum就是全局变量,变量i就是局部变量,sum可以在本类任何位置使用,但是i只能在for循环内使用,如果在for循环外只用变量i,系统将会提示这是一个没有定义的变量。
(2)区别
- 作用范围不一样。
- 内存所在位置不一样,局部变量在栈内存中,全局变量在堆内存中。
7、调成员方法
成员属性在堆内存中,成员方法在方法区,调用时在栈内存中开辟空间,用完立即消失。
8、类与对象
类:具有共同属性和行为的一类事物,用class修饰。
对象:创建对象的语法:
类名 对象名 = new 类名();
只要创建了一个对象,这个对象就具有类里面的所有属性。
Person p = new Person();
前面的Person用于声明类,后面的Person用于调用函数。
二、堆和栈
1、JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:寄存器、本地方法区、方法区、栈内存、堆内存。
(1)栈:函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。 栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。 栈内存中的数据,没有默认初始化值,需要手动设置。
(2)堆:堆内存用来存放new创建的对象和数组。 堆内存中所有的实体都有内存地址值。 堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。 堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一(C++中需要程序员手动清除)。
2、堆栈:先进后出,如同杯子装东西
队列:先进先出,如同水管
三、访问修饰符
1、public 公共访问权限
(1)具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。
(2)如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰, 那么这个成员或外部类就可以被所有类访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。
(3)注:在该类外部,若是类成员,则需要类调用成员或外部类;若是非static的类,则应先实例化后,对象对其调用
2、private 当前类访问权限
(1)访问权限仅限于类的内部,是一种封装的体现
(2)如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。
(3)可以用set( ),get( )方法
3、protected 子类访问权限
(1)主要的作用就是用来保护子类的。
(2)它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。
(3)如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰, 那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。
(4)在通常情况下,如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法。
4、default 包访问权限
(1)有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等, 都可以相互访问,即使是父类没有用protected修饰的成员也可以。
(2)同一包中的类可以访问,声明时没有加修饰符,认为是friendly。
(3)如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰, 就称它是包访问权限,default访问控制的成员或外部类可以被相同包下的其他类访问。
5、public,private,protected,default的作用域
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×