面向对象
1.面向对象的概念
2.理解面向对象
*面向对象其实是相对面向过程而言的,面向对象和面向过程都是一种思想,它们所强调的内容不一样。
*面向对象:强调的是功能的行为,将功能进行了封装成了对象,强调了具备功能的对象。
*面向对象是基于面向过程的
3.类与对象的关系
人开门:利用名词提炼法
人{
开门(门){
门.开();
}
}
门{
开(){
操作门轴等
}
}
4.面向对象的三大特征:封装、继承、多态。
以后开发其实就是找对象使用,没有对象就创建一个对象来使用,就像找女朋友一样,没有就自己找个,这里没有对象就自己建一个(当然也是要找适合的)。
找对象,建立对象,使用对象,并维护对象的关系。生活中的对象:张三,王五...
想要描述:提取对象中的共性内容,对具体的抽象。
反射到Java中,描述就是关键字class定义的类,而具体的对象就是对应Java在堆内存中是使用new关键字建立的实体。
类就是对现实生活中事物的描述,而对象就是这类事物实实在在存在的个体。
5.成员变量和局部变量的区别
1.作用范围:
成员变量作用于整个类中,局部变量只在某个范围内有效。(一般指的就是方法,语句体内)
2.在内存中的位置
成员变量随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中,而局部变量在方法被调用,或者语句被执行的时候存在,存储在栈内存中。
3.初始值
成员变量有默认初始值,局部变量没有默认初始值,使用前必须赋值。
6.匿名对象
匿名对象其实就是对象的简化形式
使用的两种情况:a.当对对象的方法仅进行一次的调用的时候;b.匿名对像可以作为实际参数进行传递
如果对一个对象进行多个成员调用,必须给这个对象起个名字
需求:汽车修配厂,对汽车进行改装,将来的车都改成黑车,三个轮胎。
public static void main(String[] args)
{
Car q = new Car();
show(q);
}
public static void show(Car c)
{
c.num = 3;
c.color = "black";
c.run();
}
封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
好处:将变化隔离;便于使用;提高重用性;提高安全性。
原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其访问
关键字private:封装在代码中的体现
(1)私有的意思,权限修饰符
(2)用来修饰成员变量和成员函数
(3)用private修饰的成员只在本类中有效
(4)私有是封装的一种体现
class Person
{
private int age;
public void setAge(int a)
{
if(a>0 && a<130)
age =a;
else
System.out.println("false age");
}
public int getAge()
{
return age;
}
void speak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//p.age = 20;//
p.setAge(20);
p.speak();
}
}
构造函数
特点:
1.函数名和类名相同
2.不用定义返回值类型
3.不用写return语句
作用:构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应的构造函数。
注意:
1.如果一个自定义类没有构造方法,系统会默认给出一个无参构造方法。
2.如果一个自定义类提供了构造方法,那么,系统将不再给出无参构造方法,这个时候,你可以不使用无参构造方法, 如果你想使用,那么,就必须手动给出无参构造方法。
建议:
一般情况下,我们的自定义类都要手动给出无参构造方法。
class Person1
{
private String name;
private int age;
Person1()
{
System.out.println("A:name="+name+",,age="+age);
cry();
}
Person1(String n)
{
name = n;
System.out.println("B:name="+name+",,age="+age);
cry();
}
Person1(String n,int a)
{
name = n;
age = a;
System.out.println("C:name="+name+",,age="+age);
cry();
}
public void cry()
{
System.out.println("cry..........");
}
}
class PersonDemo2
{
public static void main(String[]args)
{
Person1 p1 = new Person1();
Person1 p2 = new Person1("lisi");
Person1 p3 = new Person1("wangwu",10);
}
}
构造方法和成员方法的区别
A:格式区别
构造方法和类名相同,并且没有返回类型,也没有返回值。
普通成员方法可以任意起名,必须有返回类型,可以没有返回值。
B:作用区别
构造方法用于创建对象,并进行初始化值。
普通成员方法是用于完成特定功能的。
C:调用区别
构造方法是在创建对象时被调用的,一个对象建立,只调用一次相应构造函数
普通成员方法是由创建好的对象调用,可以调用多次
构造代码块:
作用:给对象初始化,对象一建立就执行,而且优先于构造函数执行
和构造函数的区别
构造代码块是给所有不同对象的共性进行统一初始化
构造函数是给对应的对象进行初始化构造代码块中定义的不同的对象共性的初始化内容。
this关键字
(1)this关键字代表本类对象的一个引用,谁调用this所在的方法,this就代表谁
(2)this的使用场景
A:用于区分同名成员变量和局部变量;
B:在定义函数时,该函数内部要用到调用该函数的对象时,因为此时对象还没建立,故this代表此对象
C:构造函数间调用
这个时候,this(参数)必须作为第一条语句存在。
Person p = new Person();在内存中做了哪些事情。
(1)将Person.class文件加载进内存中。
(2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
(3)在堆内存给对象分配空间。
(4)对对象中的成员进行默认初始化。
(5)对对象中的成员进行显示初始化。
(6)调用构造代码块对对象进行初始化。(如果没有就不执行)
(7)调用构造方法对对象进行初始化。对象初始化完毕。
(8)将对象的内存地址赋值给p变量,让p变量指向该对象。