1、面向对象基本概念
其本质是以建立模型体现出来的抽象思维过程和面向对象的方法(百度百科)
是一种编程思维,也是一种思考问题的方式
如何建立面向对象的思维呢?
1、先整体,再局部
2、先抽象,再具体
3、能做什么,再怎么做
2、类与对象
类:类是一种分类,一个类别,一个模板,它描述一类对象的行为和状态,是一组具有相同特性(属性)与行为(方法)的事物集合
对象:是一个个性的产物,是一个个体的特征,是类的一个实例,有状态和行为
3、类和对象的定义格式
类的定义:
class 类名称{
属性名称;
返回值类型 方法名称(){}
}
对象的定义:
一个类要想真正的进行操作,则必须依靠对象,对象的定义格式如下:
类名称 对象名称 = new 类名称() ;
如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式:
访问类中的属性:对象.属性 ;
调用类中的方法:对象.方法();
在java中对象声明有两种含义
声明对象:Horse horse= null; ; //表示声明了一个对象,但是此对象无法使用,horse没有具体的内存指向
实例化对象:horse= new Horse() ;// 表示实例化了对象,可以使用
horse.eat(); //通过对象调用方法
new Horse().eat();//匿名对象调用方法
4、对象与内存分析
new 关键字表示创建一个对象
new 关键字表示实例化对象
new 关键字表示申请内存空间
注意:如果使用一个没有申请内存空间的对象,会报空指针异常:java.lang.NullPointerException
(1)new关键字:表示向内存申请空间,也表示实例化一个对象,创建一个对象。
(2)一个对象在内存中的大小,由该对象的所有属性所占的内存大小的总和。引用类型变量在32位系统上占4个字节,在64位系统上占8个字节。加上而外的对象隐性数据所占的大小。
(3)相同的类型才可以赋值
(4)不同的引用,指向同一个对象,任何一个引用改变对象的值,其它引用都会反映出来。
(5)编程时要注意的问题,在确定不使用对象时,要尽早释放对象:引用=null
(6)当一个堆中的对象没有被任何引用变量所指向时,该对象会被JVM 的GC 程序认为是垃圾对象,从而被回收
5、封装性
封装性的概念
封装性是面向对象思想的三大特征之一,封装就是隐藏实现细节,仅对外提供访问接口。实现细节部份包装、隐藏起来的方法。
封装有:属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装…
封装的好处:模块化、信息隐藏、代码重用、插件化易于调试、具有安全性
封装的缺点:会影响执行效率
封装之前:属性都可以直接访问和修改
class Person{
String name;
int age;
}
封装之后:
class Person{
//属性是成员变量,私有化属性,使得其他对象不能直接访问属性
private String name;
private int age;
//参数及方法内定义的变量是局部变量
public void setName(String name){
this.name = name;}
public String getName(){
return name;}
}
成员变量和局部变量的区别
a、在类中的位置不同
成员变量:在类中定义
局部变量:在方法中定义或者方法的参数
b、在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
c、生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
d、初始化值不同
成员变量:有默认初始化值,引用类型默认为null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
6、构造方法
无参构造方法:
public Dog(){} //如果一个类没有定义构造方法,则默认无无参构造,如果有定义有参构造,最好再显示定义一个无参构造方法
带参构造方法:
public Dog(String name){
this.name = name;
}
多参构造方法:
public Dog(String name,int age){
this.name = name;
this.age = age;
}
(1)构造方法名称与类名相同,没有返回值声明(包括 void)
(2)构造方法用于初始化数据(属性)
(3)每一个类中都会有一个默认的无参的构造方法
(4)如果类中有显示的构造方法,那么默认构造方法将无效
(5)如果有显示的构造方法,还想保留默认构造 方法,需要显示的写出来。
(6)构造方法可以有多个,但参数不一样,称为构造方法的重载
(7)在构造方法中调用另一个构造方法,使用this(...),该句代码必须在第一句。
(8)构造方法之间的调用,必须要有出口。
(9)给对象初始化数据可以使用构造方法或setter方法,通常情况下,两者都会保留。
(10)一个好的编程习惯是要保留默认的构造方法。(为了方便一些框架代码使用反射来创建对象)
(11)private Dog(){},构造方法私有化,当我们的需求是为了 保正该类只有一个对象时(单例模式就是私有化构造器)。
7、this关键字
this关键字指向的是当前对象的引用
调用类中的属性:this.属性名称,指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)
调用类中的方法:this.方法名称,用来访问本类的成员方法
调用类构造方法:this();访问本类的构造方法,()中可以有参数的 如果有参数 就是调用指定的有参构造
注意:
1.this() 不能使用在普通方法中,只能写在构造方法中
2.必须是构造方法中的第一条语句
8、值传递与引用传递?
首先,注意:在java中只有按值传递,并没有所谓的按引用传递
java数据类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)
a、基本数据类型的按值传递

public class Swap {
public static void main(String[] args) {
int x = 10;
int y = 20;
swap(x, y);
System.out.println("x(2) = " + x);
System.out.println("y(2) = " + y);
}
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
System.out.println("x(1) = " + x);
System.out.println("y(1) = " + y);
}
}
/*输出
x(1) = 20
y(1) = 10
x(2) = 10
y(2) = 20

main函数调用swap函数来交换 x,y的值,然而调用函数之后发现main中x,y的值并未交换。