miracle just wanna be better

java类(内部类)和对象

2019-07-03
miracle

用对象存储不同类型的数据,至少比数组的方式更进一步

面向对象:

重要的引言:
面向对象不是某个阶段就能学习精通的,但是要对面向对象的基本知识点要理解,知识用得不灵活,也不会应用到某个实 际的项目中,无论什么样的项目,都可以用面向对象+设计模式+面向对象的设计原则,可以设计出很好的程序的架构

为什么要学习面向对象
能够把现实世界的物或者事转到计算机中
如何掌握面向对象:首先要掌握类

类:

类是一种数据结构(逻辑结构),组织多个数据类型的一种结构
数组做不到的,类能做到,对数据管理的一种进步
类中只存储数据过于单一,需要在类中放置方法,方法来操作数据

类的特点:

  • 封装:用类把数据和操作数据的方法封装在一起
  • 继承:类和类之间是有继承关系,是为了让子类复用父类的属性或方法
  • 多态:是面向对象的灵魂

什么是类(class):

  1. 类就是一个数据结构(逻辑结构) 变量只能存储一个数据类型的数据:int i=100;
    组能存储多个相同数据类型的数据:int[] i=new int[]; 数组也是一种数据结构
    类能存储多个不同类型的数据,还可以有操作数据的多个方法
    比如:
public class Student{
int age;//学生的年龄
String name;//学生的姓名
String stuNo;//学生的学号
public void study(){}//学生具备学习的能力
public void fight(){}//学生具备战斗的能力
}
  1. 类是一种特殊的由程序员自定义的数据类型 int i = 3;//以i为理由申请int类型大小的空间,存储的值是3 int[] a = new int[10];以a为理由,申请int类型的10个空间,有默认值0
public class Student{
	nt age;//学生的年龄
	String name;//学生的姓名
	String stuNo;//学生的学号
	public void study(){}//学生具备学习的能力
	public void fight(){}//学生具备战斗的能力
	 }
	 Student stu1 = new Student();//以stu1为理由,申请Student类这么大空间

stu1里的age=0,name=null,stuNo=null

  1. 有类这种数据类型,就可以通过这种数据类型在堆空间中申请空间 Student stu = new Student(); 可以用类类型申请无数个内存空间,且每个空间对应一个学生的信息
  2. 基于前3点,可以把现实世界的物或事,转到计算机中的类上.用类这种类型,在内存中申请空间,用于存储数据. 使用面向对象或类,最难的事是把现实世界的物或事转换到计算机中,通俗的说法,就是把现实世界的事或物对应到计算机中的”类”上 如果了解或理解了现实世界的物或事,做成java的类就很容易,如果不了解或理解现实世界的物或事,做成java的类就很困难
    实际java语法创建一个类是很简单的
    public class 类名{
     //最难的是在类中写属性或方法
     //多个属性
     //多个方法
     //符合单一职责(只表达一件事)
    }
    

    类的定义用java语法写起来很简单,难的是写什么样的属性和方法 结论
    现实世界物或事->通过程序员抽象成类(属性方法)->用类在内存中申请空间,并存储数据->从内存中取出对象的数据,根据需求处理数据->把处理后的结果显示在界面(控制台,网页,客户端..)

    类和对象在内存中的存储机制:

    • 程序员要做面向对象,首先要考虑的是在类中放置什么样的属性和方法
      类里能放:
    • 多个属性:代表数据
    • 多个方法:代表功能
    • 其次要掌握对象
      对象和类在jvm内存中的存储机制:

      jvm把内存分为三个主要部分:

    • 方法区:存储的是类的定义,静态数据,常量池,由jvm来控制管理
    • 堆区:数组申请的空间,对象申请的空间,总之是new出来的空间,堆空间中存储的是数组数据,对象的数据,可以通过程序操作的
    • 栈区:堆中的对象空间中存储的是属性数据,没有方法,判断对象是否相等,主要判断的是对象中的属性值是否相等.所以对象就是数据的载体,对象中没有方法,只有数据,通过对象打点调用方法,使用上使用的是方法区中的类定义里的方法.方法中使用哪个对象的数据,取决于方法是被哪个对象调用的.

解决数据如何存储,数据的安全问题

数据如何存储: 类中的属性变成私有数据,私有数据通过公有方法来访问,因为方法可以写逻辑
公有的方法是有规律的 getter and setter getXXX and setXXX
数据的安全性问题 在共有的方法中写逻辑,来保证私有数据的正确性和安全性

java工作内存图

java内存图

结论:

程序:

  • 获取数据/准备数据
  • 基于数据,处理
  • 显示处理的结果 在内存中如何申请空间:
  • 用变量存储数据
  • 数组:能存储一组相同类型的数据
  • 类:能组织一批不同类型数据的数据 内存中有了数据了
    用顺序,分支,循环 可以组织很复杂的逻辑
    掺杂着运算符
    有数据,逻辑,可以表达现实世界的事和物
    用类来存储复杂的数据,用类和类之间的关系来表达现实世界的复杂关系
    最终,程序员能写程序,能帮助人们做很多事情

给对象存储数据的方式有两种:

  • 用setter方式存储数据
  • 用构造函数的方式存储数据 从对象中获取数据的方式有一种:
  • getter方式

内部类

把类放在某个范围的内部

  • 类可以放在包
  • 类可以放在文件中,.java文件
  • 类可以放在类中(类里套类) 内部类
  • 类可以放在方法中(方法类套类) 内部类
  1. 类中放置内部类
    要使用内部类,就需要在外部类中实例化内部类的对象,然后用对象打点调用内部类中的方法(可以在外部类中,调用内部类的私有方法和私有属性)
    用过内部类里的方法,来操作内部类的数据
    在内部类中可以直接使用外部类中的所有方法和属性
    要使用内部类,可以在外部类的外面实例化内部类的对象,然后通过对象打点调用内部类的非私有方法(在同一个包内)
  2. 方法类套类 要使用方法中的内部类,就必须在方法中,内部类定义的下面实例化内部类的对象,然后通过内部类对象打点,调用内部类的属性和方法(包含私有)
    内部类的作用域,仅限于当前方法
    从内部类定义开始到方法结束,内部类作用域消失
    在内部类中可以直接使用外部类中的属性和当前方法中的局部变量
    在外部类的外部不能使用方法中的内部类

匿名内部类(也是内部类)

是内部类但没有类的名字,但有{属性和方法}
比如:
Person接口
//匿名内部类但有对象名

 Person p = new Person(){
   public void study(){
		//具体的方法   
   }
   public void eat(){
		//具体的方法
   }
 };
 p.study();
 p.eat();

//匿名内部类但没有对象名

new Person(){
   public void study(){
		//具体的方法   
   }
   public void eat(){
		//具体的方法
   }
 }.study;

#### 匿名内部类的特点

 当前匿名内部类中实现的方法,只能实现一次,如果还想要其他的实现,则必须用必须用匿名内部类重新new实现   匿名内部类更适合提供长辈的方法的实现,而且实现只需要实现一次即可  

区别

匿名内部类的方法只能实现一次,对象也只有一个
有名内部类的方法只能实现一次,可以new很多的内部类对象


上一篇 数组的复制

下一篇 Java多态

Comments

Content