java第一天:
如:一个木匠要做一个箱子
面向过程:不去想要去什么样的箱子,随需取用工具
面向对象:先想好要做的箱子,在去找到相对应的工具
面向对象的三大特征:封装,继承和多态
封装:对外部是不可见,保护类中的操作不被外部直接操作
继承:继承父类所拥有的
多态:根据传入的参数不同和参入的参数的个数不同,调用的方法也不同。
面向过程:比较专注于解决问题。
面向对象:集中于设计,分析问题来解决问题。
二、类与对象
类:是一个共性的产物,就像是一个模板,根据模板生产出需要的产品
对象:
总结:1.没有类就没有对象
2.没有对象类就不能使用
3.对象的所有的所有活动范围在类中已经定义出来了
三、类与对象的定义
类的组成:属性,方法。
属性与之前的变量是一样的,数据类型就是使用java的两种数据类型:基本数据类型、引用数据类型。
但是,此时在方法的定义上与之前直接使用主方法调用的时候声明不一致的是,不再出现tatic关键字。
建立一个类:里面建立两个属性和一个方法,方法里面写出两个属性的输出。建立一个测试类,建立main方法,new出一个新的对象,并且为对象来赋值和调用方法。
Person per =null;代表着建立了一个对象但是没有被实例化,就会出现异常,“空指针”
实际上对于对象的产生,也是与数组一样的,需要划分堆—栈空间的。
1,对象实际上是保存在栈内存的:Person per = null
2, 实例化之后对象会开辟对应的堆内存空间:per = new Person();
在堆内存中实际上存放的是对象的各个属性,因为对象中只能依靠属性的不同来区分。
内存的划分:
因为是声明了两个对象,所以在栈内存中开辟了两个空间,保存了两个对象,之后此两个对象分别实例化,只要一出现关键字“new”就表示要开辟新的内存空间。
引用传递
所谓引用传递:就是将堆内存空间的使用权交给了其他的对象,就相当于给堆内存空间起了一个别名。
Person per1=null;
Person per2=null;只是在栈中开辟了一个空间,堆内存中出现了空值。
per1 = per2,值得是两个对象同时指向了堆内存。
per1.name="张三"
per1.age=30,代表着给给堆内存赋值,输出的两个对象的结果都是一样的。
per2.age=33;是单纯的给per2.age的值赋值。最后输出的结果name="张三",age="3"
per2 = per1;指的是把per1赋给了per2,所以此时per2里面有两个堆内存空间,要实行一妻一夫制,有了一个新的所以要摒弃原有的。最后的一个就是在堆内存中就会产生垃圾。
从本程序中得到的结论总结:一个栈内存只能引用一个推内存空间,但是一个推内存中可以被多个栈内存所同时指向。
在Java中不用的内存空间就称为“垃圾空间”,垃圾空间要等待垃圾收集机制进行空间释放,垃圾收集机制成为“GC”;
二、封装性
在给对象赋值时,age属性为负数时,不会影响程序的运行。但是生活中,没有年龄会出现负数,所以不符合实际,哪怕年龄是0也是可以的。CSDN
因为在类中的操作都是都是外部可见的,可以直接访问,这时就可以通过private来封装。
封装属性:private 数据类型 属性名称 = 属性值;
封装方法:private 返回值类型 void 方法名(参数)
在访问中为了保证访问的时侯,访问的是本类中的方法,要加上this关键字,this.方法名称()。
五、类的图形表示
六、构造方法
在类中都存在一个构造方法,其目的是为类中的属性初始化的。
构造方法:方法名和类型相同,无返回值,连void也不能写。当使用关键字new的时候才会调用构造方法。系统会默认一个无参的构造方法,当再次声明一个有参的构造方法是都会把无参的构造方法给覆盖。
七、匿名对象
可以理解为给对象起了一个别名。例如:per = new Person.name;
八、多态
多态:某一个事物在不同时刻所表现出来的不同形态。例如:自己:在学校时学生,在家这就是一个孩子,但都是一个人。
实现多态的前提:1.要有继承,2.实现重写。3,父类引用子类的对象。
在多态中非静态的方法调用子类,其他的都是调用父类。
研究多态分了三种情况:
1. 多态的局部变量
在多态中,对于局部变量,调用父类的变量
2. 多态的局部方法
在多态中,对于局部方法,调用子类的方法
3. 多态的局部静态方法
在多态中,对于局部静态方法,调用父类的方法
在多态中,非静态方法调用子类,其他调用父类。
向上向下转型
自动的
强制的
1向下转型能够调用子类所独有的方法。
总结:多态就是子类和父类相互转换的过程。主要研究多态中方法和变量调用。多态的向上向下转型的意义就是能够让我们调用重写的方法和子类独有的方法。