面向过程和面向对象
面向过程:是一种执行者思维 主要处理简单的逻辑问题
面向对象:是一种设计者思维 主要处理复杂问题
注意: 面向对象和面向过程是相辅相成的 我们对于事物分析 首先使用面向对象对事物进行宏观整体分析,在使用面向过程对事物进行微观的具体执行
类和对象之间的关系
类:class 是一个模板
对象:具体的一个实例
一个类可以产生无数个对象 java中所有的对象通过new 关键字体现的
类的组成
Java中所有自定义类型都是引用类型
-
成员变量
-
方法
-
构造方法
成员变量
局部变量和成员变量之间区别 类中定义的变量是成员变量,而方法中定义的变量,包括方法的参数,代码块中定义的变量被称为局部变量 A、内存中位置不同 成员变量在 堆内存 局部变量是栈内存 B、是否有默认值 局部变量是没有 成员变量有 整数---0 浮点数----0.0 布尔类型----false 字符类型---'\u0000' 引用数据类型----null C、作用范围 局部变量当前方法内有效 成员变量 在整个类中有有效的
方法
方法的四种书写方式
//[A]没有参数 没有返回值 ---- 如果方法没有返回值的使用 void
public void aa(){
System.out.println("我是方法aa");
//bb("ceshi",12); ----在【一个类中】 直接调用【同一种类型】的方法 直接使用方法名进行调用即可
}
//[B]有参数没有返回值----- String a,int b 代表的是方法的参数 多个参数之间使用逗号(,)进行分割
//a b 称为 形参代表的是形式上参数
public void bb(String a,int b){
System.out.println("我是方法bb:"+a+"--"+b);
}
//[C]有返回值没有参数 -----return 返回值 方法的返回值只可有一个
//那个位置调用cc方法 这个返回值就返回给谁
public int cc(){
System.out.println("我是ccc方法");
return 18;
}
//[D]有参数有返回值
public String dd(int a,double b){
System.out.println("我是方法dd:"+a+"--"+b);
return "ceshi";
}
方法重载
在【一个类】中 出现了 【方法名相同】 【参数列表不同】 这种方法称为 方法的重载 参数列表不同 (只要满足一个就可以看成是参数列表不同) A、类型不同 B、个数不同 C、顺序(位置)不同 方法重载仅仅能够帮助我们更加方便的整理,归纳,记忆,调用 方法. 方法重载没有提高任何效率,也没有节约任何代码.
构造方法
注意:
构造方法的方法名必须和类名一致!
构造方法通过new关键字调用!!
构造方法虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
如果我们没有定义构造方法,则编译器会自动定义一个【无参的构造方法】。如果已定义则编译器不会自动添加!
构造方法可以重载
public class Phone {
//成员变量
public String name ;
public String color ;
public double price ;
public String storage ;
//构造方法 无参
public Phone() {}
//构造方法 有参
public Phone(String name, String color, double price, String storage) {
this.name = name;
this.color = color;
this.price = price;
this.storage = storage;
}
//方法重载根据参数个数,类型和顺序调用
public void aa (){
System.out.println("这是aa方法");
}
public void aa (int a,String b){
System.out.println("这是aa方法");
}
public void aa (String b,int a){
System.out.println("这是aa方法");
}
} //类
Phone phone = new Phone(); //通过new关键字获取Phone类的实例化对象 无参
Phone phone2 = new Phone("华为手机","白色",2500,"256G"); //通过new关键字获取Phone类的实例化对象 有参
System.out.println(phone.name);
System.out.println(phone.price);
//由于未赋初始值 取默认值
//null
//0.0
System.out.println(phone2.name);
System.out.println(phone2.price);
//华为手机
//2500.0
this关键字
this关键字 ---->创建好的对象的地址
作用: A、解决局部变量名称和成员变量名称冲突的时候获得值的问题----this.属性 B、解决了构造方法之间相互的调用----this()
public class Phone {
//成员变量
public String name ;
public String color ;
public double price ;
public String storage ;
//构造方法 无参
public Phone() {
//在构造方法中相互调用
this("华为手机","白色",2500,"256G");
}
//构造方法 有参
public Phone(String name, String color, double price, String storage) {
//this();
this.name = name;
this.color = color;
this.price = price;
this.storage = storage;
}
}
扩展
类和对象在内存中的执行
通过类加载器将类的信息加载到jvm中的方法区中 方法区存放类信息对象信息、常量、静态变量和其他信息
通过new实例化对象时
-
分配对象空间,并将对象成员变量初始化为0或null
-
执行属性值的显示初始化
-
执行构造方法
-
返回对象的地址给相关的变量
所以栈中存放的是stu的地址值 指向堆中存放的地址,每实例化一个对象就会在堆中开辟一片空间并将地址值返回 this关键字代表创建好的对象的地址 如stu的this.age相当于0x111.age
当执行方法时将从方法区中将类的方法压入栈中 执行完后出栈