1.面向对象:(oop:Object Oriented Programming)
特点:封装,多态,继承
面向对象的做法:找一个洗衣机-->把脏衣服放下-->拿回来穿上。(不需要知道具体的洗衣服的方法)
2.面向过程:
特点:一步一步分析,消耗资源。
面向过程,如洗衣服:盆→水+洗衣粉→放衣服浸泡-->搓洗-->晾晒-->收纳
3.类:
3.1 类class: 类是一种数据类型。是一组相关属性和行为的集合,用来描述现实世界事物的。
类有属性和行为。
3.2 定义一个类的属性:
public class baby{
1.成员变量
2.成员方法(函数)
}
例子1:
public class Clothes
{
String id; //实例变量
String colorType; //实例变量
int size; //实例变量
Clothes[] siblings
}
语法:变量修饰符 类型 变量名
变量修饰符:
修饰符 | 说明 |
public | 成员变量可以被项目中的任何方法访问,建议尽量少用 |
protected | 不在同一个包中的类不能访问,但子类可以访问 |
private | 只能在同一个类中使用 |
static | 类变量,其值为该类的所有对象共享,不会因类的对象不同而不同 |
final | 最终成员变量,其值保持不变,即常量 |
transient | 当对象被持久化时(例如写入数据库),该成员变量的值不需要保存 |
volatile | 同步多线程访问的成员变量的值,以便使不同的线程总是得到 该成员变量的同一个值。关于线程,请参阅第11章 |
数据类型:double 布尔 int String 数组类型
3.2.1 属性
① 基本介绍
从概念或叫法上看: 成员变量= 属性= field(字段) (即成员变量是用来表示属性的)
案例演示:Car(name,price,color) Cat(name ,age,color)
属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类的int age 就是属性
②属性的注意事项和细节说明
属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;
修饰符: 控制属性的访问范围
有四种访问修饰符public, proctected, 默认, private
属性的定义类型可以为任意类型,包含基本类型或引用类型(存储差别)
属性如果不赋值,有默认值,规则和数组一致。具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000
③如何访问属性
基本语法
对象名.属性名;
cat.name ;
cat.age;
cat.color;
3.3 定义了一个类之后,就可以用它来创建对象,就是类的实例(在New之后才会分配给对象空间)
Clothes hxek = new Clothes();
3.4 成员变量的初始化
①:在定义类时,可以定义赋值属性,但是其实是在new了对象之后,才会分配空间,为成员变量赋初值。
②:如果在定义类的时候不知道成员变量的值,可以在构造函数中进行初始化。
③:如果②,③ 都不行,可以在成员函数中设定。
3.5 构造函数//构造器
3.5.1 特点:
①:构造函数的名称和类名完全相同
②:构造函数没有返回值,不需要返回值类型
③:构造函数在创建对象自动被调用的,用来初始化成员变量。
④:每个类至少一个构造函数,如果没有写,系统会自己调用
⑤:构造函数可以用参数,也可以没有参数。
3.4.2 语法
①:基本语法:
[修饰符] 方法名(形参列表){
方法体;
}
例子2:public class Classname{
String specitally;
int class;
String name;
classname(){ //构造函数
...
}
}
classname(String myspecitally,int myclass,String myname){
specitally = myspecitally;
class = myclass;
name = myname;
}
②:在类中定义与构造器初始化的区别
声明时为成员变量赋值,那么你一创建对象,这个赋值就进行,而且先于构造器执行。
而且你每次创建这个类的对象,都是同一个值。
构造方法初始化可以单独为每一个对象赋不同的值。
3.6 成员方法
3.6.1 定义:定义普通的成员函数
在类中,构造函数是 特殊的 用于初始化类成员变量的函数,要求与类名保持一致。
此外,还有一种普通的函数,定义普通的成员函数。
语法: 数据类型 函数名 参数列表
{语句块}
细节:
①:一个返回值,返回一个变量/但可以运用数组,表示多个情况
②:void 没有返回值
③:返回的都是定义的类型
3.7 形参和实参
①函数中使用:
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主函数中,进入被调函数后,实参变量也不能使用。
②调用
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
③举例
1. 比如你定义一个函数public static int add(int a,int b),这里的a和b就是形参。
2. 当你进行函数调用的时候,add(1,2),这里的1和2就是实参。
3. 简单来说就是进行函数调用的时候需要实参从主函数中传给被调用函数中的形参,这样函数才可以执行,实参和形参起到一个桥梁的作用。
④
3.8 类和对象分配机制
3.9成员方法传参机制
①:基本数据类型分配机制:
如果有参数,在使用new创建对象时,要制定相应的参数。
Clothes hxer = clothes("1","白色","160");
意思是 创建一个类 类中的对象 id是1,颜色是白色,尺码是s。
"1","白色","160" 是实参
当函数调用时,就会把实参穿给形参。
a,b,c 就是形参。
public clothes(string a,String b,int c){
id = a
colortype = b
size = c
}
例子3:
package com.company.excerse; public class monny { //与文件名相同 class Dollar{ //创建一个类dollar int n =100; //局部变量 public Dollar(){ //建立一个与类名相同的函数 System.out.println(n); } } Dollar d = new Dollar();//new 一个空间 public monny(){ //创建一个函数 monny 与类名monny相同 System.out.println("give to much"); } public static void main(String[] args){ //主函数 monny m = new monny(); } }
先执行dollar的,调用dollar的构造函数
再执行monny的执行函数。
结果:
3.6 实参和形参
3.7 类函数调用的内存图
例子:
public class Person {
String name;
int age;
public void show(){
System.out.println(“姓名:”+name+",年龄:"+age);
}
}
public class TestPerson {
public static void main(String[ ] args) {
// 创建p1对象
Person p1 = new Person();
p1.age = 24;
p1.name = “张三”;
p1.show();
// 创建p2对象
Person p2 = new Person();
p2.age = 35;
p2.name = “李四”;
p2.show();
}
}
1.首先,在方法区加载person类,程序从mian()方法开始执行main()方法加载到栈内存。
2.然后,main()方法中,创建对象p1,person()构造方法加载到栈内存,在堆内存中开辟出一个内存块地址为0x11(这里是随意命名)赋值,name:null,age:0.执行完毕,person()构造方法从栈内存移除。
3.在main()方法中继续执行,给age赋值为24,给name赋值为“张三”.调用show()方法,show()方法加载到堆内存。输出内容“张三,24”,show()方法执行完毕从栈内存移除。
4.创建对象p2,person()构造方法加载到栈内存,在堆内存中开辟出一个内存块地址为0x12(这里是随意命名)赋值,name:null,age:0.执行完毕,person()构造方法从栈内存移除。
5.继续执行,给age赋值为35,给name赋值为“李四”.调用show()方法,show()方法加载到堆内存。输出内容“李四,35”,show()方法执行完毕从栈内存移除。
6.main()方法执行完毕,从栈内存移除。
3.7 创建一个对象
①先声明再创建
Cat cat ; //声明对象cat
cat = new Cat(); //创建
②直接创建
Cat cat = new Cat();