第三章:面向对象【java语言的核心机制,最重要的内容,java语言的特色】
1、面向过程与面向对象的区别
2、面向对象的三大特征
3、类和对象的概念
4、类得定义【从这里开始编写代码】
1、面向过程与面向对象的区别;
什么叫做面向过程;核心是因果关系关注的整个过程是如何走的,在过程中没有任何独立体,没有独立体。各个子系统之间是通过因果关系连接起来的
如果一个因果关系出现问题,程序全体出问题。相当于串联。
优点是:对于业务逻辑比较简单的程序,可以快速开发,前期投入投入成本很低
缺点是:软件元素耦合度低,只要一个环出现问题,整个一个系统收到影响。没有独立体概念,所以组件无法进行复用。
什么叫做面向对象;将几个独立功能的个体凑起来,实现一个场景下的功能。各个体之间的关联程度极低。
相当于搭积木,关注点是功能而不是因果关系。
优点:模块间耦合度低,扩展力强,可复用,更容易解决现实世界中更复杂的逻辑
缺点:前期投入成本高,需要进行抽取独立体抽取,大量的系统分析与设计。
c语言面向过程,c++半面向对象,java纯面向对象
2、面向对象的三大特征:
封装:
继承:
多态:
所有的面向对象的编程语言中都有这三大特征
面向对象的整个生命周期中;
面向对象分析:OOA
面向对象的设计:OOD
面向对象的编程:OOP
3、类和对象的概念;
什么是类:现实中不存在,是人类大脑抽象思维总结的结果。是一个模板,是一个概念。
类代表了一类事物
对象A和对像B中具有共同特征,进行抽象总结出一个模板,这个模板被称为类
什么是对象:对象是实际存在的个体。现实世界当中实际存在。
先有对象之后人类思考对象后,发现对象与对象之间有相同的特征。在大脑中形成了模板就是类。
java程序员可以通过java代码来表述一个类
java程序中有了类的定义
然后通过类可以创建对象
有了对象之后,可以让对象直接协作起来形成一个系统。
类到对象的过程叫做实例化
对象又叫实例/instance
对象到类的过程叫做抽象
类描述的是对象的共同特征。
共同特征例如:身高特征
这个身高特征在访问的时候,必须先创建对象,通过对象去访问这个特征。
因为这个特征具体到某个对象上之后,志不同。有的对象身高1.80,有的对象身高2.80。
一个类主要描绘什么信息呢?
一个类主要描述的是状态+动作。
状态:名字,身高,性别,年龄。
动作:吃,唱歌,跳舞,学习。
类
{
属性;//描述对象的状态信息
方法;//描述对象的动作信息
}
注意:状态和动作当具体到某个具体的动作之后,发现可能结果不太一样。
对象和对象之间有共同特征,具体到对象之后由数据的差异。
类的定义://属于引用数据类型。
语法结构:
[修饰符列表]class 类名
{
}
学生类,描述所有学生对象的共同特征;
public class student
{
//学生对象有哪些状态信息;
//属性通常采用变量的方式来定义
//在类体当中方法体外的变量属于成员变量,可以不赋初值,默认赋值为0;
int 学号
string 姓名
boolean 性别
int 年龄
string 住址
}
//基本数据类型
/*
byte
short
int
long
float
double
boolean
char
*/
//引用数据类型
/*
String
Student
User
Product
Customer
*/
写一个类:
//学生类:
//学生类是一个模板,描述所有学生的共同特征【状态+行为】
//当前类只描述学生的状态信息【属性】
public class Student//类型名就是student
{
//类体=属性+方法
//属性【存储数据采用变量的形式】
//每个学生的学号不同,要访问这个学号必须先创建对象,通过对象去访问学号信息
//学号信息不能直接通过类去访问,只有通过实例才能访问具体的学号。
//对象又被称为实例,实例变量又被称为对象变量
//不创建对象,这个no变量的内存空间不存在的,只有创建了对象,这个no变量内存空间才会创建。
int no;
//姓名
string name;
//姓名
int age;
//年龄
boolean sex
}
public class ootest01
{
public static void main (string[] args)
{
//通过一个类实例N个对象
//实例化对象的语法:new类名();
//new预算符的作用是创建对象,在jvm堆内存当中开辟新的内存空间。
//方法区内存;在类加载的时候,进行压栈操作,class字节码代码片段被加载到该内存空间当中。(只有一个方法区内存)
//栈内存(存储局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。(每个线程就会有一个方法区内存)
//堆内存:new的对象在堆内存中储存。(堆内存只有一个)
//student就是一个数据类型
//s是一个变量名
//s是一个局部变量,在栈内存中存储。存储了一个地址,指向堆内存中的对象,类似于指针。(这种将对象地址赋值给变量的方式称为引用)
//new student()是一个学生对象,被保存在s中存储的内存里。在堆内存中。
//在student对象中,其所有实例变量根据数据的类型赋初始默认值。
//什么是对象?new运算符在堆内存中开辟出的内存空间成为对象。
//什么是引用?引用是一个变量,只不过这个变量保存了另一个java对象的内存地址。
//堆内存中的数据必须通过引用进行数据操作。不能直接操作堆内存,因为java中没有指针。
//程序员只能通过引用去访问崔内存当中对象内部的实例变量
student s=new Student()
//访问实例变量的语法格式;
//读取数据:引用.变量名
//修改数据:引用.变量名=值
int stuNo=s.no;
string stuName=s.name;
boolean stusex=s.sex;
int stuAge=s.sex;
string stuAddr=s.addr;
//通过变量赋值
system.println("stuName"+s.name);
//直接读取数据
s.no=1;
s.age=20;
s.name=jake;
//修改对象的数据
//总结:s是一个引用,s同时是一个局部变量,student变量的数据类型。
//局部变量在栈内存中存储,成员变量中的实例变量在堆内存的java对象内存储
//实例变量是一个对象一份,100个对象有100份
//类似于system.out.println(student.age);的写法是错误的因为只能通过对象才能访问堆内存中的实例变量数据值。
}
}
public class Address
{
//城市
string city;
//用户名
string jiedao;
//家庭住址
}
public class user
{
//用户编号
int no;
//用户名
string name;
//家庭住址
Address addr;//引用另一个类作为数据类型定义对象变量。
}
public class OOTest02
{
public class static void main(string[] args)
{
//创建uesr对象
//u是局部变量
//u是一个引用,引用是指保存指向堆内存对象变量地址的一个变量
uesr u=new uesr();
addr=u.Address.city;//访问一个类中另一个类属性的,将主方法中的类中的属性定义为另一个类的数据类型。
}
}
public class OOTest02
{
public class static void main(string[] args)
{
//创建uesr对象
//u是局部变量
//u是一个引用,引用是指保存指向堆内存对象变量地址的一个变量
uesr u=new uesr();//创建一个新的对象数据类型为uesr,使用类user()类;
Address a=new Address();//创建一个新的对象数据类型为Address,使用类address()类;
u.addr=a;//将a对象作为u的一个属性值赋值给addr
//也就是说a的地址可以作为给u.addr,让其指向Address()
system.out.println(u.addr.city);
a.city="天津";
system.out.println(u.addr.city);
//输出结果是null和天津;
//因为u.addr.city是将city的地址存储在addr中,u.addr的地址有存储在a中,此时addr和a都指向city,因此当a.city的值变动时
}
}
//结婚
public class husband
{
int name;
int w
}
public class husband
{
int name;
int h
}
public class OOTest
{
public static void main(string[]args)
{
//创建一个丈夫对象
Husband huangxiaoming=new husband();
huangxiaoming.name="黄晓明";
//创建一个妻子对象
Wife baby=new Wife();
baby.name="baby"
//结婚【能通过丈夫找到妻子,通过妻子也可以找到丈夫】
huangxiaoming.w=baby;//黄晓明的妻子是baby这个对象
baby.h=huangXiaoMing;
//的道义上“黄晓明”的妻子的名字
system.out.println(huangxiaoming.name+"的妻子名字叫"+baby.name);//没有说明baby这个名字是黄晓明的妻子的名字
system.out.println(huangxiaoming.name+"的妻子名字叫"+huangxiaoming.w.name);//可以说明baby这个名字是黄晓明的妻子的名字
}
}
总结:1、jvm主要包括三块内存空间;栈内存,堆内存,方法区内存
2、堆内存和方法区内存各一个,一个线程一个栈内存
3、方法调用时,该方法所需要的内存空间中分配,成为压栈,方法执行结束之后,该方法所属的内存空间释放,成为弹栈。
4、栈中主要存储的是方法体当中的局部变量
5、方法的代码片段以及整个类的代码片段都被存储到方法区内存当中,在类加载的时候这些代码片段会被载入
6、在程序执行过程中使用new运算符创建的java对象,存储在堆内存当中,对象内部有实例变量,所以实例变量存储在堆内存当中。
7、变量分类:
局部变量【方法体中声明】
成员变量【方法体外声明】
实例变量【前边修饰符没有static】
静态变量【前边修饰符中有static】
8、静态变量存储在方法区内存当中【先背会】
9、三个内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存
10、垃圾回收器【自动垃圾回收机制,GC机制】,什么时候会考虑将某个java对象的内存回收呢?
当堆内存当中的java对象成为垃圾数据的时候,会被垃圾回收器回收。
什么时候堆内存中的java对象会变成垃圾呢?
没有更多的引用指向它的时候
这个对象无法被访问,因为访问对象只能通过引用的方式访问。
public class Customer
{
int id;
}
public class OOTest
{
public static void main(string[]args)
{
Customer c=new customer();
System.out.println(c.id)
c=null;
//以下程序编译可以通过,因为符合语法
//运行出现空指针异常。
//空引用访问“实例”相关数据一定会出现空指针异常,因为此时引用中的实例的地址被清空。
//控制异常的名字是java.lang.NullPointException
}
}
public class Student
{
int number;
String name;
Computer diannao;
}
public class Computer
{
String PinPai;
String xinghao;
String color;
}
public class OOTest//类名必须大写的,所以使用类名关键字必须首字母大写,一个类就是一个可用数据类型。
{
public static void main(string[] args)
{
Student S1=new Student();
S1.name="小明";
Student S2=new Student();
Student S3=new Student();
Computer c1=new Computer();
Computer c2=new Computer();
c2.PinPai="联想";
Computer c3=new Computer();
S1.diannao=c2
System.out.println(S1.name"的电脑"S1.diannao)
}
}
关联关系:a含有b,a的类中含有b
public class OOTEST
{
Student b=new Student();
}
继承关系:a是b,