黑马程序员——java基础----面向对象(一)思想和封装特性

时间:2023-02-13 23:49:18

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

java 面向对象思想,封装

(一)面向对象的理解

面向对象是一种思想,那么怎么理解这种思想呢?

比如,我们玩一款时下最火的竞技类游戏(英雄联盟),从建立小号开始,我们要不断的升级,满级后,我们还要打排位分。 而升级和排位这两个过程,我们要花费大量的时间来完成,在效率和成绩方面我们不敢保证。如果我们找代练来完成这两个过程,相对于我而言是不是就轻松了许多?
                                            玩游戏升级                        代练升级                   
                                                                  ------------>   
                                            玩游戏排位                        代练排位

由上面可以看出:
       1,我们从面向过程(玩游戏),变成了面向对象(代练),所以面向对象是相对于面向过程,并且是基于面向过程的,也就说,是以面向过程为基础的。       
       2,我们从执行者变成了指挥者,简化了操作流程,节省了时间。
面向对象是java编程语言的核心,有三大特征: 封装,继承,多态。

(二)封装 1,封装:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
个人理解:   
       其实就是将日常中事物的属性和行为封装到一个类中,想用到事物的行为时候,就把这些行为对外暴露出去,提供给别人使用。别人不知道的属性和行为就封装隐藏在类的内部。
封装的好处:
        1,将变化隔离。
        2,便于使用。          3,提高重用性。          4,提供安全性。
2,什么是类?
      我们都知道对象是被创建出来的,而类就是告知系统(Java虚拟机)如何创建对象的蓝图,创建出来的对象拥有哪些数据,这些数据是公有的供外部存取还是私有的仅在内部存取它有哪些方法,这些方法是公有的供外部调用的还是私有的仅在内部调用的.这些信息,都是书写在类中,让系统按照这个蓝图创建类的实例.

总结一句话:类是图纸是模板,对象就是根据这个模板所创建出来的实例和实体。
示例:
<span style="font-size:14px;">//长方形类的设计蓝图-- Rec类
class Rec</span>
{
//长方形的属性,长和宽。
private int chang;
private int kuan;
//获取长方形面积的方法
public int getMianJi()
{
return chang*kuan;
}
//获取长方形周长的方法
public int getZhouChang()
{
return (chang+kuan)*2;
}
//设置长方形的边长方法
public void setChang(int chang)
{
this.chang = chang;
}
//设置长方形宽度的方法
public void setKuan(int kuan)
{
this.kuan = kuan;
}
}

class Demo1
{
public static void main(String[] args)
{
//根据 长方形的设计蓝图-- Rec类,创建 Rec类的对象
Rec r = new Rec();
r.setChang(20);//设置长方形的长
r.setKuan(10);//设置长方形的宽
int c = r.getZhouChang();//获取长方形的周长
System.out.println("长方形的周长:"+c);
int m = r.getMianJi();//获取长方形的面积
System.out.println("长方形的面积:"+m);
}
}
3,类的代码构成及类的初始化顺序
  (1)成员变量:在类中定义的变量叫(类的)成员变量。描述的是类的属性。
private String name;//姓名
private String age;//年龄
  (2)成员方法:在类中定义的方法叫(类的成员方法)。描述的是类的行为。
//设置名字
public void setName()
{
return name;
}
(3)构造方法:方法名和类名相同,而且没有返回值,也没有void关键字。如果不写,系统将提供一个共有的无参数的构造方法。
class Person
{
Person(){}//Person类的无参数构造方法。
}

//构造方法的功能:创建对象,初始化。

Person p = new Person();//创建一个对象。
4)类的初始化顺序: 静态成员或静态语句块-->非静态成员或非静态语句块-->构造方法
4,封装在代码上的体现
        封装在代码的上体现主要分为:可见性的4个范围和4个关键字。 (1)可见性的4个范围
        private:类内部可见。
        默认不加任何可见性关键字:类内部可见,包内可见。
        protected:类内部可见,包内可见,外包子类可见。
        public:所有都可见。

使用思想:方法用public,根据需要缩小范围。变量用private,根据需要扩大范围。
(2)static静态关键字
        被static修饰的成员叫静态成员(包括成员变量和成员方法),静态成员属于类,通过"类名.成员"的方式来调用。
          静态成员只属于类,并且随着类的加载而加载,优先于对象存在,被所有对象共享。
        不被static修饰的成员叫非静态成员,非静态成员属于对象通过" 对象.成员"的方式来调用。
        非静态成员属于每一个对象,每一个对象都有自己的一份。
静态使用注意事项:
        静态方法只能访问静态成员。非静态方法即可访问静态页可以访问非静态。
        静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this。
        主函数是静态
静态的利与弊:
        利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每个对象中都存一份。 
        弊:生命周期过长。访问出现局限性。(静态只能访问静态)。
(3)final关键字
        final修饰变量:变量不能被修改。称为常量。 
        注意:如果用final修饰成员变量,必须在声明的同时初始化成员变量。
        final修饰方法:方法不能被覆写。
        final修饰类:该类不能被继承。(String类就是被final修饰的)
(4)this和super关键字
        this:看上去,是用于区*部变量和成员变量同名的情况。
        this:就代表本类的对象,到底代表哪一个呢?
        简单的说:哪个对象在调用this所在的函数,this就代表哪个对象。
        this的应用:构造方法中初始化。调用当前类的构造方法来保证入口一致。 

示例:
  //雇员类
class Employee{
//成员变量
private String name;
private int age;
private boolean isMale;
//有参数构造方法
Employee(String name,int age,boolean isMale){
this.name=name;
this.age=age;
this.isMale=isMale;
}
//有参数构造方法
Employee(String name){
this(name,0,true);//调用本类的构造方法保证入口一致
}
//无参数构造方法
Employee(){
this("",0,true);//调用本类的构造方法保证入口一致
}
}
super:表示父类的引用。应用:调用父类的构造方法。当发生复写时,想调用父类的方法 。  
子类会默认调用父类的无参数的构造方法。 
5,知识点补充     (1)引用与实例的关系: 一个变量可以引用零个或一个实例,一个实例可以被零个或多个变量引用
    (2)实例变量和类变量的区别:
                   存放位置:类变量随着类的加载而存在于方法区中。
                   实例变量随着对象的建立而存在于堆内存中。
                   生命周期:类变量生命周期最长,叫做随着类的消失而消失
                   实例变量生命周期随着对象的消失而消失。