面向过程的编程思想(C语言)
- 以
过程/方法
为中心组织程序 - 过程之间进行数据的发送
- 关注点是数据结构/算法
- 程序不宜与复用,不易于维护和扩展
面向对象的编程思想(Java C++)
- 以
对象
进行程序的组织 - 对象之间进行发送消息
- 关注点是对象和对象的职责
- 程序宜于复用,易于维护和扩展
面向对象的编程思想
抽象:
基于一个需求,抽取要维护的客观世界存在的事物,分析事物的主要特征以及行为
学生
特征:姓名 年龄 性别 身高
行为:学习 吃饭 睡觉 打豆豆
对象
客观存在的事物的一个个体
类是对象的模板
对象是类的实例
类
客观世界存在的事物的统称
- 属性:事物的
特征
- 方法:事物的
行为
类的定义
[类的修饰符] class 类名{
类的成员
}
public class Demo1{
}
- 类的修饰符:
- 关键字:class
- 类名:每个单词首字母大写
- 类的成员:成员变量(属性) 成员方法(方法)嵌套类 代码块
- 局部变量:在局部代码块里声明的变量
- 成员变量:在类中直接声明的变量
局部变量与成员变量的区别
局部变量:
- 局部变量必须初始化
- 局部变量有指定的作用域
for(int i = 0;i<=100;i++){
System.out.println(i);
}
成员变量:
- 成员变量的作用域是整个类
- 成员变量有默认值的
- 当成员变量和局部变量,方法使用该变量时,默认使用局部变量
(就近原则)
;
如果使用全局变量(成员变量)
,则变量名前边加上this.
public class Student {
//在类中直接声明的变量 成员变量(全局变量)
String name;
int age;
String sex;
public void learn(){
int age = 12;
System.out.println(name+"学啥学");
System.out.println(age);//12
//this 调用全局变量
System.out.println(this.age);//0
}
public void eat(){
System.out.println("还吃呢");
}
}
对象的创建
实例化是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = new 类名(参数1,参数2...参数n)构成。
类名 对象名 = new 构造方法(构造器)
构造方法(构造器):创建对象
- 方法名与类名相同
- 构造方法没有返回值类型 也没有 void
- 构造方法不能出现 return
- 一个类会默认提供一个无参的方法体为空的构造方法
- 构造方法是可以重载的
如果重载了其他的构造器,则默认的构造器不在提供,除非把它写出来
- 构造器之间的调用 用
this
调用,this必须放在第一行
public class Student {
//在类中直接声明的变量 成员变量(全局变量)
String name;
int age;
String sex;
//无参的构造方法
public Student(){
//调用有参的构造方法
// this("张三",45,"男");
}
//有参的构造方法
public Student(String name,int age,String sex){
//调用无参的构造方法 this()
this();// this必须放在第一行
this.name = name;
this.age = age;
this.sex = sex;
}
public void learn(){
//局部变量必须赋初值
int age = 12;
System.out.println(name+"学啥学");
System.out.println(age);//12
//this 调用全局变量
System.out.println(this.age);//0
}
public void eat(){
System.out.println(name+"还吃呢");
}
Java中的对象创建的内存模型
- 任何一个类都是引用类型
- new 关键字:Java中的内存分配符
栈:保存局部变量的值
- 基本数据类型的数据
- 类的实例
- 方法的形参
堆:存储动态产生的数据,(new出来的数据:数组,对象...)
方法区:存储类的基本信息(类的名字,父类的名称,所有方法的源代码,静态代码块...)
执行Student s = new Student();
内存的分配:
在栈中存储局部变量,s相当于主方法中的一个局部变量
JVM(Java虚拟机)
检查方法区是否有类的相关信息,如果没有,会将类的信息存储在方法区中在堆中开辟内存空间,存储对象信息
给成员变量初始化
调用构造器(构造方法),给成员变量重新赋值
-
根据堆中开辟的内存空间,产生连续的内存首地址,赋值给栈中的引用
自动垃圾回收机制
Java虚拟机中运行一个优先级不是很高的线程,定期过滤堆
中没有引用指向的对象,进行垃圾回收,进行释放内存
//垃圾回收机制
//只能使用一次,没有引用指向
new Student().learn();//回收
Student s3 = new Student();//回收
s3 = new Student();
Java包
包的创建
- package语句必须在Java源文件的第一行
- 一个类只能属于一个包
- 如果不声明包,所创建的类属于默认包
- 不同包中可以有同名的类
- 同一个包中的类之间可以互相访问
- 不同包中的类需要使用
import语句
导入之后才可以使用 - import语句也可以使用通配符
(*)
的方式导入某一个包的所有类 - 一个类不能导入其他包的同名类:要使用全名类
- 默认包中的类不能导入,因为没有包名
代码的封装
从尽可能隐藏程序细节的角度出发进行程序的设计
- private:当前类可以访问
成员变量
推荐使用
成员变量推荐使用private修饰,修饰之后要生成成员变量的访问器方法
get set
方法
- default:当前类可以访问 同一包中的其他类可以访问
- protected:当前类可以访问 同一包中的其他类可以访问 不同包中的子类可以访问
- public:当前工程中的所有类可以访问 推荐修饰
方法
成员方法
推荐使用public修饰
Static关键字:具有 记忆功能
修饰成员变量
被修饰的成员变量 称为类变量,所有类对象共享
- 静态的成员变量可以用对象名访问,也可以用类名直接访问
- static不能修饰局部变量
public static void main(String[] args) {
Teacher t = new Teacher();
t.setSex('女');
t.setSchool("佳木斯大学");
System.out.println(t.getSchool()+" "+t.getSex());
Teacher t2 = new Teacher();
System.out.println(t2.getSchool()+" "+t2.getSex());
}
修饰成员方法
被static修饰的成员方法叫做静态方法
- 静态方法可以用对象名调用 也可以用类名调用
- 静态方法只能访问静态成员变量
- 普通的成员方法既可以访问静态的成员变量,也可以访问非静态的成员变量
- 静态方法不能使用this关键字
- static不能修饰构造方法
修饰代码块
被static修饰的代码块称为静态代码块
- 当类信息载入时,会执行执行静态代码块,只会执行一次
- 普通代码块,每次创建对象时都会执行
- 静态代码块作用是针对
成员变量
初始化
类
public class Teacher {
private String name;
private char sex;
private String school;
// //类变量
// private static String school;
//构造器方法
public Teacher() {
}
public Teacher(String name, char sex, String school) {
this.name = name;
this.sex = sex;
this.school = school;
}
//访问器方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//静态方法
public static void test() {
System.out.println("这是一个静态方法");
}
//代码块
{
System.out.println("代码块");
}
//静态代码块
static {
System.out.println("这是静态代码块");
}
}
Test类
public class TestTeacher {
public static void main(String[] args) {
//调用静态变量
Teacher t = new Teacher();
t.setSex('女');
t.setSchool("佳木斯大学");
System.out.println(t.getSchool()+" "+t.getSex());
Teacher t2 = new Teacher();
System.out.println(t2.getSchool()+" "+t2.getSex());
//调用静态方法
Teacher t3 = new Teacher();
t3.test();
Teacher.test();
//调用静态代码块
Teacher teacher = new Teacher();
Teacher teacher1 = new Teacher();
}
}