面向过程:【强调步骤】当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节 面向对象:【强调对象】当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿
Java的类与对象【重点】
- 类:类是一个模板,它描述一类对象的行为和状态
属性:就是该事物的状态信息。 名字、体重、年龄、颜色
行为:就是该事物能够做什么。 走、跑、叫
- 对象:
对象是类的一个实例
类与对象的关系
类的定义格式
定义类 : 成员变量、成员方法
public class ClassName {
//成员变量
//成员方法
}
成员变量:成员变量是定义在类中
,方法体之外
的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员方法:去掉static
类变量:声明在类中
,方法体之外
,但必须声明为static
类型。
局部变量:声明和初始化都是在方法中
,方法结束后,变量就会自动销毁。
对象的使用
创建对象: **类名 对象名 = new 类名();**
使用对象访问类中的成员: **对象名.成员变量;**
**对象名.成员方法();**
创建类
public class School {
//属性
String name;
String addres;
double area;
//方法
public void teach(){
System.out.println(addres+"的"+name+"可以"+"教书");
}
public void play(){
System.out.println(addres+"的"+name+"可以"+"玩");
}
}
创建对象
//创建对象格式:类名 对象名 = new 类名();
School school=new School();
//给属性赋值
school.name="大学";
school.addres="沙坪坝";
school.area =10000;
//调用方法
school.teach();
school.play();
成员变量和局部变量的区别
定义位置
- 成员变量:在
类中,方法体外
- 局部变量:在
方法体内部
作用范围
- 成员变量:
类中
- 局部变量:
方法中
默认值
栈
- 一般存放基本数据类型(局部变量)
堆
对象内存图
Cat cat =new Cat()
cat.name="小白";
cat.age = 12;
cat.color = "白色";
一个对象调用一个方法内存图
通过上图,我们可以理解,在栈内存中运行的方法,遵循”
先进后出,后进先出
“的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。 但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解。
两个对象,调用同一方法内存图
对象调用方法时,根据对象中方法标记
地址值
,去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。
一个引用,作为参数传递到方法中内存图
引用类型作为参数,传递的是地址值
main介绍
- main方法:程序的入口,在同一个类中,如果有多个方法,那么虚拟机就会识别main方法,从这个方法作为程序的入口
- main方法格式严格要求:
public static void main(String[] args){}
- public static —->修饰符
- void —->代表方法没有返回值 对应的类型void
- main —->见名知意名字
- String[] args —->形参 —-》不确定因素
问题:程序中是否可以有其他的方法也叫main方法? 可以,构成了方法的重载
代码块
- 大括号包裹起来的代码叫:
代码块
- 作用:
让变量尽可能早的从内存消失, 从而节约资源, 提高效率
代码块分类
普通块,构造块,静态块,同步块
代码块执行顺序:
静态块 构造块 构造器 普通块
①最先执行静态块
,只在类加载的时候执行一次,创建工厂,数据库的初始化信息都放入静态块。一般用于执行一些全局性的初始化操作。
②再执行构造块
,(不常用)
③再执行构造器
,
④再执行方法中的普通块
。
package com.m;
public class Test {
//属性
int a;
static int sa;
//方法
public void a(){
System.out.println("-----a");
{
//普通块限制了局部变量的作用范围
System.out.println("这是普通块");
System.out.println("----000000");
int num = 10;
System.out.println(num);
}
//System.out.println(num);
//if(){}
//while(){}
}
public static void b(){
System.out.println("------b");
}
//构造块
{
System.out.println("------这是构造块");
}
//静态块
static{
System.out.println("-----这是静态块");
//在静态块中只能方法:静态属性,静态方法
System.out.println(sa);
b();
}
//构造器
public Test(){
System.out.println("这是空构造器");
}
public Test(int a){
this.a = a;
}
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
Test t = new Test();
t.a();
Test t2 = new Test();
t2.a();
}
}