面向对象:
面向对象时程序一种设计方法,并不代表所有开发者认同面向对象,有人认为面向对象过于复杂,更喜欢基于函数式的编程。
面向对象的前身是面向过程,面向过程是解决问题,面向对象时模块化设计。
面向对象的特点:
- 封装性:内部的操作对外部而言不可见;
- 继承性:在上一辈的基础上继续发展;
- 多态性:最重要的环节,利用多态性才可以得到良好的设计。
在进行面向对象开发:OOA(面向对象分析),OOD(面向对象设计),OOP(面向对象编程)。
所有程序的开发原则都离不开实际生活,面向对象最大的特征可以进行生活的抽象。
类与对象简介:
类与对象是面向对象的核心所在,也是所有概念的基础。类本身属于引用数据类型。
类是一个共性的概念,对象就是一个具体的可以使用的事物。
在开发过程中一定先产生类,而后才可以产生对象,对象的所有操作行为都在类中进行了完整的定义。
类的组成:方法(操作的行为)、属性(变量,描述每一个对象的具体特点)
类与对象的定义与使用:
类的定义使用class关键字,
class 类型名称{
// 属性;
// 属性;
// 方法();
}
此时的方法不在由主类直接调用,而是通过对象调用。
范例:
class Person{ //定义一个类,类名称每个单词的首字母要求大写
String name; //表示人的姓名
int age;
public void info(){
System.out.println("name =" + name + ",age = " + age);
}
}
类中定义了两个属性一个方法,类定义完成之后不能直接使用,如果想使用类必须产生对象
对象的定义:
- 声明并实例化对象:类名称 对象名称 = new 类名称();
- 分布进行对象实例化:声明对象: 类名称 对象名称= null;
实例化对象: 对象名称 = new 类名称();
只有对象实例化之后才可以真正使用,而对象的使用时围绕类的
调用类中的属性:对象.属性 = 内容;
调用类中的方法:对象.方法();
只要出现关键字new,那么就有开辟内存,内存是不可能无限开辟的,性能调优是指调整的内存问题。
范例:
1.声明并实例化对象
public class TestDemo{
public static void main(String args[]){
//类名称 对象名称 = new 类名称()
Person pr = new Person(); //实例化对象
pr.name = "张三"; //设置对象的属性
pr.age = 18; //设置对象的属性
pr.info();
}
}
2.分布式声明实例化对象
public class TestDemo{
public static void main(String args[]){
//类名称 对象名称 = new 类名称()
Person pr = null; //声明对象
pr = new Person(); //实例化对象
pr.age = 18; //设置对象的属性
pr.info();
}
}
上述过程完成了对象的实例化,类的调用。
对象的产生分析:
对象是指引用类型,引用类型指的是内存空间操作。而对于现在的内存:堆内存空间和栈内存空间。
堆内存空间:保存真正的数据;保存的是对象的属性信息;
栈内存空间:保存的堆内存的地址(每次new一个对象都会出现一个新的地址),堆内存的操作权;如果想简化理解保存的 是对象的名称;
注意:所有对象(引用数据类型)必须在开辟内存空间后才可以执行。
public class TestDemo{
public static void main(String args[]){
//类名称 对象名称 = new 类名称()
Person pr = null; //声明对象
pr.info();
}
}
只声明了对象,没有开辟堆内存空间,程序在编译的时候不会产生任务语法错误,但是在执行的时候,会产生错误
java.lang.NullPointerException 在整个开发过程中会经常出现的异常,只有引用数据类型才会出现此类异常。
出现此类错误,就观察该行代码是否实例化对象。
对象引用传递分析:
引用的本质是别名,只不过是放在在栈内存之中,即一块堆内存可以被多个栈内存所指向。
class Person{ //定义一个类,类名称每个单词的首字母要求大写
String name; //表示人的姓名
int age;
public void info(){
System.out.println("name =" + name + ",age = " + age);
}
}
public class TestDemo{
public static void main(String args[]){
Person pr1 = new Person(); //实例化对象
pr1.name = "小于"; //设置对象的属性
pr1.age = 30; //设置对象的属性
Person pr2 = pr1; //采用同样的类型接收 //此过程是引用传递操作
pr2.name = "狗剩";
pr1.info();
}
}
输出的结果: name = "狗剩",age=“18”
class Person{ //定义一个类,类名称每个单词的首字母要求大写
String name; //表示人的姓名
int age;
public void info(){
System.out.println("name =" + name + ",age = " + age);
}
}
public class TestDemo{
public static void main(String args[]){
Person pr1 = new Person(); //实例化对象
Person pr2 = new Person(); //pr2和pr1都有各自的指向堆内存
pr1.name = "小于";
pr1.age = 30;
pr2.name = "张三";
pr2.age = 20;
pr2 = pr1; //首先将pr2指向的堆内容断开,pr2 原先的指向就变成了垃圾内存,并且将pr1 的指向
// 给了pr2
pr2.name = "狗剩";//改的就是pr1 的堆内容
pr1.info();
}
}
输出结果:name = "狗剩",age=30
pr2原先指向的堆内容为垃圾内存,开发过程中的垃圾空间指的是没有任何栈内存指向的堆内存空间,垃圾空间会不定期的被java 中的垃圾收集器(GC)实现空间的释放。