java面向对象
来源:互联网 发布:sap软件 编辑:程序博客网 时间:2024/05/22 10:29
面向对象概念
举例:大象装进冰箱里面。
面向过程
我们打开冰箱
我们转入大象
我们关闭冰箱
对于面向过程思想,强调的是过程(动作)。
代表语言:c语言
面向对象
对于面向对象思想,强调的是对象(实体)
冰箱打开
冰箱存储
冰箱关闭
C++java c#
特点:
1 。面向对象就是一种常见的思想,符合人们的思考习惯
2 面向对象的出现,将复杂的问题简单化。
3 。面向对象的出现,将曾经的过程中的执行者,变成了对象中的指挥者。
注:我们就是面向过程的执行者,面向对象的指挥者(指挥new出来的对象执行方法,不用我们自己去执行了)
举例子:
连接支付宝:拿到他们的接口new出一个对象然他来实现所有的方法。
买电脑:带上老师,老师有这功能,去买电脑去让老师去做所有方法,我来指挥,老师去砍价我们不需要知道,主要成功了就可以了。
自己去做也可以,但是太麻烦了,所以要面向对象,不能面向过程。
我们回去要洗衣服做饭,但是我们可以找一个对象让她帮我们做做这些事情,如果找不到我们就自己new一个对象出来。
不要再自己做所有事了,自己去找一个对象来做这个功能,如果没有,千万不能自己写这个功能,我们要自己写个具有这功能的类。然后实现类,我能用,别人也能用。
面试经常被问你怎么理解面向对象(看你对面向对象的理解程度)
说:上面的三个例子,第一:符合我们现在的思考习惯。第二:让问题变得简单起来,第三:然我们从以前的面向过程的执行者变成了现在的指挥者,其实面试官你就是在用面向对象来思考问题,以你的弄了,你负责一个项目:从开发在写文档,写程序,到测试。一个人能完成,但是特别耗时间,为了提高效率,这时候就要用面向对象的思考方法,去找一些专业的人(对象)来帮你做这些事情,你只要指挥我们做,我们就会给你一个完美的答复,但是你不需要知道我们是怎么做的。万物皆对象不要说,没到那个境界。
有对象用对象,没对象造对象,维护各个对象的关系。
面向对象三个特征:只有符合这三个特征我们才能说使用了面向对象思想开发。
人开门?
哪个对象对这个动作最清楚就把该动作定义在该对象上面,
1.指挥car动起来
class Car{
int num;
String color;
void run(){
System.out.println(num+"..."+color);
}
}
public class CarDemo
{
public static void main(String[] args){
Car car = new Car();
car.num = 5;
car.color = "red";
car.run();
}
}
局部变量和成员变量的区别;
1 成员变量定义在类中,整个类中度可以访问
局部变量定义在函数中,语句,局部代码块中,只在所属的区域有效。
2 成员变量存在于堆内存的对象中
局部变量存在于栈内存中
3 成员变量随着对象的创建而存在,随着对象的消失而消失
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放(方法结束自动出去,需要再进来,前面已经出现过)
4 成员变量都有默认初始化值,
局部变量没有默认的初始化值。
匿名对象生成后马上就消除,因为没有指向,马上变成垃圾。
New Car().run();
1,当对象对方法仅进行一次调用的时候,就可以简化成匿名对象(因为属性在赋完值以后马上就变成了垃圾)
2 匿名对象可以作为实际参数进行传递。
Show(newCar()); 被使用了就不会马上变成垃圾
内存分配图。
封装:是指隐藏对象的属性和实现细节,仅仅对外提供访问方法
好处: 将变化隔离,便于使用,提高重用性
构造函数
特点:函数名和类名一样
不用定义返回值类型
没有具体的返回值
构造函数:创建对象是调用的函数,作用:可以给对象初始化。
创建函数都要通过构造函数初始化
没有定义构造函数,会自己调用空的
定义了构造函数,不会再去调用自己的空的构造方法
构造函数和一般函数的区别
构造函数是初始化的时候才调用,
一般函数是对象创建以后用对象来调用。
构造函数:对象创建时候,会调用一次
一般函数:对象创建以后,可以被调用多次
构造函数内存图解
注意:函数运行结束自动出栈,构造函数赋值成功了,就自动出栈,然后speak()进栈,方法结束后出栈。
构造函数细节
1
Person(String n){
Name = n;
}
和public voidsetName(String name){ name= name}去别
构造函数就只是在对象创建的时候调用一次,但是普通的方法可以在以后随便调用,他们度可以给对象的name赋值;
2 构造方法可以调用一般函数
This关键字
This:代表对象,代表哪个对象呢?当前对象
This就是所在函数所属对象的引用。
简单的说:就是哪个对象调用了this所在的函数,this就代表哪个对象。
class Constructor
{ String name;
int age;
public Constructor(String name){
name = name;
System.out.println(name);
}
}
public class ConstructorDemo1{
public static void main(String[] args){
Constructor c = new Constructor("xiaoming"); //输出:xiaoming
System.out.println(c.name); //输出:null
}
}
注意:如果name = name;变成this. name = name;则c.name就是xiaoming
注:p.speak();speak进栈,同时自己也有p对象的地址,system.out.println(name+”:”+age);这个时候其实是:this.name+”:”+this.age;因为在栈中没有同名的参数,所以就去堆里面找,如果栈中有同名的,不用this就会输出栈中的值
注:方法结束后面就马上出栈。
方法中如果不用this.属性值,当两个地方度一样的时候会遵循就近原则
注:可以用来this来调用构造函数,但是只能写在第一行,且不能再空的构造方法里面调用一个参数的构造方法,然后再一个参数的构造方法中调用空的构造方法,会造成栈内存溢出
注意:当前对象调用conpare方法,传入参数Constructor constructor,就有两个对象了,this就是当前对象。
Static关键字
特点:
1 static是一个修饰符,用于成员。
2 static修饰的成员被所有对象所共享。
3 static优先于对象存在,因为成员是随着类的加载而存在。
4 static的成员多了一种调用方法,可以被类名直接调用
5 static修饰的共享数据,对象存储的是特有数据。
成员变量和静态变量的区别
1 两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象被回收而消失
静态变量随着类加载而产生,随着类的消失而消失
2 调用方法不用
成员变量只能被成员调用
静态变量可以被成员调用,也可以被类调用,()但是不建议用成员调用,因为这样不容易区分是不是静态变量)
3 别名不一样
成员变量也成实例变量
静态变量称为类变量
4 数据存储的位置不一样
成员变量存储在堆内存的对象中,所以也叫对象的特有数据
静态变量数据存储在方法区中(共享数据区),所以也叫对象的共享数据
静态在使用中需要注意的细节
1 静态方法中不能使用非静态变量,因为静态方法在类产生就可以使用,但是非静态成员要在实例了类才会在对中生产;
2 静态方法中不可以使用this和super
3主函数是静态的函数。
主函数特殊之处:
1 格式是固定的(publicstatic void main(String[] args))除了args其他都是固定的
2 被jvm所识别和调用
Public:因为权限必须最大
Static:不需要对象,,直接额用主函数所属类名调用即可。
Void:主函数没有具体返回值
Main:函数名,不是关键字,只是被jvm识别的固定的名字。
String[] args:这是函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。
Java StaticDemo2 ,此时就已经把代码加载到了内存中,第以行需要类Person,则Person就自己加载到方法区。
方法区中也有一个静态的区和动态的区,静态区存static修饰的变量或者方法,非静态区存放非静态的变量或者方法。
栈中方法出栈顺序:1234,最后堆中没有引用,所以就被垃圾回收器回收了
静态什么时候用?
1 静态变量
2 静态函数
函数是否定用静态修饰,就参考一点,是否要调用非静态的成员,如果有非静态的成员,不能写成static修饰,简单来说,从源代码看,该功能是否需要访问非静态变量,如果需要,该功能就是非静态的。但是不需要,就可以吧该功能定义成静态的,当然也可以定义成非静态的,
但是非静态需要被调对象调用,而仅创建对象调用非静态,没有访问特有数据的方法,该对象的创建是没有意义的。
静态代码块:static{ 代码}
随着类的加载而进行初始化,一般做这个操作的都是静态方法和静态变量就进行唯一一次初始化(类.属性名字或者类.方法名字()),如果有非静态的,一般属性和方法都用对象初始化,通过对象的不同初始化出不同的内容。
面试:
{//构造代码块,可以给所有对象进行初始化
System.out.println("person run");
}
Person(){//是给对应的对象进行针对性的初始化
name = "baby";
System.out.println("wawawawa");
}
构造代码块:给所有对象进行初始化,只要调用构造方法就会执行该代码块里面的代码,
静态代码块:调用类.属性或者类.方法就会给执行静态代码块,给静态代码块里面的书信赋值,给对象进行初始化动作。
- java----Java面向对象
- java----Java面向对象
- java----Java面向对象
- java----Java面向对象
- java----Java面向对象
- java----Java面向对象
- 【java】java面向对象
- 【Java】Java面向对象
- java面向对象(一) 了解面向对象
- Java面向对象概述
- java面向对象
- JAVA面向对象
- JAVA 面向对象??
- Java面向对象特性
- Java面向对象特性
- java基础 面向对象
- Java面向对象程序设计
- java面向对象
- java学习 jstl标签中remove标签的使用
- 算法设计与结构基础作业第十八周
- Linux--进程间通信总结
- IOS APP启动优化路线图
- Fragment
- java面向对象
- helloword
- 数据库技术发展史
- testng和spring的整合
- CSS基础了解
- IOS APP启动优化-架构梳理
- Objective-C Method Swizzling 深入分析
- wordPress 安装
- 使用block遇到的问题