黑马程序员----基础学习第五天

                                       ------- android培训java培训、期待与您交流! ----------

 

                           

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

2、面向对象有三个特征:封装,继承,多态。

以后开发:其实就是找对象使用,没有对象就创建一个对象。找对象,建立对象,使用对象,维护对象的关系.

二、类与对象的关系


可以理解为:类就是图纸,汽车就是堆内存中的对象。
需求:描述汽车(颜色,轮胎数),描述事物其实就是在描述事物的属性和行为。属性对应类中的变量,行为对应类中函数(方法)。其实定义类就是在描述事物,就是在定义属性和行为,属性和行为共同成为类中成员(成员变量和成员方法)
class  Car
{
       //描述颜色
       String color=”红色”;
       //描述轮胎数
       int num=4;
       //运行行为
       void run()
       {
              System.out.println(color+”……”+num);
}
}
class  CarDemo
{
       Public static void main(String[ ]args)
       {
              //生产汽车,在Java中通过new操作符来完成
              //其实就是在堆内存中产生一个实体
              Car c=new Car( );   //c就是一个类类型变量
              //记住:类类型变量指向对象
              //需求:将已有车的颜色改成蓝色,指挥该对象使用。
              //在Java中指挥方式:对象.对象成员
c.color = “blue”;
}
}

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

四、构造函数
1、特点:函数名和类名相同;不用定义返回值类型;不可以写return语句
2、作用:给对象进行初始化。
3、注意:默认构造函数的特点;多个构造函数是以重载的形式存在的。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。
在运行上也有不同。
构造函数是在对象一建立就运行。给对象初始化。
而一般方法是对象调用才执行,给是对象添加对象具备的功能。
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。


五、单例设计模式
设计模式:解决某一类问题最行之有效的方法,Java中有23种设计模式。
单例设计模式:解决一个类在内存中只存在一个对象
想要保证对象唯一:
1)        为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象
2)        还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象
3)        为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式
(一) 饿汉式。
特点:Single进内存,就已经创建好了对象
class  Single
{
   private static Single s=new Single();
   private Single(){}
   public static Single getInstance()
   {
       return s;
}
}
(二) 懒汉式。
特点:Single类进内存,对象还没有存在,只有调用了方法时,才建立对象
class  Single  //对象时方法被调用时,才初始化,又叫对象的延时加载。
{
   private static Single s=null;
   private Single(){}
   public static Single getInstance()
   {
       if(s==null)
          s=new Single();
       return s;
}
}
(三)解决懒汉式缺点的最终代码
class  Single
{
   private static Single s=null;
   private Single(){}
   public static Single getInstance()
   {
       if(s==null)
       {
          Synchronized(Single.class)
          {
              if(s==null)
                 s=new Single();
          }
       }
       return s;
}
}
记录原则:定义单例,建议使用饿汉式。
六、对象的初始化过程
Person p=new Person("zhangsan",20);
 该句话所做的事情:
1.        在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.        加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
3.        执行类中的static静态代码块:如果有的话,对Person.class类进行初始化。
4.        开辟空间:在堆内存中开辟空间,分配内存地址。
5.        默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化
6.        显示初始化:对属性进行显示初始化。
7.        构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。                            
8.         构造函数初始化:对对象进行对应的构造函数初始化。
9.         将内存地址赋值给栈内存中的变量p。
七、关键字
(一) private
私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数),私有只有在本类中有效。
 
(二) this
代表本类对象,代表它所在函数所属对象的引用。简单说就是:哪个对象在调用this所在的函数,this就代表那个对象。
this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象,但凡本类功能内部使用到了本类对象,都用this表示
this语句:用于构造函数之间进行互相调用,this语句只能定义在构造函数的第一行,因为初始化要先执行。
(三) static
用于修饰成员(成员变量和成员函数)
1.        被修饰后的成员具备以下特点:
         随着类的加载而加载
         优先于对象存在
         被所有对象所共享
         可以直接被类名调用
2.        使用注意:
         静态方法只能访问静态成员。
         静态方法中不可以写this,super关键字
         主函数是静态的。
3.        什么时候使用静态?
要从两方面下手:
因为静态修饰的内容有成员变量和函数
1)        什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成给非静态存在于堆内存中。
2)        什么时候定义静态函数呢?
当功能内部没有访问到非静态数据时(对象的特有数据),那么该功能可以定义成静态的。
 
  02天日记圣诞树tree代码的优化:
import static java.lang.System.*;
class Tree
{
        private static int num=10,level=3,chang=6;        //控制打印树的大小与形状的变量
        public static void main(String[] args)
        {
                for(int i=1;i<=level;i++)
                        san(i);
                ju();
        }
        //打印三角形
        public static void san(int p)
        {
                for(int i=0;i<num;i++)
                {
                        myFor(num+2*p-i-3," ");//num+2*p-i-3为左边打印的空格数
                        myFor(i,"* ");
                        sop("\n");
                }
                num-=2;
        }
        //打印矩形
        public static void ju()
        {
                for(int m=0;m<chang;m++)
                {
                        myFor(chang," ");
                        myFor(chang,"*");
                        sop("\n");
                }
        }
        //for循环
        public static void myFor(int x,Object y)
        {
                for(int i=0;i<=x;i++)
                {
                        sop(y);
                }
        }
        //打印
        public static void sop(Object obj)
        {
                out.print(obj);
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值