嘿,程序员——面向对象特征一:封装,以及this、static关键字和单例模式


面向过程强调的是功能行为。面向对象是将功能封装进对象,强调具备了功能的对象。

面向对象是基于面向过程。面向对象从执行者变为指挥者。面向对象是一种思想,能让复杂的问题简单化。


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

类与对象的关系:类就是对现实生活中事物的描述。对象就是这类事物,实实在在存在的个体。

现实生活中的对象:张三、李四

想要描述:提取对象中共性内容。对具体的抽象。

描述时:这些对象的共性有:姓名、年龄、性别、学习java功能等

映射到java中,描述就是class定义的类。

具体对象就是对应java在堆内存中用new建立实体。

描述事物就是在描述事物的属性和功能。

其实定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同称为类中的成员(成员变量和成员函数或方法)。

类类型变量指向对象。

写在类中的变量是成员变量。

成员变量作用于整个类中,局部变量作用于函数或语句中。

成员变量在堆内存中,因为对象的存在而存在。局部变量在栈内存中。


匿名对象使用方式:

1、  当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。如果对一个对象进行多个成员调用,必须给这个对象起个名字。

2、  可以将匿名对象作为实际参数进行传递。


封装(Encapsulation):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:将变化隔离、便于使用、提高重用性、提高安全性。

封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。

注意:私有仅仅是封装的一种表现形式。

之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作。调高代码的健壮性。

构造函数:

1、  函数名与类名相同。

2、  不用定义返回值类型

3、  不可以写return语句。

对象一建立就会调用与之对应的构造函数。构造函数的作用:可以用于给对象进行初始化。

构造函数的小细节:

当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。

 

注意:当在类中自定义了构造函数后,默认的构造函数就没有啦。

 

构造函数和一般函数在写法上有不同。

在运行上也不同。构造函数是在对象一建立就运行,给对象初始化。而一般方法是对象调用才执行,给对象添加对象具备的功能。

一个对象建立构造函数只执行一次,一般函数可以被调用多次。

 

什么时候定义构造函数:当分析事物时,该事物存在具备一些特性或行为,那么将这些内容定义在构造函数中。

 

构造代码块:

作用:给对象进行初始化。

对象一建立就运行,而且优先于构造函数执行。

和构造函数区别:

构造代码块是给所有对象进行统一初始化,而构造函数是给对应对象初始化。定义的是不同对象中共性的内容。

 

this:看上去,是用于局部变量和成员变量同名的情况。

this:就代表本类的对象,this代表它所在函数所属对象的引用。

简单说:哪个对象在调用this所在函数,就代表哪个对象。

this的应用:当定义类中功能时,该类内部要用到调用该函数的对象时,这时用this来表示这个对象。但凡本类功能内部使用了本类的对象,都用this表示。

 

注意:构造函数间调用只能用this语句。this语句只能放在构造函数的第一行。因为初始化要先执行。

 


Static用法:是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员

Static特点:

1、  随着类的加载而加载。也就是说:静态会随着类的消失而消失。说明它的生命周期最长。

2、  优先于对象存在。明确一点:静态是先存在,对象是后存在。

3、  被所有对象共享

4、  可以直接被类名所调用。

 

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

1、  存在位置。

类变量随着类的加载而存在于方法区中。实例变量随着对象的建立而存在于堆内存中。

2、  生命周期:

类变量生命周期最长,随着类的消失而消失。

实例变量生命周期随着对象的消失而消失。

 

静态使用注意事项:

1、  静态方法只能访问静态成员

非静态方法既可以访问静态也可以访问非静态。

2、  静态方法中不可以定义this,super关键字。

因为静态优先于对象存在,所以静态方法中不可以出现this。

3、主函数是静态。

静态有利有弊

利:对对象的共享数据进行单独空间的存储,节省空间,没有每一个对象中都存储一份。可以直接被类名调用。

弊:生命周期过长。访问出现局限性。(静态虽好,只能访问静态)

 

主函数是一个特殊的函数,作为程序入口可以被JVM调用。

主函数是固定格式的。才能被jvm识别。

Jvm在调用主函数时,传入的是newString[0];

 

什么时候定义静态变量(类变量)?

当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。

什么时候定义静态函数?

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

 

建立Tool类,可以将Tool中的方法都定义成static,直接通过类名调用即可。

将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象,为了更为严谨,强制让该类不能建立对象,可以通过将构造函数私有化完成。

class ArrayTool
{
         publicstatic void main(String[] args)
         {
                   int[]arr={3,4,1,8};
                   //intmax=getMax(arr);
                   //Toolt=new Tool();
                   //intmax=t.getMax(arr);
                   intmax=Tool.getMax(arr);
                   System.out.print(max);
         }
        
}
class Tool
{  
         //构造函数私有化
         privateTool(){}
         publicstatic int getMax(int[] arr){
                   intmax=0;
                   for(intx=1;x<arr.length;x++){
                            if(arr[x]>arr[max])
                                     max=x;
                   }
                   returnarr[max];
         }
 
