面向对象
Java的面向对象学习三条主线
1.java类及类的成员
属性、方法、构造器;代码块、内部类
2.面向对象的三大特征
封装、继承、多态、(抽象)
3.其他关键字:this super static abstract interface package import
面向对象 VS 面向过程
例:人把大象关进冰箱
一、.面向过程:强调功能和行为,以函数为最小的单位,考虑怎么做
1.1 打开冰箱
1.2抬起大象,塞进冰箱
1.3.关上冰箱门
二、.面向对象:强调具被了功能的对象,以类/对象为最小单位,考虑谁来做。
人{//描述人行为的类
打开(冰箱){//打开的方法
冰箱.打开();
}
抬起(大象){//抬起的方法
大象.进入(冰箱);
}
关闭(冰箱){//关闭的方法
冰箱.闭合();
}
}
冰箱{//冰箱类
开开(){}
闭合(){}
}
大象{//大象类
进入(){}//进入的方法
}
面向对象的两个要素:类、对象
1.类:对一类事物的描述,抽象的定义
2.对象:实际存在的该类事物
【注】
设计类就是在设计类的成员
属性=成员变量=field= 域、字段
方法 = 成员方法 = 行为 = 函数
创建类的变量、实例化类
//2.创建类的对象
public static void main(String[] args){
Person p1 = new Person();//创建Person类对象
//3.调用对象的相关功能
p1.name = “Tom”;//属性的调用
p1.eat();//方法的调用
}
//1.创建类和设计类的成员
class Person{
String name;
public void eat(){
system.out.println(“你好”);
}
}
类和对象的使用步骤 (结合上述代码分析)
1.创建类和设计类的成员
2.创建类的对象
3.调用对象的相关功能
内存解析
对于同一个类,每New一次,就会在堆中开辟一个新的空间,每个新的对象都独立拥有类里面的所有属性
对于没有使用new方式创建的对象,例如:Person p1 = p3;
该语句相当于,把p3 的地址值赋给p1,两个对象指向的内存空间相同,无论是对p1还是p3的属性进行修改,修改的值都是同一片内存空间里的值。
类中方法的声明和使用
方法:描述类中应该具有的功能
分类:返回值类型、有无形参
1.方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
1.1权限修饰符
Java中规定四种修饰符 public private 缺省 protected。每种权限修饰符的访问权限不同,之后再详细解释
1.2返回值类型 有返回值 无返回值
1.2.1有返回值 例如String int long等返回值类型都有返回值
如果方法有返回值,则必须在方法声明时指定返回值的类型,同时方法中需要使用return关键字,返回指定类型的返回值
1.2.2无返回值
如果方法没有返回值,则方法声明时使用void来表示,方法体中不要求使用return,此时return仅作为结束方法体作用,在return后便无法再声明语句。
1.3方法名
符合方法名的命名规范,见名知意
1.4形参列表 可以声明0个,1个,或多个形参
1.4.1格式:数据类型1 形参1,数据类型2 形参2…
1.5方法体
方法功能的实现
补充:static final abstract,来修饰方法的
public int test1(int num){//这里的代码只是测试使用,所以方法名没有见名知意
int sum = 0;
for(int i = 0;i < num;i++){
sum += i
}
return sum;
}
return关键字的使用
1.使用范围:使用在方法体中
2.作用
2.1结束方法
2.2针对有返回值类型的方法,使用“return数据 ”方法返回所要数据
注意:return后不可以声明语句
匿名对象的使用
1.实例化对象时,不将实例化的对象赋予给某一个变量而是直接调用对象里的方法。
2.匿名对象只能使用一次
public class Test1 {
public static void main(String[] args) {
System.out.println(new Person().name = "Tom");
new Person().eat();
}
static class Person{
String name;
int age;
public void eat(){
System.out.println("人吃饭");
}
public void sleep(){}
}
}
1.方法的重载
1.1在一个类一下允许存在一个以上的同名方法,只要他们的参数个数,或者参数类型不同。适用一些情况下,多种数据类型需要进行同一种运算,比如int 与 char型的的数组排序。
class Person{
public void test(String name){
}
public void test(String name,int age){
}
public void test(String name,long age){
}
}
1.2在调用方法时如何让确定一个指定的方法:方法名–>参数列表
2.可变个数的形参(jdk5.0新增内容)
2.1数据类型:… 形参名 public void show(String … strs)
2.2允许直接定义能和多个实参相匹配的形参,从而可以用一种简单的方式来传递个书可变的实参。在调用时传入实参可以传入可变个0-…
2.3可变个数形参的方法,与本类中同方法名不同形参的方法构成重载
2.4在jdk5.0版本之前,传入多个实参可以通过数组方式完成,两者方法不共存
public void show(String[] strs){}
2.5有多个形参时,可变个数形参在方法的形参当中必须声明在末尾
public void show (int i,String … strs){}
2.6可变个数形参在方法的形参当中只能声明一个可变形参
3方法参数的值传递机制 值传递
3.1形参:方法声明时的参数
实参:方法调用时实际传给形参的数值
3.2传递机制
3.2.1如果传入的数据类型为基本数据类型,此时实参传入的是数据的值。方法体 内对形参进行的操作,仅仅改变了形参的值,在main方法中的实参值并未发生改变。
3.2.2如果数据是引用数据类型,此时实参传入的是数据的地址,在方法体内对形参进行的操作,改变了地址指向的数据值,即同时改变了形参与实参的值