面向对象01

1.什么是面向对象

面向对象和面向过程的思想有着本质上的区别:
作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维
你应该分析这个问题里面有哪些类和对象,这是第一点
然后再分析这些类和对象应该具有哪些属性和方法,这是第二点
最后分析类和类之间具体有什么关系,这是第三点
面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面
面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式
面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类,继承、聚合、多态
为什么要使用面向对象编程:
做软件苦苦追求的一种境界是可重用性,可扩展性。
如果是面向过程,一般情况是属性和方法它们是分开的,他们不是聚合的关系,不是合在一起的,这样要复用起来比较麻烦,复用的层次只是局限于方法这个层次上
而面向对象则不同,它是把属性和方法综合在一个里面。综合在一起复用的时候是整个对象进行复用
所以面向对象和面向过程相比,前者更加容易让我们达到可重用性

2.类

就是将我们具体的事物抽象出来
静态属性抽象成类的成员变量
动态属性抽象成类的成员方法

1 class Person {
2 private String name;
3 private int age;
4 ...说话,吃饭等成员方法    
5 }

3.成员变量和局部变量的区别

* A:在类中的位置不同
* 成员变量:在类中方法外
* 局部变量:在方法定义中或者方法声明上
* B:在内存中的位置不同
* 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
* 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
* C:生命周期不同
* 成员变量:随着对象的创建而存在,随着对象的消失而消失
* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值不同
* 成员变量:有默认初始化值
* 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意事项:
* 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则

1 String name;//成员变量
2 int num;//成员变量
3 public void speak() {
4 int num = 10;//局部变量
5 System.out.println(name);
6 System.out.println(num);
7 }

结果:
null
10

4.匿名对象

* A:什么是匿名对象
* 没有名字的对象
* B:匿名对象应用场景
* a:调用方法,仅仅只调用一次的时候。
* 那么,这种匿名调用有什么好处吗?
* 节省代码
* 注意:调用多次的时候,不适合。
匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。
匿名对象只适合对方法的一次调用,因为调用多次就会产生多个对象,不如用有名字的对象
下面的代码毫无意义:
new Car().color = "red";
new Car().num = 8;
new Car().run();
面试题:
匿名对象是否可以调用属性并赋值?有什么意义?
匿名对象可以调用属性,但是没有意义,因为调用后就变成垃圾
如果需要赋值还是用有名字对象

5.封装

* A:封装概述
* 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
* B:封装好处
* 隐藏实现细节,提供公共的访问方式
* 提高了代码的复用性
* 提高安全性
* C:封装原则
* 将不需要对外提供的内容都隐藏起来
* 把属性隐藏,提供公共方法对其访问
封装在代码中无处不在,代码中每一个entity类都是封装来的

6.关键字private

private关键字特点
* a:是一个权限修饰符
* b:可以修饰成员变量和成员方法
* c:被其修饰的成员只能在本类中被访问
案例演示
* 封装和private的应用:
* A:把成员变量用private修饰
* B:提供对应的getXxx()和setXxx()方法

 1 class Person {
 2   String name;
 3   private int age;
 4   set,get方法    
 5 }
 6 class Demo1_Person {
 7   public static void main(String[] args) {
 8   Person p1 = new Person();
 9   p1.name = "张三";//这样是可以赋值的    
10   p1.age = -17;//不能赋值,因为age属性是私有的,不能在其它类中被访问,这里只能调用set方法赋值    
11   }
12 }

7.关键字this

* A:this关键字特点
* 代表当前对象的引用
  this代表其所在函数所属对象的引用,哪个对象调用了this所在的函数,this就代表这个对象
* B:案例演示
* this的应用场景
* 用来区分成员变量和局部变量重名
案例:

1 class Person {
2     private String name;
3     private int age;    
4     public void setAge(int age) {//设置年龄
5         if (age > 0 && age < 200) {
6           this.age = age;//哪个对象来调用setAge()方法,this就代表哪个对象
7     }
8     }
9 }

8.构造方法

给对象的数据(属性)进行初始化
* B:构造方法格式特点
* a:方法名与类名相同
* b:没有返回值类型,连void都没有
* c:没有具体的返回值return;

 1 private String name;
 2 private int age;
 3 public Stu() {
 4 super();
 5 }
 6 public Stu(String name, int age) {
 7 super();
 8 this.name = name;
 9 this.age = age;
10 }

9.重载

定义:方法名相同,参数列表不一样的方法
无参构造有参构造就是重载

10.关键字static

意为静态
* A:static关键字的特点
* a:随着类的加载而加载
* b:优先于对象存在:随着字节码文件的加载而加载的,那时候还没有对象呢!
* c:被类的所有对象共享
* 举例:咱们班级的学生应该共用同一个班级编号。
* 其实这个特点也是在告诉我们什么时候使用静态?
* 如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的
* 举例:
* 饮水机(用静态修饰)
* 水杯(不能用静态修饰)
* 共性用静态,特性用非静态
* d:可以通过类名调用
* 其实它本身也可以通过对象名调用
* 推荐使用类名调用,在工具类中常用
* 静态修饰的内容一般我们称其为:与类相关的,类成员(静态变量:类变量,静态方法:类方法)

面试题:

在静态方法中可以出现this这个关键字吗?
显然是不能的,this指的是一个具体的对象,而静态在加载到内存时还没有具体的对象,静态是随着类的加载而加载的,静态比对象优先存在
静态方法只能访问静态的成员变量和静态的成员方法
怎样理解:

1 class Demo {
2     int num1 = 10;
3     static int num2 = 20;
4     public static void print1() {
5         System.out.println(num1);
6         //该方法与变量num2都是静态的,类创建后它们就创建了,然而这时还没有变量num1(该变量是成员变量,当对象创建的时候才会产生),怎么访问,所以在静态中只能访问静态
7         System.out.println(num2);
8     }
9 }        

静态变量和成员变量的区别:
* 静态变量也叫类变量,成员变量也叫对象变量
* A:所属不同
* 静态变量属于类,所以也称为为类变量
* 成员变量属于对象,所以也称为实例变量(对象变量)
* B:内存中位置不同
* 静态变量存储于方法区的静态区
* 成员变量存储于堆内存
* C:内存出现时间不同
* 静态变量随着类的加载而加载,随着类的消失而消失
* 成员变量随着对象的创建而存在,随着对象的消失而消失
* D:调用不同
* 静态变量可以通过类名调用,也可以通过对象调用
* 成员变量只能通过对象名调用

猜你喜欢

转载自www.cnblogs.com/jaro/p/8975083.html