JAVA SE(八)—— JAVA 面向对象2(函数、堆和栈、访问修饰符)

一、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			  √             ×             ×         	 ×
发布了40 篇原创文章 · 获赞 0 · 访问量 366

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104420980
今日推荐