黑马程序员,Java基础知识三:面向对象

面向对象的概念

请说说你认为什么是面向对象?相信很多人在面试时都会被问到这道题,所谓”有一千个读者,就会有一千个哈姆雷特“,大家的答案都不尽相同,而我会这么说:

面向对象是一种思想,它是相对于面向过程而言的。在c和c++中,他们都有着面向过程的思想,所谓面向过程,强调的是功能的行为,比如汽车在路上行驶,它强调”行驶“这个事件,而不是汽车本身。相反,面向对象则是强调具备了功能的对象。比如这辆会动的车,比如有制冷功能的冰箱。在面向对象的思想中,一切事物皆为对象,通过面向对象这种方式,将现实中的事物都抽象为对象,把事物间的关系都抽象成类与类之间的继承,实现等。在面向对象的开发过程中实际就是在不断的创建对象,使用对象和指挥对象去做事情,并且我们关心的是如何去管理维护对象之间的关系。面向对象有三个特征:封装,继承,多态。封装指的是将对象的属性和实现的细节都隐藏,然后提供公共方法对其访问。

类的定义

生活中描述事物无非就是描述事物的属性和行为。比如人的身高,体重等属性,有说话,打球等行为。

而在Java中,用class来描述事物也是如此,属性:对应类中的成员变量。行为:对应类中的成员函数。定义类,其实就是在定义类中的成员。(成员函数和成员变量)

成员变量和局部变量有什么不同呢?

成员变量

1.成员变量是定义在类中的,在整个类中都可以被访问。

2.成员变量随着对象的建立而建立,存在于对象所在的堆内存中。

3.成员变量有默认初始化值。

局部变量

1.局部变量只定义在局部范围内,如:函数内,语句内等。

2.局部变量存在于栈内存中。

3.作用的范围结束,变量空间会自动释放。

4.局部变量没有默认初始化值。

创建对象的实例;

class Car //对Car这类事物进行描述
{
  String color = "red";
   int num = 4;
   void show()
   {
    System.out.println("color="+color+"..num="+num);
   }
}
class CarDemo
{
  public static void main(String[] args)
{
    Car  c  = new Car(); //建立对象
    c.color = "black";  //对对象的属性进行修改
    c.show();   //使用对象的功能。

匿名对象

匿名对象是对对象的简化形式

匿名对象有两种使用情况;

1.当对对象方法仅进行一次调用时

2.匿名对象可以作为实际参数进行传递时

new Car().show();


封装

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

      2.把属性都隐藏,然后提供公共方法对其访问。
注意:私有private不等于封装,它只是封装的一种表现形式。

    class AddMethod{  
        public static void main (String[] args){  
             int[] a  ={1,5,1,3,5,4,6,98,87,10};  
             System.out.println("最大值为:"+getMax (a));  
        }   
        public static int getMax(int[] arr) {  
            int max = arr[0];  
            for (int i : arr) {  
                max = (max > i) ? max : i;  
            }  
            return max;  
        }  



在这段代码中我封装了add这个方法,让它成为这个类的一个功能,能重复被调用。

private关键字

private是一个权限修饰符。

用于修饰成员(成员变量和成员函数)

被私有化的成员只有在本类中有效。

常用之一:

将成员变量私有化,然后对外提供对应的get,set方法对其进行访问。这样提高了对数据访问的安全性。

构造函数

当我们在分析事物,定义一个类时,该事物具备一些特性属性时,我们将这些内容定义在构造函数中。
在对象一建立时就会调用与之对应的构造函数,如果在一个类中没有定义构造函数时,那么系统会默认在该类中创建一个空参数的构造函数。
特点:1.构造函数名与类名相同;
            2.不需要定义该函数的返回值类型;
            3.不可以在构造函数中写return语句;
作用:构造函数是给对象进行初始化的。一个对象的建立,只运行一次构造函数。
注意:1.默认构造函数的特点:它是系统为没有自定义构造函数的类创建的空参数构造函数,如果已经在类中定义了构造函数,则不再有默认的构造函数。
            2.多个构造函数是以重载的形式存在的。

构造代码块

构造代码块是给类中所有对象进行统一初始化的构造函数,它写在类块的最上端,而且优先于构造函数的而执行。
格式:

{
   构造代码块内容;
 }

静态代码块

静态代码块是用来给类进行初始化的,优先于主函数而存在,它随着类的加载而执行,而且,只执行一次。

格式:

static{

       静态代码块内容;

       }


this关键字

this关键字:this代表本类对象,代表它所在的函数所属对象的引用。简单的说就是,哪个对象在调用this所在的函数,this就代表哪个对象。
this的应用:
     当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
     另有别于this.方法()的使用方式:this语句,例如:this(name),这是用于构造函数之间进行互相调用的,只能在构造函数之间,而且只能定义在构造函数的第一行。

    class Person  
    {  
        private String name;  
        private int age;  
        Person(int age)  
        {  
            this.age = age;  
        }  
        Person(String name)  
        {  
            this.name = name;  
        }  
        Person(String name,int age)  
        {  
            this.name = name;  
            this.age = age;  
        }  
      
        public void speak()  
        {  
            System.out.println("name="+this.name+"...age="+this.age);  
            this.show();  
        }  
        public void show()  
        {  
            System.out.println(this.name);  
        }  
      
        public boolean compare(Person p)  
        {  
            return this.age==p.age;  
      
        }  
    }  
    class Person2   
    {  
        public static void main(String[] args)   
        {  
      
            Person p1 = new Person(20);  
            Person p2 = new Person(25);  
            boolean b = p1.compare(p2);  
            System.out.println(b);  
            Person p3 = new Person("lisi");  
            Person p4 = new Person("zhangsan");  
            p3.speak();  
            p4.speak();  
        }  
    }  

static静态关键字

static关键字的用法:它是一个修饰符,用来修饰成员(成员变量,成员函数)。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,格式:类名.静态成员。
特点:

1、随着类的加载而加载。
2、优先于所有对象存在。
3、被所有对象共享。
4、可以直接被类名所调用。
5、生命周期最长(随着类的消失而消失)。
静态static的使用注意事项:
1、静态方法只能访问静态成员,非静态方法则静态或非静态都可访问。
2、静态方法中不可以定义this,super关键字,因为静态优先于对象存在。所以静态方法中不可以出现this关键字。
3、主函数是静态的。
静态有利有弊:
利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。而且可以直接被类名调用。
弊:生命周期过长。而且访问出现局限性(静态只能访问静态)
什么时候使用静态static?
定义静态变量:当对象中出现共享数据时,该数据应该被静态所修饰(对象的特有数据要定义成非静态存在于堆内存中)
定义静态方法:当功能内部没有访问到对象的特有数据时,比如name,age,这些在对象被创建后才分别赋予的变量时,那么该功能可以被定义为静态的。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值