Java 精炼解读类和对象原理

 

面向对象、面向过程

什么是类?

什么是对象?

这是非常抽象的两个概念!!!!!!!!

在说清楚类和对象的概念之前,给大家讲一下什么是面向对象、面向过程,以此来推出我们类和对象的概念。

面向过程:以洗衣服为例:拿盆、放水、放衣服、放洗衣粉、手搓、换水、拧干、晾衣服,这个过程就是面向过程。

面向对象:以洗衣服为例:人把衣服放进洗衣机,倒入洗衣粉,洗完晾干,不需要关心洗衣服整个过程是怎么完成的,只需要找对象,创建对象,使用对象。在好比我们使用toString函数,我们并不关心toString函数具体的实现过程,我们直接交给Arrays帮我们实现就可以了,这就是面向对象。

对象从哪来的?对象就是从类来的,有类之后才有对象,人,洗衣机 ,洗衣粉,都是单独的一个类。由类再产生对象,我们就叫做创建对象。对象都创建好了,每个对象都具备一些行为一些属性,然后对象之间相互完成就可以了。这就是面向对象和面向过程。

要面向对象,我们就要找到对象,而对象是由类来的,类是从哪来的?我们是需要去抽象的。比如说:我们都是人,人的话都有共同的属性,姓名、性别、年龄、吃饭、睡觉,每个人都会具备这些,相当于这就是一个模板,通过这个模板可以产生很多的对象,这些对象都具备这些相同的属性。就是来抽象这个人,由这个人来创建对象,而这个人就是一个类。真正的要有这样一个人,让他是一个对象,是一个实体,就需要把他创建出来,通过new来创建。

 

定义类

class Person{

  
}//定义一个类,这个类叫Person,类名一定要是大驼峰





class Person{
  //类里面包含字段,也叫做属性,也叫做成员变量
  //也包含方法
  //一个类就是由方法和字段组成的
  public String name;//属性
  public int age;//属性
  //什么是方法?可以解读为这个人的行为
  public void eat(){
      System.out.println(name+" 正在吃饭");
  }
  public void sleep(){
      System.out.println(name+" 正在睡觉");
  }

}

由类产生对象的过程,术语我们叫做实例化,通过new关键字来实例化对象。

public class TestDemo {
  public static void main(String[] args) {
      Person person//定义一个变量person,此时类Person也相当于类型的意思,和int a = 10,a的类型是int一样

  }
}

由类Person定义的变量person是引用变量,意味着它的初值可以给null

public class TestDemo {
  public static void main(String[] args) {
      Person person = null;

  }
}

实例化对象

public class TestDemo {
  public static void main(String[] args) {
      Person person = new Person();//由类Person实例化了一个对象

  }
}

一个类可以实例化多个对象

public class TestDemo {
  public static void main(String[] args) {
      Person person = new Person();//由类Person实例化了一个对象
      Person person1 = new Person();
      Person person2 = new Person();
      Person person3 = new Person();
      Person person4 = new Person();

  }
}

 

类的成员

普通成员变量

字段是定义在类的内部方法的外部,如果定义到方法里头叫做局部变量,定义到方法外头叫做成员变量

如何访问成员变量,成员变量分为两种:(普通成员变量、静态成员变量)。普通的成员变量的访问方式通过引用来访问。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

成员变量没有赋初值的情况下都有一个默认的值

如何给成员变量赋值

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

如果是一个普通的成员变量,它的内存在对象里面,而不是说所有对象共用一份。每个对象都各有一份自己的name和age

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

方法也分为两种:一种叫做普通成员方法,一种叫做静态成员方法

普通的成员方法访问方式也是一样的,通过对象的引用来访问我的方法。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

静态成员变量

被static修饰的的变量叫静态成员变量,也叫做类变量,是放在方法区的

静态成员变量的访问方式是通过类名.静态的成员属性/方法。

不依赖对象

class Person{

  public String name;
  public int age;

  public static int count;

  public void eat(){
      System.out.println(name+" 正在吃饭");
  }
  public void sleep(){
      System.out.println(name+" 正在睡觉");
  }

}

public class TestDemo {
  public static void main(String[] args) {
      Person.count++;
      System.out.println(Person.count);
      System.out.println("================");
      Person.count++;
      System.out.println(Person.count);

  }
}

打印结果;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

count是被static修饰的静态成员变量,是放在方法区的,不属于某个对象,属于类。正确的访问静态成员变量或者方法只要 类名.静态成员变量/方法 就可以了,所有静态的东西在方法区里只存一份,所以加2遍都是加的count本身,所以第二次打印的结果是2。

 

普通的方法内部不能够定义静态的变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

1.static定义的变量是类变量,属于类,(定义在方法内部就属于方法了,所以是错误的)

2.eat方法的调用,需要对应的引用来调用。但如果可以定义static的变量,类Person就可以调用,所以两者直接是矛盾的,eat需要对应的引用来调用。size只需要类就可以调用。所以普通的方法内部, 不能够定义静态的变量。

 

静态的方法也不可以定义静态变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

static定义的变量是类变量,属于类,(定义在方法内部就属于方法了,这样是做不到的,所以是错误的)

总结:静态的成员变量是不可以在方法中定义的

普通方法里面是可以调用静态方法的

class Person{

  public String name;
  public int age;

  public static int count;

  public void eat(){

      System.out.println(name+" 正在吃饭");
  }
  public void sleep(){
      staticFunc();
      System.out.println(name+" 正在睡觉");
  }
  public static void staticFunc(){
      System.out.println("static::func");
  }

}

public class TestDemo {
  public static void main(String[] args) {
      Person person = new Person();
       person.eat();
       person.sleep();
  }
}

打印结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

静态方法内部不能调用普通方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

静态内部不可以调用普通方法,因为静态的方法不依赖于对象, 通过类名就可以调用,但没有对象普通方法没法调用。

 

main函数为什么是静态的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

一个引用不可以同时指向多个对象

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

引用肯定是在栈上吗?肯定不是

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

看绿线,画图解析

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

小写的person属于TestDemo这个类的成员变量

final修饰

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

private实现封装

private/ public 这两个关键字表示 "访问权限控制"

被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用.

被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用.

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

提供接口

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

打印结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

this代表当前对象的引用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

构造方法

构造方法:方法名和类名是相同的,且构造方法比较特殊,没有返回值

构造方法是干嘛的?我们需要知道一个对象的产生(对象的实例化) 分为几步

1.为对象分配内存

2.调用合适的构造方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

4720b171695a4d61bed004a27b44b813.jpg

这就是一个构造方法

前面的访问修饰符可以是public,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

调用构造方法:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

打印结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

不带参数和带一个参数和带两个参数的构造方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

调用构造方法:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

this的区别

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

第一种:

16243bfef65f4bc2ae826a9d72d35292.jpg

第二种:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_17,color_FFFFFF,t_70,g_se,x_16

代表当前对象的eat方法

第三种:

调用不带参数的构造方法,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_19,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

打印结果 :

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

this函数必须放到第一行,只能存放在构造函数当中

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

代码块

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_13,color_FFFFFF,t_70,g_se,x_16

本地代码块:

两个括号

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

实例代码块和静态代码块:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。 静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。

太累了,拜拜!!!!!!

关于Java 精炼解读类和对象原理的文章就介绍至此,更多相关Java 类和对象内容请搜索编程教程以前的文章,希望以后支持编程教程

 Eureka注册的服务之间互相调用1.请求方启动类添加注解,扫描Eureka 中的全部服务@SpringBootApplication@EnableEurekaClient@EnableF ...