对Java的面对对象编程中对象和引用以及内部类的理解

作者:jevien 时间:2022-02-22 12:11:15 

最近利用下班的时候看了看的think in java感觉再看 和第一次看大不一样
接下来说一下java中对象和引用的关系,以及内部类的概念。
1、java中一切都是对象
 在java中是什么来操作者对象呢?答案是引用,这就好比C或者C++中的指针。
如果用拥有一个引用,那么此时你必须让其和一个对象关联在一起,否则这个引用并不会像你想象的那样任由你的控制,例如你创建了一个String的引用:


String s ;

而此时并未与任何对象关联,如果此时你去做一些操作,如调用String的一些方法,肯定是会出现问题,(一些基本类型除外,因为你在定义的时候,它们就会赋予初始值的),所以在使用钱必须和对象进行关联:


String s = new String();

或者


String s = “my name is ajun”;

像这样就可以了。
2、怎么和对象进行关联
在java中通常会通过new来创建一个对象,来和引用进行关联,如:


String s = new String("my name is ajun");

这样不仅创建了一个对象和引用s进行关联,同事也进行初始化,同时我们也可以创建属于自己的对象类型。
3、存储位置
(1)堆栈:一般存储引用和基本类型变量,堆栈主要是通过堆栈指针上下移动来对内存进行分配和释放。
基本类型变量并不适应于new进行创建,因为其所占的内存较小。
(2)堆:用于存储java对象,当程序执行new的时候,堆就会分配一个空间给这个对象,记住堆进行内存的分配和释放是比堆栈进行存储和释放内存消耗更多的时间,这就是基本类型变量要存在堆栈中了,因为基本类型变量是用的最频繁的,频繁的存储和释放内存,在消耗更多的时候,性能可想而知的。
4、内部类
(1)、内部类基础知识:
一般定义在java类内部的类成为内部类
内部类可以分为:定义在方法体外部的类、定义方法内部的类、静态内部类(只能定义在方法外部),匿名内部类
说明:
定义在方法外面的类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限可以任何,可以把它看成类的成员变量,这样理解就好多来了。
定义在方法体内的类;
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有,把他看成方法的局部变量就可以了。
静态内部类:
只能访问类的静态成员变量
访问权限任何
匿名内部类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有
(2)、内部类的作用
内部类可以很好的隐藏类,一般类不允许有private protect default访问权限。
内部类可以实现多重继承,弥补了java不能多继承的特点
(3)、例子


package com.ajun.test.innerclass.example;

/**
* 水果内容
* @author Administrator
*
*/
public interface Contents {
  String value();
}

package com.ajun.test.innerclass.example;

/**
* 水果目的地
* @author Administrator
*
*/
public interface Destination {

//目的地
 String readLabel();
}

package com.ajun.test.innerclass.example;

public class Goods {

private String des="is ruit!!";

//方法外部
 private class Content implements Contents{
   private String name = "apple "+des;
   @Override
   public String value() {
     return name;
   }
 }

//方法外部
 private class GDestination implements Destination{
   private String label ;
   private GDestination(String label){
     this.label= label;
   }
   @Override
   public String readLabel() {
     return label;
   }
 }

//匿名内部类
 public Destination getdestination(final String label){
   return new Destination(){
     @Override
     public String readLabel() {
       return label;
     }
   };
 }

public Destination dest(String s){
   return new GDestination(s);
 }

public Contents content(){
   return new Content();
 }

public Destination dest2(String s){
   class GDestination implements Destination{
       private String label;
       private GDestination(String label){
         this.label= label;
       }
       @Override
       public String readLabel() {
         return label;
       }
   }
   return new GDestination(s);
 }

}

package com.ajun.test.innerclass.example;

public class Test {

public static void main(String [] a){
   Goods gs = new Goods();
   Contents c = gs.content();
   Destination d = gs.dest("Beijing");
   System.out.println(c.value());
   System.out.println(d.readLabel());
   Destination d1 = gs.getdestination("Shanghai");
   System.out.println(d1.readLabel());
   System.out.println(gs.dest2("Tianjin").readLabel());
 }
}

其中Content和Gdestination得到了很好的隐藏,外面调用的时候,根本就不知道调用的是具体哪个类,使这个类拥有多继承的特性。


输出;


apple is ruit!!
Beijing
Shanghai
Tianjin
标签:Java,对象,引用,内部类
0
投稿

猜你喜欢

  • 深入浅析Android消息机制

    2023-07-26 03:20:02
  • SpringBoot重写addResourceHandlers映射文件路径方式

    2022-05-26 19:02:40
  • 深入理解Java设计模式之命令模式

    2023-11-24 11:06:31
  • Java基于Runtime调用外部程序出现阻塞的解决方法

    2023-11-09 04:24:23
  • 详解java Collections.sort的两种用法

    2023-11-28 09:30:31
  • 第一次使用Android Studio时你应该知道的一切配置(推荐)

    2022-01-08 00:49:38
  • java实现将结果集封装到List中的方法

    2021-10-27 22:29:45
  • Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案

    2023-11-25 07:36:19
  • 新手小白学JAVA IDEA下载使用手册全集

    2023-11-23 14:33:23
  • 如何将IDEA打成jar包并在windows后台运行

    2022-02-27 01:36:57
  • C++语言io流处理基本操作教程示例

    2023-11-02 22:07:39
  • Java流处理stream使用详解

    2021-09-17 18:27:58
  • Java ArrayList类的基础使用讲解

    2021-11-14 10:22:18
  • 深入分析java并发编程中volatile的实现原理

    2023-11-23 05:02:25
  • Redis集群原理详细分析

    2021-08-06 07:34:00
  • 浅谈JVM内存溢出原因和解决思路

    2023-11-23 12:24:15
  • SpringBoot 如何使用RestTemplate发送Post请求

    2022-03-03 09:35:47
  • java获取和设置系统变量问题(环境变量)

    2023-11-19 07:34:07
  • 解决jmap命令打印JVM堆信息异常的问题

    2023-11-05 09:07:02
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • asp之家 软件编程 m.aspxhome.com