初学者,如有错误请指正。
课程是中软国际的java培训。(本节还没学完,学完再补充)
一、面向对象
POP面向过程开发:通过数据和调用流程,来完成一切开发任务。
OOP面向对象开发:以面向对象的思想,将数据和功能封装到类中,以人类日常的思维模式来分析问题,解决问题。
对象:属性 + 行为 (数据 + 函数)
是具体的个体,类是抽象出来的泛指的一个范围。
类:是具有共同属性和行为的对象的集合;定义了对象的属性和方法。
通过类可以实例化多个该类的对象,每个对象的属性值不同,可以说类好比设计图纸,而对象好比根据图纸建设出来的多栋楼房。类是Java程序的基本组成单位。
分析过程先有对象后有类,开发过程先有类后有对象。
面向对象:一切皆为对象。对象就是:属性 + 行为(对于开发语言来讲,也就是数据 + 方法)。类是所有一类相似对象的共同属性、行为抽象而来的。在日常生活中,先有对象、后有类;在开发语言中,先有类、后有对象。面向对象思想有三大特征:封装、继承、多态。
eg:银行卡是一个对象,属性是账号密码,行为是存款取款转账
面向对象的开发过程,实际上就是对象和对象之间的通信过程。
封装:先说装,集合性,把属性(数据)和方法(函数)封装到类体内的过程。再说封,封闭性,把属性、方法按照对外公开的二级别,保护起来
继承:继承是为了代码复用
客观自然规律中,子类是可以多继承的(有多个父类)。比如,人继承自父母。
在Java中,为了避免多继承带来的混乱,因此只支持单继承。Java中所有类的顶层父类为Object
从类型涵盖范围角度来讲,父类范围大(类型更加抽象),子类范围小(类型更加具体)
多态:(待补充)
二、类和对象
类的结构:
属性:对象数据的描述
方法:对象的行为
构造方法:用于实例化对象
内部类:在类体重声明的类
块:分为静态块,实例块
public和private设置变量的区别:
类内,public的东西是别人改,不需要经过自身同意;但是private,通过set,是自己改,需要经过自己同意,自己想怎么改怎么改。
一般使用private的变量会安全一些。
public class Studen {
private String name;//属性:学生的姓名
public void study(){
System.out.println("好好学习天天向上!");
}
}
public class MainClass {
public static void main(String[] args) {
//1.Student类
//左侧引用类型变量student,给其赋值,指向一个Student类型的对象
Studen studen = new Studen();
//通过引用,当做对象使用
studen.study();
//不能直接调用类的动作,必须得是对象的动作
//Studen.study();
}
}
构造方法
构造方法:对类实例化,创建对象;名称与类名完全一致,且不能写出返回值(无返回值,且不能写出void)
构造方法的作用:创建对象并初始化。
在创建对象时,必须调用类的某种构造方法。
一个类,默认提供了一个无参的构造方法。同时,在一个类提供了明确的构造方法后,默认的构造方法就不存在了。
容易混淆的概念:默认构造方法 ≠ 无参构造方法。
//无参构造方法,名称必须与类名完全一致,不能写出任何返回值
public Worker(){
name = "老张";
}
//有参构造方法,名称必须与类名完全一致,不能写出任何返回值
public Worker(int id, String name, String job, float sal){
//this表示当前对象的引用。this.属性名,为强调引用的是属性(而不是参数)
this.id = id;
this.name = name;
this.job = job;
this.sal = sal;
}
面向对象和面向过程的区别
面向过程侧重于数据和执行流程
面向对象侧重于:类的设计(功能、数据的角色分类),再按逻辑流程调用多个对象完成最终功能。
爬华山,按面向过程分析:
1. 统计人员,哪些人报名爬华山
2. 研究出行方式、门票、物资等所需的费用
3. 统一收费,交给管理者统一使用
4. 确定出行时间、地点
5. 集合、坐车、到华山门口
6. 统一购买门票,进山
7. 登顶后统计人数,统一下山
8. 山门口集合,坐车回西安
爬华山,按面向对象分析:
1. 分配人员责任:
财务总管(负责收费和支出)
车管(负责联系大巴车,负责出行路线等事宜)
领队(负责总体游玩事宜的安排和指挥)
队员(负责听从安排,完成游玩)
2. 由领队统计所有出行人员
由财务总管估算每人费用,领队通知各人将费用交予财务总管处
由车管预定大巴车,在财务总管处领费用,支付交通费
3. 出发当天,领队在集合点统计所有人数。车管安排好所有车辆事宜。财务总管确保资金齐备
4. 在山门口集合后,领队统计人数,财务总管出钱买票。车管安排大巴车在停车场等待
5. 统一进山,爬山
6. 登顶后领队确保人员齐全,准备统一下山
7. 山门口集合,领队再次确保人员齐全。车管安排车辆将所有人员上车
8. 坐车回西安
重载
1. 必须在同一个类中
2. 方法同名不同参(也就是方法名一样,参数不一样)
3. 参数不一样的三种情况:
1. 参数个数不一样
2. 参数类型不一样
3. 参数类型顺序不一样
4. 返回值不足为是否重载的依据
5. 同一个类中的多个重载方法,应当提供类似的功能
//参数类型不一样的方法重载
public float sum(float x,float y){
return x+y;
}
public int sum(int x,int y){
return x+y;
}
//参数类型顺序不一样的方法重载
public float sum(int x,float y){
return x+y;
}
public float sum(float x,int y){
return x+y;
}
Java中变量、对象的内存模型:
堆栈模型
栈:函数调用时,所有参数、临时变量(局部变量),全部存放在栈中。
栈是倒序使用的,先分配的变量内存,使用的是底部内存,也称“入栈”。再分配的变量内存,后“入栈”。
栈中的变量内存使用完毕后,会“出栈”。
入栈、出栈的顺序符合:FILO(先进后出)、或LIFO(后进先出)原则。
堆:一切new出来的对象,都在堆里。堆是最大的分区(可以为几GB)。
覆盖
子类覆盖父类
1. 只能是子类方法覆盖父类方法(有父子类关系)
2. 同名、同参(参数类型、顺序完全一致)、同返回值(返回值类型一样)
3. 对于访问修饰符:子类方法的访问范围应当比父类更“开发”
4. 子类也可以覆盖掉父类的属性
5. 对于覆盖掉的父类属性和方法,子类完全继承了。只是对于子类“不可见”,隐藏了!但是仍然占据空间
从类型角度上来讲,父类靠上,更加抽象(涵盖范围更广)
父类的方法,往往也是比较抽象,不够具体
从类型角度上来讲,子类靠下,更加具体(涵盖范围更窄)
因此,子类很有可能需要覆盖父类的方法(用于改进、完善更具体的功能
引用
this关键字
代表当前对象的引用
通过this关键字,能够引用当前对象的属性和方法
通过this关键字,能够在构造方法中(只能是第一行)调用当前类的其他形式构造方法
private Girl self;//这个属性,保存了当前对象的引用,只是一个引用,指向了对象的地址
super关键字
super关键字:在子类构造方法中要调用父类的构造方法
super是当前子类对象中的父类部分的引用(还是子类型,只不过能够引用父类部分)
通过super关键字,能够在子类中,引用父类的属性和方法
通过super关键字,能够在子类构造方法中(只能是第一行),调用父类构造方法
super();//子类构造方法的第一句,永远在调用父类某个形式的构造方法(默认调用父类无参构造方法)