黑马程序员--面向对象1

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
此版块包含的知识点较多:

  • 面向对象概述
  • 类与对象关系
  • 局部变量与成员变量
  • 匿名对象
  • 封装概述(好处、原则)
  • Java中的四种权限(private、public、默认、protected)
  • 构造函数、构造代码块
  • this关键字(应用、在函数间调用、this语句)
  • static关键字(main函数、什么时候用、静态代码块、工具类)
  • 对象初始化过程

面向对象是相对面向过程而言的。
面向对象和面向过程都是一种思想。
面向过程强调的是功能行为。
面向对象将功能封装进对象,强调具备了功能的对象
面向对象是基于面向过程的。

以大象放入冰箱的例子

面向过程:
    1.打开冰箱             打开
    2.把大象放进冰箱        存储
    3.把冰箱门关上          关闭
    强调的是过程当中所涉及的行为也就是功能。
面向对象:
    1.冰箱.打开
    2.冰箱.存储
    3.冰箱.关闭
    强调的是具备功能的对象 

面向对象将复杂问题简单化,将功能封装,我们的角色由执行者转变为指挥者。
面向对象开发其实就是在找对象使用,没有对象就创建一个对象。找对象、建立对象、使用对象、维护对象关系就是以后我们要做的工作。

面向对象比较禅道的说法:万物皆对象。
面向对象三大特性:封装、继承、多态
类和对象的关系:

类就是对现实生活中事物的描述。
对象就是这类事物实实在在存在的个体。通过new操作符产生。在堆内存中。

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

局部变量定义在方法或语句中,成员变量定义在方法或函数外边
区别:成员变量作用于整个类中,存放在堆内存中;
如果未初始化成员变量,系统会自动初始化。规则如下:
        数字:0 布尔:false char:\u0000 引用类型:null
局部变量作用于函数或语句中,存放在栈内存中。
使用时,必须手动初始化

匿名对象:
匿名对象是对象的简化形式。
匿名对象的两种使用情况:

1.当对对象方法仅进行一次调用时
2.匿名对象可以作为实际参数进行传递

面向对象特性–封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离、便于使用、提高安全性、提高重用性。
原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

函数、类、包、框架、private等都是Java封装的形式。

封装的一种实现方式:使用private关键字

    private私有 权限修饰符,修饰类中成员(成员函数或成员方法)
之所以提供访问方式,就是因为可以在访问中加入逻辑判断语句对访问的数据进行操作,提高代码健壮性。
private只在本类中有效。

Java中的四种权限修饰符:

Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。如果不在同一个包内,子类无法访问到父类默认修饰的成员。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

构造函数:

特点:
1.函数名与类名相同
2.不用定义返回值类型
3.不可以写return语句
作用:
给对象初始化
一个类中如果不定义构造函数、系统会默认提供一个空参数的构造函数,如果自定义了,默认的构造函数就没有了。可以定义多个构造函数重载。
什么时候定义构造函数呢?
    当分析事物时,该事物存在具备了一些特性或行为,那么将这些内容定义在构造函数中。需不需要位未知内容参与运算,需要就定义参数。

构造函数与普通函数的区别:

写法上:
构造函数的名称与类名相同
构造函数不需要定义返回值类型
构造函数不可以写return语句语句
运行上:
构造函数是在对象一建立就运行,给对象初始化。
普通函数是对象调用才执行,给对象添加对象具备的功能。
一个对象建立构造函数只能运行一次,普通函数可以被对象调用多次

构造代码块:
形式

    class Person
    {
        {} //构造代码块
        person (){}//构造函数
    }       
作用:给对象进行初始化,对象一建立就运行,且优先于构造函数运行。
与构造函数的区别:构造代码块是给所有对象同一初始化,构造函数是给对应对象初始化。
eg:有的孩子一出生就有名字有的没有,但是每个孩子一出生就哭,那么哭就定义在构造代码块中。
构造代码块中定义的是对象共性的初始化内容。

this关键字:
this代表它所在函数所属对象的引用。

简单来讲,就是哪个对象调用了this所在的函数this就代表哪个对象。this关键字用于区分局部变量和成员变量同名的情况。
应用:
    在定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this表示这个对象,但凡本类功能内部使用到了本类对象,都用this表示。

this() 
this语句 用于构造函数之间的互相调用。
this语句只能定义在构造函数的第一行。因为初始化要先执行
class Person
{   private String name;
    person()
    {
        System.out.println("haha");
    }
    person(String name)
    {
        this();
        this.name=name;
    }
}

static关键字:

static关键字用于修饰成员(成员函数或成员变量)
成员被static修饰后,就多了个调用方式,除了可以被对象调用以外,还可以被类名调用。类名.静态成员。
特点:
1.随着类的加载而加载
    随着类的消失而消失,生命周期最长
2.优先于对象存在
    静态先存在,对象后存在
3.被所有的对象所共享
4.可以直接被类名调用

实例变量和类变量的区别:

1.存放位置
类变量随着类的加载而存放在方法区中
实例变量随着对象的建立而存放于对内存中
2.生命周期:
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失。

静态使用注意事项:

1.静态方法只能访问静态成员
    非静态方法即可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
    因为静态优先于对象存在,所以静态方法中不可以出现this
3.主函数是静态的

静态有利有弊

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

静态什么时候使用?

从两方面下手:
因为静态修饰的内容有成员变量和函数。
什么时候定义静态变量呢?
当对象中出现共享数据时,该数据被静态所修饰
对象中的特有数据要定义在非静态存在于堆内存中

什么时候定义静态函数呢?

当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

主函数:
public static void main(String[] args)
主函数,是一个特殊的函数。作为程序的入口,可以被jvm调用。

主函数的定义 :

public:代表着该函数访问权限是最大的
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值
main:不是关键字,但是是一个特殊的单词,可以被jvm识别
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。

对象的初始化过程:

以Person类为例:

class Person
{
    private static String country="cn";
    private String name="haha";
    private int age;

    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }

    Person(){}
    {
        System.out.println(name+"..."+age);
    }

    public void speak(){
        System.out.println(name+"...."+age);
    }

    public void setName(String name)
    {
        this.name=name;
    }

    public static void showCountry()
    {
        System.out.println("country="+country);
    }
}

class  PersonDemo
{
    public static void main(String[] args) 
    {
        Person p=new Person("zhangsan",50);
        p.saeName("lisi");
    }
}
/*
    Person p=new Person("zhangsan",50);
    这句话都执行了那些动作呢?

1.new 用到了Person.class;所以会先找Person.class文件并加载进内存;
2.如果有static代码块应该先执行静态代码块,给Person.class类进行初始化;
3.在堆内存中开辟内存空间,分配内存地址
4.在堆内存中建立对象特有属性,并进行默认初始化;
5.对属性进行显示初始化
6.对对象进行构造代码块初始化
7.对对象进行对应构造函数初始化
8.将内存地址付给栈内存中的p变量

*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值