面向对象编程(OOP)
面向过程是一个线性的思维方法,按顺序解决问题。
而面向对象是分类的思维模式,把打的问题分成几个类,然后再用面向过程的思想对这些分类进行单独思考。适用于处理复杂问题及需要多人处理的问题。
总结:
面向对象编程(Object-Oriented Programming ,OOP)
本质:以类的形式组织代码,以对象的形式封装数据。
抽象:把共同点抽取出来。例如学生对象,可以抽取其学号等来表示。
类是对象的抽象,在编程时先要写类,然后再在main函数中进行类的调用(用new来新建一个对象)
带异常的方法:
return 和 break的区别:
方法的调用:
静态方法:方法中带有static ,在其他类中调用时可以直接用 类名.方法名 进行调用。
非静态方法:方法中不带有static ,在其他类中调用时要用new方法实体化这个类(即创建一个对象)
在静态方法中调用非静态方法出现异常是因为:静态方法和类一起加载(比较早),而非静态方法在实例化之后才存在(较晚)。
方法中的参数为形式参数,而实例化对象后的调用时的参数为实际参数
值传递和引用传递:
什么是局部变量、全局变量、静态变量 ???
全局:具有文件作用域的变量
静态:具有静态存储期或内部链接属性
局部:具有函数或块作用域的变量
基本数据类型和局部变量存放在栈中,用完就消失。
静态变量放在方法区;实例(成员)变量放在堆中;局部变量(参数)放在栈中。
值传递:java为值传递
解析:方法change中的a为形式参数,而main函数中的a是实际参数。
形参改变不能带给实参(因为这两个a是两个不同的东西,形参a为局部变量,出了change方法会在栈中被清除,不能带出给实参) 要注意的是,方法中return a是返回了a的值 ——>10,而不是返
回了形参a。只有拿实参a去接收方法返回的值,才能改变实参a的值。
结果:
引用传递:实例指向对象,但是本质还是值传递
在demo2类中写了一个change方法,参数是一个Person类的对象,修改该对象的name属性为"tzy"。 对象用的是引用传递,main方法中a为引用变量名,其指向的是a在堆中的地址。调用change方法时改变的是a在堆中的name属性,堆中的改变在出了方法时不会被清除,所以name改变了。
创建对象时的内存分析:
方法区属于堆,里面存了各个类(引用的模板)和静态方法区以及静态变量,在加载时是最先加载的(所以类和静态方法可以被其他对象调用)。栈里面存放的是方法和引用变量名(栈中的引用变量名 指向的是堆中实例的地址)。当new了一个实例时,会从方法区引用类,然后在对象中创建一个实例,栈中的引用变量名 引用的是堆里面的实例。
类和对象的创建:
类的创建:
一个类里面会包含属性(字段)和方法
PS:因为类是抽象的,在创建类的时候,属性不能够在类的创建时赋值(但是类在创建一个对象时会进行默认初始化和对构造器的调用 例如String类型默认为null,int类型默认为0)。而对象是类的一个实体,在类实例化后产生一个具体事例后,可以对事例进行赋值。
this.name的中this指的是类被实例化后,当前的实例。
对象的创建:
类是用来组织代码的!而每个具体的对象是对数据的封装!
构造器:
作用:
1.用于初始化值(在实例化的时候 给属性附一个初始值)
2.使用new关键字的时候,本质是在调用构造器
特点:
1.必须和类名相同
2.不能反回值
PS:1.一旦定义了有参构造,无参就必须显示定义
2. this.xxx后面xxx的内容为类中的,而不是形参
一个空的类中,什么都不写,他也会有一个方法。
如下Person类中,会隐式定义一个Person()方法
但是一旦定义了有参构造,无参就必须显示定义
类与对象总结:
除了基本类型(8个),其他的都算引用类型。 对象是通过引用来操作的:栈--->堆(栈中的引用变量指向的是对象的地址)