方法:将具有独立功能的代码块组合为一个整体
定义格式:
访问权限修饰符 其他修饰符 返回值类型 方法名称(参数列表) {
//方法体【函数体】 return 返回值;
//如果返回值类型void ,可以不用写return
}
修饰符的访问权限
Java访问修饰符包括private,default,protected和public。含义分别表示私有的,默认的,受保护的和公有的访问修饰符。这些访问修饰符既可以修饰类中的属性,又可以修饰类中的方法,而public和default还可以修饰类。在同一个java文件里,公有类有且仅有一个,并且该文件命名为类名.java。
修饰符 | 当前类 | 相同包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
方法的分类
- 根据方法有没有参数,可分为:
- 1.无参方法
- 2.有参方法
- 根据有没有返回值,可分为:
- 1.无返回值方法
- 2.有返回值方法
形参:方法定义中的参数,等同于变量定义格式,例如:int number
实参:方法调用中的参数,等同于使用变量或常量,例如:10 number
public class Demo{
// 1. 最简单的无参方法
void sum1(){
System.out.println("加法操作");
}
// 2. 拥有修饰符的无参方法
public static void sum2(){
System.out.println("加法操作");
}
// 3. 拥有参数的方法
public static void sum3(int a,int b){
System.out.println("两数相加结果"+a+b);
}
// 4.拥有返回值的方法
public static int sum4(int a,int b){return a+b;
}
// 5.声明一个无参数带返回值
public static int sum5(){
int x=20;
int y=28;
int z=x+y;
return z;
}
}
方法的重载
概念:
- 同一个类中,方法名字相同,参数列表不同,则是方法重载。
注意:
- 参数列表的不同包括,参数个数不同,参数数据类型不同,参数顺序不同
- 方法的重载与方法的修饰符和返回值没有任何关系
-
public class Demo { public static void main(String[] args) { show(); show(10); show("10"); show("10",10); } public static void show() { System.out.println("无参无返回值的show"); } public static void show(int a) { System.out.println("int的show"); } public static void show(String a) { System.out.println("String的show"); } public static void show(String a,int b) { System.out.println("String int的show"); } }
无参无返回值的show int的show String的show String int的show
面向对象部分
- 三大思想
-
OOA:面向对象分析(Object Oriented Analysis)
OOD:面向对象设计(Object Oriented Design)
OOP:面向对象程序(Object Oriented Programming )
-
类与对象
类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。 (类似生活中的图纸与实物的概念。)类必须通过对象才可以使用,对象的所有操作都在类中定义。
类由属性和方法组成:
属性:就相当于人的一个个的特征
方法:就相当于人的一个个的行为,例如:说话、吃饭、唱歌、睡觉
一个类要想真正的进行操作,则必须依靠对象,对象的定义格式如下:
类名称 对象名称 = new 类名称() ;
如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式:
访问类中的属性: 对象.属性 ;
调用类中的方法: 对象.方法(实际参数列表) ;
类必须编写在.java文件中;
一个.java文件中,可以存在N个类,但是只能存在一个public修饰的类;
.java文件的文件名必须与public修饰的类名完全一直;匿名对象
- 没有对象名称的对象就是匿名对象。 即栈内存中没有名字,而堆内存中有对象。
- 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。
- 只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。
-
public static void main(String[] args){ //Math2 m=new Math2(); //int num=m.sum(100,200); //不通过创建对象名,直接实例对象调用,这就是匿名对象。因为没有对象名指向对象,所以只能调用一次,然后被GC回收。 int num = new Math().sum(100,200); System.out.println(num); } class Math2{ int sum(int x,int y){ return x+y; } }
对象内存分析
创建对象的内存分析
-
栈(stack)
-
Java栈的区域很小 , 大概2m左右 , 特点是存取的速度特别快
栈存储的特点是:先进后出
存储速度快的原因:
栈内存, 通过 ‘栈指针’ 来创建空间与释放空间 !
指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 !
这种方式速度特别快 , 仅次于PC寄存器 !
但是这种移动的方式, 必须要明确移动的大小与范围 ,
明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序 的灵活性 ~
所以我们把更大部分的数据存储到了堆内存中
堆存储的是:
基本数据类型的数据以及引用数据类型的引用!
堆(heap)
-
存放的是类的对象 ;
Java是一个纯面向对象语言, 限制了对象的创建方式 :
所有类的对象都是通过new关键字创建
new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用
时长 !
堆内存中内存的释放是由GC(垃圾回收器)完成的
垃圾回收器回收堆内存的规则 :
当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 !
包装类
在Java中有一个设计的原则“一切皆对象”,那么这样一来Java中的一些基本的数据类型,就完全不符合于这种设计思想,因为Java中的八种基本数据类型并不是引用数据类型,所以Java中为了解决这样的问题,引入了八种基本数据类型的包装类。
-
序号 基本数据类型 包装类 1 int integer 2 char Character 3 float Float 4 double Double 5 boolean Boolean 6 byte Byte 7 short Short 8 long Long 以上的八种包装类,可以将基本数据类型按照类的形式进行操作。
但是,以上的八种包装类也是分为两种大的类型的:
Number:Integer、Short、Long、Double、Float、Byte都是Number的子类表示是一个数字。
Object:Character、Boolean都是Object的直接子类。
基本数据类型和包装类型的区别
1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是
2、包装类型是引用的传递,基本类型是值的传递
3、声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间
4、存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们
5、初始值不同,eg: int的初始值为 0 、 boolean的初始值为false 而包装类型的初始值为null抽象类
抽象类必须使用abstract class声明
一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或者接口中。
格式:
abstract class 类名{ // 抽象类 }
抽象方法
只声明而未实现的方法称为抽象方法(未实现指的是:没有“{}”方法体),抽象方法必须使用abstract关键字声明。
格式:
// 抽象类 abstract class 类名{ public abstract void 方法名() ; // 抽象方法,只声明而未实现 }
不能被实例化
在抽象类的使用中有几个原则:
-
抽象类本身是不能直接进行实例化操作的,即:不能直接使用关键字new完成。 不能被我们创建,但是jvm虚拟器可以创建。
-
一个抽象类必须被子类所继承,被继承的子类(如果不是抽象类)则必须覆写(重写)抽象类中的全部抽象方法。