目录
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
在面向对象定义中,也规定了一些基本的特征:
- 封装:保护内部的操作不被破坏;
- 继承:在原本的基础之上继续进行扩充;
- 多态:在一个指定的范围之内进行概念的转换。
对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。
类与对象是整个面向对象中最基础的组成单元。
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠 属性来区分不同对象。
总结:
类和对象的区别:
类是对象的一个模板,对象是类的实例。类只有通过对象的才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
再Java中定义类,使用关键字class完成。语法如下:
- class 类名称 {
- 属性(变量);
- 行为(方法);
- }
实例:定义一个Student类
- class Student{
- String name;
- int age;
- public void tell(){
- System.out.println("姓名:"+ name +",年龄:" + age);
- }
- }
注意事项:
- 类名注意采用大驼峰定义
- 成员前写法统一为public,后面会详细解释
- 此处写的方法不带static 关键字,后面会详细解释
属性:姓名 性别 年龄 学分
方法:来上课:输出'按时上课,不要迟到,如果请假,即使补课'
写作业:输出'教务系统,完成作业,一旦拖沓,神仙难救'
要考试:输出:'考试目的,了解学情,人人必考,暴漏问题'
- public class Student{
- public String name;
- public String gender;
- public short age;
- public double score;
-
- public void DoClass(){}
- public void DoHomework(){}
- public void Exam(){}
- }
注意事项:
- 一般一个文件当中只定义一个类
- main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
- Public修饰的类必须要和文件名相同
- 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的产生格式有两种,如下:
1、格式一:声明并实例化对象
类名称 对象名称 = new 类名称();
当一个实例化对象产生之后,可以按照如上边方式进行类的操作
对象 . 属性:表示调用类之中的属性;
对象 . 方法:表示调用类之中的方法
实例:
- class Student{
- String name;
- int age;
- public void tell(){
- System.out.println("姓名:"+ name +",年龄:" + age);
- }
- }
-
- public class TestDemo{
- public static void main(String args[]){
- Student per = new Student();//声明并实例化对象
- per.name = "张三";//操作属性内容
- per.age = "30";//操作属性内容
- per.tell();//调用类中的tell()方法
- }
-
- //运行结果:
- //姓名:张三 , 年龄:30
2、格式二:先声明对象,然后实例化对象:
类名称 对象名称 = null;
对象名称 = new 类名称();
实例:
- class Student{
- String name;
- int age;
- public void tell(){
- System.out.println("姓名:"+ name +",年龄:" + age);
- }
- }
-
- public class TestDemo{
- public static void main(String args[]){
- Person per = null;//声明对象
- per = new Person();//实例化对象
- per.name = "张三";//操作属性内容
- per.age = 30;//操作属性内容
- per.tell();//调用类中的tell()方法
- }
- }
-
- //运行结果:
- // 姓名:张三,年龄:30
引用数据类型与基本数据类型最大的不同在于:
引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。
以上两种不同的实例化方式有什么区别呢?
我们从内存角度分析。首先,给出两种内存空间的概念:
堆内存:保存对象的属性内容。堆内存需要用new关键字来分配内存空间;
栈内存:保存的是堆内存的地址。(在这里为了分析方便的,可以理解为栈内存保存的是对象的名字)
在任何情况下,只要看见关键字new,都表示要分配新的堆内存空间,一旦堆内存空间分配了,里面就会有类中定义的属性,并且属性内容都是其对应数据类型的默认值。
上面两种实例化对象方式用内存表示如下:
两种方式的区别在于将步骤1,2结合和分开来写。
如果使用了没有实例化的对象,结果会如何?
- class Student{
- String name;
- int age;
- public void tell(){
- System.out.println("姓名:"+ name +",年龄:" + age);
- }
- }
-
- public class TestDemo{
- public static void main(String args[]){
- Person per = null;//声明对象
- // per = new Person();//实例化对象
- per.name = "张三";//操作属性内容
- per.age = 30;//操作属性内容
- per.tell();//调用类中的tell()方法
- }
- }
运行结果:
此时,程序只声明了Student对象,并没有实例化Student对象。
在上边的图片中可以看到,类实例化对象之后,类中的属性,对象中就存在了,但是上述2步骤没有对对象进行初始化时,其中的属性都有默认的值,这是为什么呢?
这是JVM为所开辟的空间进行的初始化,给属性附上相应的默认值。
相应类型对应的默认值为:
数据类型 | 默认值 |
byte | 0 |
char | '\u0000' |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
这里默认初始化只是简单说一下,后边还会详细讲解
本篇文章,大部分内容借鉴了博主志见的内容,推荐大家可以点下边链接观看,博主讲解的内容思路特别清晰。
原文链接:https://blog.csdn.net/wei_zhi/article/details/52745268