         publicstatic int getMin(int[] arr){
                   intmin=0;
                   for(intx=1;x<arr.length;x++){
                            if(arr[x]<arr[min])
                                     min=x;
                   }
                   returnarr[min];
         }
 
         publicstatic void bubbleSort(int[] arr){
                   for(intx=0;x<arr.length-1;x++){
                            for(inty=0;y<arr.length-x-1;y++){
                                     if(arr[y]>arr[y+1])
                                               swap(arr,y,y+1);
                            }
                   }
         }
 
   //不用外部访问,也改成私有化
         privatestatic void swap(int[] arr,int a,int b){
                   inttemp=arr[a];
                   arr[a]=arr[b];
                   arr[b]=temp;
         }
}


 

静态代码块

static{

                   语句

         }

随着类的加载而执行,只执行一次

class StaticCodeDemo
{
         static{
                   System.out.println("b");
         }
         publicstatic void main(String[] args)
         {
                   newStaticCode();
                   newStaticCode();
                   System.out.println("over");
         }
         static{
                   System.out.println("c");
         }
}
class StaticCode
{
         static{
                   System.out.println("a");
         }
}
输出结果:b c a over


 

class StaticCodeDemo
{
        
         publicstatic void main(String[] args)
         {
                   newStaticCode(4);
                  }
}
class StaticCode
{
         intnum=9;
         StaticCode(){
                   System.out.println("b");
         }
         static{
                   System.out.println("a");
         }
         {
                   System.out.println("c"+num);
         }
         StaticCode(intx){
                   System.out.println("d");
         }
}
结果是a c9 d


 

Person p=new person(“zhangsan”,20);这句话做了什么?

1、  因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。

2、  执行该类中的static代码块,如果有的话,给Person.class类进行初始化。

3、  在堆内存中开辟空间,分配内存地址

4、  在堆内存中建立对象的特有属性,并进行初始化

5、  对属性进行显示初始化

6、  对对象进行构造代码块初始化

7、  对对象进行对应的构造函数初始化

8、  将内存地址赋给栈内存中的p变量

class PersonDemo 
{
	public static void main(String[] args) 
	{
		Person p=new Person("zhangsan",20);
		p.setName("lisi");
	}
}
class Person
{
	private String name;
	private int age;
	private static String country="cn";
	Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	{
		System.out.println(name+"..."+age);
	}
	public void setName(String name){
		this.name=name;
	}
}


 


设计模式:解决某一类问题最行之有效的方法

Java中23中设计模式:

单例设计模式:解决一个类在内存只存在一个对象

 

想要保证对象唯一:

1、  为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象

2、  还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

3、  为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式

 

这三步怎么用代码实现?

1、  将构造函数私有化

2、  在类中创建一个本类对象

3、  提供一个方法可以获取到该对象

对于事物该怎么描述,还怎么描述。

当需要将该事物的对象保证在内存中唯一时,就将以下三步加上即可。

private Single(){}

         privatestatic Single s=new Single();

         publicstatic Single getInstance(){

                   return s;

         }

 

单例模式:

class SingleDemo
{
         publicstatic void main(String[] args)
         {
                   Singles1=Single.getInstance();
                   Singles2=Single.getInstance();
                   s1.setNum(23);
                   System.out.println(s2.getNum());//结果是23
         }
}
class Single
{
         privateint num;
         publicvoid setNum(int num){
                   this.num=num;
                   }
         publicint getNum(){
                   returnnum;
                   }
         privateSingle(){}
         privatestatic Single s=new Single();
         publicstatic Single getInstance(){
                   returns;
         }
}
 


单例模式两种方式:

饿汉式:先初始化对象。Single类一进内存,就已经创建好了对象

class Single

{

         privatestatic Single s=new Single();

         privateSingle(){}

         publicstatic Single getInstance()

         {

                   returns;

         }

懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载

Single;类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象

class Single

{

         privatestatic Single s=null;

         privateSingle(){}

         publicstatic Single getInstance()

         {

                   if(s=null)

                            s=newSingle();

                   returns;

         }

}


我的总结:一定要知道什么是面向对象,面向对象的三个特征:封装、继承、多态。学习java首先就从这三部分出发。知道什么是封装,封装是用来干什么的。知道什么是构造函数,明确构造函数和一般函数的区别,明确构造代码块的用法。牢记this、static关键字的用法,在新建立一个对象时,知道例如Person p=new person(“zhangsan”,20);这句话是怎么执行的?它里面静态代码块、构造代码块、构造函数等的执行顺序,以及内存是如何分配的。了解单例模式是什么?知道如何加入单例模式,明确单例模式的两种方式:饿汉式和懒汉式。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值