第一章:类与对象
第一课:什么是面向对象编程
1.面向对象编程和面向过程编程的区别
无论是面向过程编程还是面向对象编程都是用于解决一个实际问题,当面向过程编程在解决一个问题时,更多的情况下是不会做出重用的设计思考的;而面向对象的设计形式为模块化设计,并且可以进行重用配置,在整个面向对象的设计里面更多考虑的是标准。
2.面向对象设计的三个主要特征
封装性:内部的操作对外部来说不可见,当内部的操作都不可以直接使用的时候才是安全的。
继承性:在已有的结构基础上继续对功能进行扩充
多态性:是在继承性的基础上扩充的概念,指的是类型的转换处理。
第二课:类与对象
1.类与对象的概念
类是对某一类事物共性的抽象概念,而对象描述的是一个具体的产物。先有类后有对象。
例:人可以看成是一个类,小学生李明就是一个对象。
2.类的组成
成员属性(Field):可简化为属性
例:一个人的年龄,身高,体重
操作方法(Method):定义对象具有的处理行为
例:一个人可以游泳,唱歌。跳舞
第三课:类与对象的定义与使用
1.类的定义
范例:
//定义一个类
class Person{
private String name;//类的成员属性姓名
private int age;//类的成员属性年龄
/**
* 类的方法,输出姓名和年龄
*/
public void Tell(){
System.out.println(age+" "+name);
}
}
在范例中定义了一个类Person,类里面定义了成员属性name(姓名),age(年龄),以及类的操作方法Tell(输出成员属性)。
2.对象的定义
方法一:类的名称 对象名称=new 类的名称();
方法二:类的名称 对象名称=null;
对象名称=new 类的名称();(推荐使用)
范例:
//对象的定义方式一
Person person=new Person();
//对象的定义方式二
Person person1=null;
person1=new Person();
3.类与对象的使用
范例:
//对象的定义方式一
Person person=new Person();
//给对象1赋值
person.name="李明";
person.age=18;
//使用对象1调用类的方法
person.Tell();
//对象的定义方式二
Person person1=null;
person1=new Person();
//给对象2赋值
person1.name="张三";
person1.age=20;
//使用对象2调用类的方法
person1.Tell();
4.完整代码
public class Main {
public static void main(String[] args) {
//对象的定义方式一
Person person=new Person();
//给对象1赋值
person.name="李明";
person.age=18;
//使用对象1调用类的方法
person.Tell();
//对象的定义方式二
Person person1=null;
person1=new Person();
//给对象2赋值
person1.name="张三";
person1.age=20;
//使用对象2调用类的方法
person1.Tell();
}
}
//定义一个类
class Person{
public String name;//类的成员属性姓名
public int age;//类的成员属性年龄
/**
* 类的方法,输出姓名和年龄
*/
public void Tell(){
System.out.println(age+" "+name);
}
}
输出结果:
第四课:对象内存分析
Java中的类属于引用数据类型,引用数据类型主要保存在堆内存和栈内存中。
堆内存:保存引用数据类型的具体对象信息;堆内存的空间开辟是通过new关键字进行的。
栈内存:保存的是堆内存的地址信息;即通过地址信息找到堆内存,而后找到对象的具体内容。
范例:
1.对象的定义方式一
//对象的定义方式一
Person person=new Person();
//给对象1赋值
person.name="李明";
person.age=18;
//使用对象1调用类的方法
person.Tell();
分析:代码“Person person=new Person();”中new Person()开辟了一个堆内存空间,代码“Person person”把开辟的堆内存的地址信息以person为名称存入在栈内存中(见下图)。
代码“person.name="李明";person.age=18;”是以栈内存中名称为person的对象所代表的地址在堆内存中寻找地址,并给地址内的具体信息赋值。
2.对象的定义方式二
//对象的定义方式二
Person person1=null;
person1=new Person();
//给对象2赋值
person1.name="张三";
person1.age=20;
//使用对象2调用类的方法
person1.Tell();
内存分析:代码“Person person1=null;”是先开辟一个栈内存名称为person1,但这个时候person1并没有指向任何堆内存空间(图一),这个时候对象person1不能给对象信息赋值,否者会报指针异常。只有当代码“person1=new Person();”执行后,person1才能指向具体的堆内存空间(图二)。给对象赋值的内存结构流程基本方法与方式一相同。
第五课:对象引用分析
1.引用传递(方式一)
代码:
Person person=new Person();
//给对象person赋值
person.name="李明";
person.age=18;
//引用传递
Person person1=person;
person1.age=80;
person.Tell();
输出结果:
分析:代码“ Person person=new Person();”表示在堆内存中开辟了一片内存空间,在栈内存中有一个person指向开辟的堆内存。代码“ person.name="李明";person.age=18;”给推内存中的对象信息赋值,代码“ Person person1=person;”表示把对象person所指向的堆内存地址赋值给person1,那么person1和person就指向同一片堆地址空间;代码“person1.age=80;”是利用栈内存对象person1修改对应的堆内存的对象信息。此过程结束后person和person1都会指向同一片地址空间。
2.引用传递(方式二)
代码:
public static void main(String[] args) {
Person person=new Person();
//给对象person赋值
person.name="李明";
person.age=18;
//引用传递
// Person person1=person;
tempPerson(person);
person.Tell();
}
public static void tempPerson(Person person1){
person1.age=80;
}
}
输出结果:
方式二是通过方法用参数进行引用传递,与方式一不同的是,方法结束后,person1指向堆内存的连线会断开,也就等于person1只有在方法中才会指向堆内存。
完整代码:
public class Main {
public static void main(String[] args) {
Person person=new Person();
//给对象person赋值
person.name="李明";
person.age=18;
//引用传递
// Person person1=person;
tempPerson(person);
person.Tell();
}
public static void tempPerson(Person person1){
person1.age=80;
}
}
//定义一个类
class Person{
public String name;//类的成员属性姓名
public int age;//类的成员属性年龄
/**
* 类的方法,输出姓名和年龄
*/
public void Tell(){
System.out.println(age+" "+name);
}
}
第六课:引用与垃圾产生分析
垃圾的产生:所谓的垃圾空间指的是没有栈内存指向的堆内存空间就是垃圾空间;所有的垃圾空间会被GC(垃圾收集器)不定期回收。
范例:
代码:
Person person1=new Person();
//给对象person1赋值
person1.name="李明";
person1.age=18;
Person person2=new Person();
person2.name="张三";
person2.age=20;
person2=person1;
person2.age=50;
person1.Tell();
分析:这段代码分定义了类Person的两个实例person1和person2,并给两个实例都做了赋值,接着把person1的值赋给person2,赋值后的person2就不再指向原地址,而是和person1指向同一地址,原来的地址空间就变成了垃圾空间。
输出结果: