面向对象
面向对象的三大特性:封装性,继承性和多态性。
-
封装性:封装是面向对象的的方法所遵循的一个重要原则。封装机制在程序中的表现是,把描述对象属性的变量及实现对象功能的方法合在一起,定义为一个程序单元,并保证外界不能任意改变其内部的属性值,也不能任意调动其内部的功能方法。封装机制的另一个特点是,为封装在一个整体内的变量及方法规定了不同级别的“可见性”或访问全权限。
-
继承性:面向对象的继承机制,大大增强了程序代码的可重复性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序的修改扩充提供了便利。
-
多态性:多态是指允许程序中出现重名现象。包括方法重载和对象多态两种形式的多态。
类和对象
1.类的定义语法
class Book{
String title;
double price;
public void getInfo(){
System.out.println("图书名称" + title + "图书价格" + price);
}
}
2.堆内存和栈内存
-
堆内存(heap):保存每一个对象的属性内容,堆内存需要用关键字new开辟(即:只要看见了关键字new不管何种情况下,都表示要开辟新的堆内存空间),如果一个对象没有对应的堆内存指向,将无法使用。
-
栈内存(stack):保存的是一块堆内存的地址数值,可以把它想象成一个int型变量,每一块栈内存只能保留一块堆内存地址。
要使用对象的时候需要 声明+实例化对象,如果没有进行实例化,会出现空指向异常。
引用传递的初步分析
引用传递的核心概念只有一点:一块堆内存空间可以同时被多个栈内存共同指向,则每个栈内存都可以修改同一块堆内存空间的属性值。
垃圾收集器(Garbage Collector):GC在Java中的核心功能就是对内存中的对象进行内存的分配和回收。所以GC不只对垃圾空间进行回收,GC还决定了内存的分配。
构造方法
构造方法的核心作用是:在类对象实例化时设置属性的初始化内容。构造方法是为属性初始化准备的。一个类中至少保留有一个构造方法。
类中编写顺序:首先编写属性(必须封装,同时提供setter、getter的普通方法),然后编写构造方法,最后编写普通方法。
匿名对象
没有栈内存指向的堆内存空间就是一个匿名对象。
简单的Java类
class Emp{ //定义一个雇员类
private int empno; //雇员编号
private String ename; //雇员姓名
private String job; //雇员职位
private double sal; //基本工资
private double comm; //佣金
public Emp(){ //明确定义一个无参构造
}
public Emp(int eno,String ena,String j,double s,double c){
empno = eno;
ename = ena;
job = j;
sal = s;
comm = c;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setJob(String job) {
this.job = job;
}
public void setSal(double sal) {
this.sal = sal;
}
public void setComm(double comm) {
this.comm = comm;
}
public int getEmpno() {
return empno;
}
public String getEname() {
return ename;
}
public String getJob() {
return job;
}
public double getSal() {
return sal;
}
public double getComm() {
return comm;
}
public String getInfo(){
return "雇员编号:"+ empno + "\n" +
"雇员姓名" + ename + "\n" +
"雇员职位" + job + "\n" +
"雇员工资" + sal + "\n" +
"佣 金" + comm;
}
}
数组
使用数组时需要声明并开辟数组。
数组本身属于引用数据类型,所以在数组的操作中依然可以进行内存空间的引用传递。
数组有一个最大的缺点———长度不能被改变,所以在开发中不会直接应用数组,但是会利用数组的概念(利用类集框架来解决)。
数组操作方法
String类的基本概念
-
== 在整个Java中只要时引用数据类型一定会存在内存地址,而 == 可以用于所有的引用数据类型的比较,但是比较的并不会是内容,永远都只是地址的数值内容。这样的操作往往只会出现在判断两个不同的对象是否指向同一内存空间的操作上。
-
字符串常量就是String的匿名对象
-
如果使用直接赋值的实例化操作方式,设置的内容时一致的话,即使没有发生直接的对象引用操作,他们也是指向的时同一块堆内存。
-
使用构造方法的方式开辟的字符串对象,实际上会开辟两块空间,一个是匿名对象自动开辟的堆内存空间,一个是关键字new开辟的内存空间,其中有一块空间将成为垃圾。 而且使用构造方法开辟的字符串对象是需要进行手工如池的。
-
字符串一旦定义则不可改变。String内容的更改属于引用关系的变更,在引用关系变更的期间将会产生垃圾空间,所以String类的内容不要做过多频繁的修改。
String类采用的设计模式为共享设计模式,在JVM的底层实际上会存在一个对象池,当代码中使用了直接赋值的定义方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保护。如果后续还会有其他的String类对象也采用了直接赋值的方式,并且设置了同样的内容时,将不会开辟出新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。