面向对象1

来源:互联网 发布:筑巢软件骗局 编辑:程序博客网 时间:2024/06/05 16:51
面向对象:
 简单的理解是一种思想。强调的对象相对于过程而言。
 1类和对象的关系:
   类就是:对现实生活中事物的描述
   对象:就是这类事物实实在在的个体相当于一个实例
   映射到java中类就是一个类就是一个class,是一个描述
   对象就是具体new出来的在堆内存中存放的实体。
 2成员变量和局部变量以及作用范围与位置
   描述事物:其实是在描述事物的属性和行为,属性和行为成为这个类的成员变量和成员方法
   成员变量,局部变量
   范围:成员变量作用于这个对象(类)中,局部变量作用于当前方法中,或当前语句中
   位置:成员变量在堆内存中,局部变量在
 3匿名对象
匿名对象是对象的简化形式
可以作为实参传递,也可作为一次调用。
eg. new Car().run();
 4.封装
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
将变化隔离;(内部怎么做不用管)
便于使用;
提高可重用性;
提高安全性。
原则:
将不需要对外提供的内容都隐藏起来;
把属性都隐藏,提供公共方法对其访问。
    private :用于修饰类中的成员变量或成员方法,私有只有在本类中有效

之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。提高代码的健壮性。

5.构造函数
特点:函数名与类名相同;
 不用定义返回值就连void也不要写 不可以写return(不可以写带有返回值的return但可以只写return)
对象一建立就会调用与之对应的够赞函数,构造函数的作用可用来做对象的初始化。

当一个类中没有定义构造函数时,那么系统就会默认加入一个空的构造函数。
当定义任意构造函数时,系统就不会自动创建空参构造函数。
注意:多个构造函数是以重载的方式体现的
一般方法和构造方法区别:
1构造方法是在一建立就运行的方法是初始化对象。
而一般方法是调用时才使用。
2一个对象建立,构造函数只运行一次。
一般方法可以被多次调用
构造函数应用方式:一般在初始化对象特性或行为,写在构造函数中
构造函数也是可以被私有化的。当被private修饰,外界是无法创建对象的即无法new Object();
6.构造代码块
作用:给对象进行初始化。对象一建立,就运行,优先于构造函数执行。
那么和构造函数区别:
构造代码块,是给所有对象进行统一初始化的。
而构造函数是给对应的对象初始化。
即构造代码块是给类初始化,是初始化不同对象的共性部分。

new Object();
调用构造方法,先初始化成员(变量)-- 初始化代码块-- 构造函数。(eclipse 调试可做校验)
7.this关键字
public void setXXX(String name) {
this.name = name;
// name = name ;
}

    1.用于区分成员变量和局部变量;注意:name = name 两个name 都是局部的,当 name = n;时 name局部没有才在成员中找。


this 代表本类的对象;
那么this 到底代表哪一个对象:this 代表所在函数所属对象的引用。即哪个对象在调用this所在的对象,this就是哪个对象。
this可省略。

this.m1(); // this 可省略

eg.
public boolean compare(Person p){
return this.age == p.age;
}

2.构造函数之间的调用可以用this
注意:this(args)只能在构造函数第一句。而且不能调用两次。
Person(String name, int age) {
this(name);
// this(age); 报错
}

Person(String name, int age) {
this.name = "";
// this(name); 报错 因为先调用一个参数的构造函数,应该是先进执行构造函数,开始初始化成员变量,之前是不能写任何语句。
}
8.static 关键字 
静态:static
用法:是一个修饰符,用于修饰也只能修饰成员(变量,方法)而不能修饰局部
可以直接用类名.静态成员调用
static修饰的成员是独一份的,是属于该类的而不是某一成员的
注意:特有内容随着对象存储,此时不要使用static 关键字
引入内存中的方法区(共享区,数据区)
这里边存放类中的共享方法,静态成员等。

特点:
1随着类的加载而加载,随着类的消失而消失(一直注入在内存当中)
2 优先于对象存在
3 被所有对象所共享
4 可以直接被类名所调用

实例变量和类变量的区别:
1存放位置:
类变量存在于数据区中
实例变量存在于堆内存中
2生命周期:
类变量声明周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失

使用方法:
1.静态方法只能访问静态成员(方法和变量)
eg. 
String  name 
static void f() {
syso(name) // exception :要知道name前省略了this而static是类周期存在,而这时还没有对象
m();//同上即this都没被初始化过怎么访问。。

}
void m() {}
2 非静态方法可以访问非静态成员及静态成员
(静态的已经存在)
3 静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以出现this


静态的利弊:
利:对对象的共享数据进行单独空间的存储,节省空间,独一份;可被类名直接调用
弊:生命周期过长,访问出现局限性。(静态只能访问静态)

9主函数main
1.可以重写,重载(这个不恰当),递归,总之可是为被jvm调用的普通函数
2 可手动命令行传参(开发时没用过) java Test sada dasdasd asd as asd sa da
格式:类名后跟参数 空格隔开


10什么时候使用静态(多用于工具类中:其中若考虑到程序更严谨,可以私有化构造方法)
什么时候定义静态变量?当对象中出现共享数据时
非静态变量:特有的
什么时候定义静态方法?当功能内部没有访问到非静态数据(对象的特有数据,该功能可定义成静态)

11 静态代码块(相当于类的初始化,JVM运行期间只初始化一次)
static {// 静态代码块
...
}

{// 构造代码块:初始化对象用的;构造代码块可以调用静态成员(静态成员有限构造代码块)

}
特点:随着类的加载而执行,只执行一次;并优先于主函数main执行 用于给类初始化




12 Person p = new Person() 都做了写什么:
1.new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2.执行静态代码块(初始化类),给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化,
7.对对象进行与之对应的构造函数初始化
8.将内存地址付给内存中的p变量。

补充:
A1 extends B1 ; 
A1 a = new A1();
若涉及到继承,总是先 加载!父类,执行父类静态代码块(静态代码块只执行一次)而后初始化子类(当前类)的静态!成员
而后执行当前类的静态代码块,当new A1()时,先new 父类对象即执行B1的构造代码块(每new一次均执行,相当于初始化对象),
执行父类的构造方法,初始化子类(A1)的成员变量,执行子类(A1)的构造代码块,执行子类的构造方法。
eg.
A1 extends B1 ; 
A1 a = new A1();
---------new用到了A1.calss,B1.class,所以对先找到对应的class文件并加载到内存中(这个阶段只执行一次)
------------------类加载开始
1.总是先加载父类;
1.1.总是先初始化静态成员变量。
1.2.而后初始化类,即执行静态代码块
2.加载本类
2.1.初始化本类的静态成员
2.2.执行静态代码块
---------类加载初始化阶段完毕
---------在堆内存中开辟空间,分配内存地址。初始化对象。
------------------初始化成员而后执行构造对象代码块,最后进行构造函数的初始化
------------------对象初始化开始
3.总是先构造父类对象
3.1.初始化成员变量
3.2.初始化对象,即执行构造代码块
3.3.构造特殊的对象即调用构造方法
4.构造自身类
4.1.初始化成员变量
4.2.初始化对象,即执行构造代码块
4.3.构造特殊的对象,即调用构造方法
---------对象构建完毕!
---------将(堆)内存地址付给(栈)内存中的变量。
若而后还new对象,则重复34操作即只在堆内存中开辟空间即可


0 0
原创粉丝点击