精华内容
下载资源
问答
  • 前言本文我们不去谈int、float、char等基本...因此,为了更一般性地分析,体现两种语言创建对象的差异,我们自定义的类 Student 进行说明,以下内容均针对一般的类而言。JavaJava 中,我们可以通过如下方式定...

    前言

    本文我们不去谈int、float、char等基本数据类型,而是用一般的类来说明。因为Java中可以直接通过 int varName 的方式来定义和使用一个基本类型的变量,但对于其它一般类型的对象,必须使用 new 来创建。

    因此,为了更一般性地分析,体现两种语言创建对象的差异,我们用自定义的类 Student 进行说明,以下内容均针对一般的类而言。

    Java

    在 Java 中,我们可以通过如下方式定义变量:

    Student s; //定义标识符s,没有实际空间

    Student s = new Student(); //定义s,并绑定到新创建的对象

    JVM在进行内存管理时,首先会在栈中给dog分配一个空间,当new Dog();后会在堆中开辟对象的实际空间,然后将dog指向堆中的空间,这样我们就可以方法对象的成员变量了。

    14944e7e192057e27e3845b5d9e4f706.png

    图3 Java创建对象方式的内存分配

    c++

    在C++中,变量也可以同上来定义,但含义不同:

    Student s; //定义标识符s,并在栈中申请空间

    Student* s = new Student(); //定义s,并在堆中申请空间,过后需手动释放内存

    这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。

    对于第一种方式而言,dog是被存储在栈中的,占用的大小是Dog类中成员变量占用内存的和,此处不包括成员方法,因为成员方法是存放在公共存储区以便所有该类的对象都可以访问的。

    65c7ee599c7418d72af395663431e41d.png

    图1 C++创建对象方式1的内存分配

    对于第二种方式则不同,该方式使用了指针,在定义*p时在栈中开辟一个4字节的空间,new Dog()时在堆中开辟一块空间,然后将该空间的首地址赋值给*p,这样,通过*p就可以找到对象在堆中的任何成员方法了。

    3011d991562a372df724a14a40e61cbb.png

    图2 C++创建对象方式2的内存分配

    区别总结

    两种语言里都含有 new 操作符,但它们的含义大不相同,这与它俩的变量管理方式有关。

    在 Java 中,只有当你使用 new 操作符时,才会真正在内存中申请一块空间,创建一个新对象,并将该对象绑定到你所定义的变量名上。其它情况下,要么是将已有对象绑定到某个变量名上,要么就是定义的变量名是个空引用,没有绑定任何对象。

    也就是说,定义变量名只是创建了一个新的标识符,跟创建对象没有关系,创建对象必须通过 new 来完成,只有创建对象时才会申请内存空间。

    但在 C++ 中,当你定义了一个变量 s 时,即使你没有给它赋值,也意味着你不但创建了一个新的标识符,同时还在栈中申请了对应的内存空间。

    因此,C++ 中定义的变量名不仅仅是个标识符,还自动关联着栈中的一块内存空间。

    而 C++ 中的 new 操作符表示的是在堆中申请内存,因为栈中的内存在运行时期大小是固定且有限的,因此需要动态内存分配的时候就需要用 new 来实现。这类似于 C 里面的 malloc 函数,只不过 new 操作符还封装了其它的操作。

    总结而言,Java 中的变量名仅仅是一个用于引用内存中实际对象的标识符,如果你没给它关联对象,它就为空引用。而 C++ 中的变量名(非指针类型),虽然也是标识符,但却始终关联着实际的内存空间,当我们看到一个变量(非指针类型)时,就知道它代表着一块实际的内存空间。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • package shiyan;import java.awt.*;import java.sql.*;import javax.swing.*;public class DB extends JFrame{privateJTextArea jta= new JTextArea();private String url="jdbc:sqlserver://127.0.0.1;Databas...

    package shiyan;

    import java.awt.*;

    import java.sql.*;

    import javax.swing.*;

    public class DB extends JFrame

    {

    privateJTextArea jta= new JTextArea();

    private String url="jdbc:sqlserver://127.0.0.1;DatabaseName=studentDB";

    privateString user="sa";

    privateString password="xiner";

    privateString strSQL="select * from S";

    publicDB()

    {

    add(newJLabel("查询结果:"),BorderLayout.NORTH);

    add(jta);

    try{

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

    jta.append("Connectionsuccess. \n");

    try {

    Connectionconn=DriverManager.getConnection(url,user,password);

    jta.append("Loadingdriver success. \n");

    Statementst = conn.createStatement();

    jta.append("CreatingStatement success. \n");

    ResultSetrs = st.executeQuery(strSQL);

    jta.append("CreatingResultSet success. \n\n");

    Stringtemp="";

    jta.append("SNO"+"\t"+"SNAME"+"\t"+"SDEPA"+"\t"+"SAGE"+"\t"+"SSEX\n\n");

    while(rs.next())

    {

    temp+=rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t"+rs.getObject(4)+"\t"+rs.getObject(5)+"\n";

    }

    jta.append(temp);

    }catch (SQLException e) {

    e.printStackTrace();

    }

    }catch (ClassNotFoundException e) {

    e.printStackTrace();

    }

    }

    publicstatic void main(String[] args)

    {

    DB frame=new DB();

    frame.setDefaultCloseOperation(3);

    frame.setTitle("DB");

    frame.setSize(400,320);

    frame.setVisible(true);

    }

    }

    自己再改改

    取消

    评论

    展开全文
  • %> 报错:org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 7 in the generated java file Only a type can be imported. a.test resolves to a package An error...

    publicclasstest{publicvoidtest(){}publicIntegerget(){return12;}}jsp文件

    public class test {

    public void test(){

    }

    public Integer get(){

    return 12;

    }

    }

    jsp文件

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    %>

    My JSP 'index.jsp' starting page

    agrThis is my JSP page.

    out.print(t.get());

    %>

    报错:org.apache.jasper.JasperException: Unable to compile class for JSP:

    An error occurred at line: 7 in the generated java file

    Only a type can be imported. a.test resolves to a package

    An error occurred at line: 28 in the jsp file: /WebRoot/index.jsp

    test cannot be resolved to a type

    25:

    26:

    27: agrThis is my JSP page.

    28:

    29:

    30:

    31: out.print(a);

    展开

    展开全文
  • 根本原因就在当spring框架帮我们管理的时候会帮我们自动的初始化接下来用到的一些属性,而通过用new实例的方法去做,在实例中用到的某些属性可能就需要我们自己去给set值做一个初始化,否则就有可能产生空指针的错误...

    Spring自动注入(@Autowired)与new实例的区别

    为什么在new对象跟自动注入对象同时使用时会空指针,还有就算new对象怎么处理才不会出现空指针的问题。

    根本原因就在当spring框架帮我们管理的时候会帮我们自动的初始化接下来用到的一些属性,而通过用new实例的方法去做,在实例中用到的某些属性可能就需要我们自己去给set值做一个初始化,否则就有可能产生空指针的错误。

    1)首先,我们先看一下正常的情况,把管理权交给spring替我们去管理:

    在下面代码的第4行将UploadService 注入后,在第18行去对它当中的uploadBlock()方法做了一个调用(注意:这个时候第10行的代码如果是被注释掉的,上面第4行的注入就会生效,反之失效!),我们在18行做引用的时候,在方法中用到了ReadFilePathProperties这一个类,在程序运行过程中框架就帮我们把它给初始化了,就不会出现空指针的错误,程序正常运行。

    public classTestController {1@Autowired2 privateFileToByteArrayService fileToByteArrayService;3@Autowired4 privateUploadService uploadService;5@Test6 public void testDemo() throwsIOException {7 //原文件的位置(需根据自己情况修改)

    8 String fileSrc = "D:\\tempfile\\elasticsearch-6.4.2.zip";9 byte[] bytes =fileToByteArrayService.fileToBytes(fileSrc);/*** 演示过程中,下面这行代码是否注释掉说明:

    * 1.演示通过springboot注入方式去调用UploadService()中的方法需要注释掉。

    * 2.演示通过new实例方式进入到UploadService去调用方法出现空指针问题,则需要保留这行代码。

    * 3.演示通过new实例方式进入到UploadService去调用方法,通过在UploadService中set值解决问题,则这行代码不能注释掉。*/

    10 //UploadService uploadService = new UploadService();

    try{11 UploadBlockInputVo param = newUploadBlockInputVo();12 param.setFileName("elasticsearch-6.4.2");13 param.setOffset(0);14 param.setLength(1000000 * 25);15 param.setPartNumber(1);16 param.setSuffix(".zip");17param.setBytes(bytes);18uploadService.uploadBlock(param);

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }

    2)接着我们来看通过new对象的形式,不把管理权交给spring。

    当我们把第10行注释的代码放开后,程序运行到第10行,这时我们在第4行注入UploadService,在第18行调用它的方法,注入调用方式就会失效,spring框架就不会替我们去管理它,这时候它这儿用到的就是通过第10行的new实例方法去对UploadService中的方法做了调用,而此时uploadBlock()这个方法中的ReadFilePathProperties这个东西并非被spring框架管理,所以就没有被自动地初始化导致报了空指针的错误(注意:如果你这时候通过new方法去调用的方法里面没有需要被初始化的对象属性(下面代码中有解释),则程序依旧正常运行,否则报空指针)。

    public classTestController {1@Autowired2 privateFileToByteArrayService fileToByteArrayService;3@Autowired4 privateUploadService uploadService;5@Test6 public void testDemo() throwsIOException {7 //原文件的位置(需根据自己情况修改)

    8 String fileSrc = "D:\\tempfile\\elasticsearch-6.4.2.zip";9 byte[] bytes =fileToByteArrayService.fileToBytes(fileSrc);/*** 演示过程中,下面这行代码是否注释掉说明:

    * 1.演示通过springboot注入方式去调用UploadService()中的方法需要注释掉。

    * 2.演示通过new实例方式进入到UploadService去调用方法出现空指针问题,则需要保留这行代码。

    * 3.演示通过new实例方式进入到UploadService去调用方法,通过在UploadService中set值解决问题,则这行代码不能注释掉。*/

    10 UploadService uploadService = newUploadService();try{11 UploadBlockInputVo param = newUploadBlockInputVo();12 param.setFileName("elasticsearch-6.4.2");13 param.setOffset(0);14 param.setLength(1000000 * 25);15 param.setPartNumber(1);16 param.setSuffix(".zip");17param.setBytes(bytes);18uploadService.uploadBlock(param);

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }

    划重点:

    在第18行调用uploadBlock方法时,在uploadService的uploadBlock方法中我们用下面第一行代码,

    注释掉第二行,不使用ReadFilePathProperties对象中的方法,这个时候程序也会正常运行。

    String uploadPartPath= "D:\\myfile\\elasticsearch-6.4.2Zip";//String uploadPartPath = readFilePathProperties.getPropertisInfo();

    (3)最后,我们说一下如果不把管理权交给框架,我们还是想通过new实例去调用实例中的方法,我们应该怎么办。

    第一种办法,就是让实例中的调用的方法中不存在使用另一个对象的情况,其实这个问题,上面第2个解释中已经给出了一个答案。第二种办法,就是在uploadBlock方法中给ReadFilePathProperties对象set值,我们自己给他做初始化。通过这两种方式处理过后,即使不由框架为我们管理,也可以达到我们的目的,避免出现空指针的问题。

    public classUploadService {

    @AutowiredprivateReadFilePathProperties readFilePathProperties;public voidsetReadFilePathProperties(ReadFilePathProperties readFilePathProperties) {this.readFilePathProperties =readFilePathProperties;

    }public voiduploadBlock(UploadBlockInputVo uploadBlockInputVo) {//code...

    ReadFilePathProperties readFilePathProperties = newReadFilePathProperties();

    setReadFilePathProperties(readFilePathProperties);

    String uploadPartPath=readFilePathProperties.getPropertisInfo();//code...

    }

    }

    4)总结

    在程序的启动时,spring会按照一定的加载链来加载并初始化spring容器中的组件。

    例如:A中注入B,B中注入C,在A中调用B,来使用B中的C的方法时,如果不采用自动注入的方式调用,而用new创建B,就会出现空指针异常(因为B中的C并没有被初始化)。如果B中没有注入C,则可以使用new来创建B。

    Spring注入bean的顺序,以及Spring如何保证事先加载依赖bean的问题

    什么是bean的实例化?什么是bean的初始化?

    bean实例化:是bean对象创建的过程。比如使用构造方法new对象,为对象在内存中分配空间。

    bean初始化:是为对象中的属性赋值的过程。

    场景:Abean中有一个Bbean属性,Bbean中有一个Abean属性,Spring加载依赖bean顺序?

    首先初始化A对象实例为例进行讲解整个过程。先说明:基于构造器的循环依赖spring是无法解决的。

    1、首先Spring尝试通过ApplicationContext.getBean()方法获取A对象的实例,由于Spring容器中还没有A对象实例,因而其会创建一个A对象。

    2、然后发现其依赖了B对象,因而会尝试递归的通过ApplicationContext.getBean()方法获取B对象的实例。

    3、但是Spring容器中此时也没有B对象的实例,因而其还是会先创建一个B对象的实例。

    4、需要注意这个时间点,此时A对象和B对象都已经创建了,并且保存在Spring容器中了,只不过A对象的属性b和B对象的属性a都还没有设置进去(未初始化)。

    5、在前面Spring创建B对象之后,Spring发现B对象依赖了属性A,因而还是会尝试递归的调用ApplicationContext.getBean()方法获取A对象的实例。

    6、因为Spring中已经有一个A对象的实例,虽然只是半成品(其属性b还未初始化),但其也还是目标bean,因而会将该A对象的实例返回。

    7、此时,B对象的属性a就设置进去了,然后还是ApplicationContext.getBean()方法递归的返回,也就是将B对象的实例返回,此时就会将该实例设置到A对象的属性b中。

    8、这个时候,注意A对象的属性b和B对象的属性a都已经设置了目标对象的实例了。

    9、此时可能会比较疑惑的是,前面在为对象B设置属性a的时候,这个A类型属性还是个半成品。但是需要注意的是,这个A是一个引用,其本质上还是最开始就实例化的A对象。

    10、而在上面这个递归过程的最后,Spring将获取到的B对象实例设置到了A对象的属性b中了。

    11、这里的A对象其实和前面设置到实例B中的半成品A对象是同一个对象,其引用地址是同一个,这里为A对象的b属性设置了值,其实也就是为那个半成品的a属性设置了值。

    Spring能够轻松的解决属性的循环依赖正式用到了三级缓存,在DefaultSingletonBeanRegistry 中,有着3个map。

    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implementsSingletonBeanRegistry {private final Map singletonObjects = new ConcurrentHashMap(256);private final Map> singletonFactories = new HashMap(16);private final Map earlySingletonObjects = new HashMap(16);

    ....略

    }

    ingletonObjects 它是我们最熟悉的朋友,俗称“ 单例池 ”“ 容器 ”,缓存创建完成单例Bean的地方。

    singletonFactories 映射创建Bean的原始工厂

    earlySingletonObjects 映射Bean的 早期 引用,也就是说在这个Map里的Bean不是完整的,甚至还不能称之为“ Bean ”,只是一个 Instance .

    展开全文
  • 一、输入数据要用new——实例化对象创建内存示例:Scanner reader = new Scanner(System.in);Scanner是一个类,reader为创建的一个Scanner的对象,new就创建了这个实例,为其分配变量。输入的基本类型数据:...
  • 我们在编写程序的时候经常使用new指令来创建一个对象,那么虚拟机再遇到一条new指令创建对象(仅限于简单对象,不包括数组和Class对象等)的时候,在虚拟机的内部到底是一个怎么样的过程。首先介绍几个在创建对象的...
  • java创建对象的过程

    2019-07-10 21:36:21
    工作中每天都在创建对象(new 对象),可是在jvm中具体是怎么实现的,对于这样的问题,在面试的时候,会...作为一名开发,都知道用new 对象的方式,来创建对象,可是对于在jvm中怎么创建对象的,那就比较麻烦了; ...
  • 这句话就是装载类的(和new 不一样,要分清楚)。 至于什么时候,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。  A a ...
  • 由于Set集合是不存储重复元素...public class HashSetDemo {public static void main(String[] args) {//创建HashSet集合对象HashSet hashSet = new HashSet();//创建学生对象Student s1 = new Student("爱学习", 2...
  • php创建对象的方法有:1、使用【new 类名()】创建;...方法有如下几种:1、用new 类名()创建一个对象2、将类名以字符串的方式放在一个变量中(学习视频推荐:java课程)3、用对象来创建对象,并且该对象是一个新对...
  • 我们在编写程序的时候经常使用new指令来创建一个对象,那么虚拟机再遇到一条new指令创建对象(仅限于简单对象,不包括数组和Class对象等)的时候,在虚拟机的内部到底是一个怎么样的过程。首先介绍几个在创建对象的...
  • 一、使用反射创建对象通过反射来生成对象有如下两种方式:方式一:使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对应类有默认构造器,而执行 newInstance() ...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼...这样一个语句,实际上是创建了个2个对象。一个是字符串对象"string",而str是一个引用对象,它指向"string"。如果你再写一个String str2 = "string";str2跟str1指向同...
  • 新建(NEW),表示线程被创建处理还没有真正启动的状态,可以认为它是一个Java 内部状态。就绪(RUNNABLE),表示该线程已经在JVM 中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU ...
  • /*** 设计模式:对问题...1,不允许其他程序用new创建该类对象。2,在该类创建一个本类实例。3,对外提供一个方法让其他程序可以获取该对象。步骤:1,私有化该类构造函数。2,通过new在本类中创建一个本类对...
  • 下面是创建 Scanner 对象的基本语法:Scanner s = new Scanner(System.in);接下来我们演示一个最简单的数据输入,并通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要 使用 ...
  • 展开全部1、Scanner是SDK1.5新增的一个类,可是62616964757a686964616fe78988e69d8331333365643535使用该类创建一个对象.Scannerreader=newScanner(System.in); 然后reader对象调用下列方法(函数),读取用户在命令行...
  • 向上转型变量shape可以引用任何Shape子类类型的对象,这叫多态,即一种类型的变量,可以一多种实际类型对象。对于变量shape,它就有两个类型,Shape,称之为shape的静态类型;类型Circle、Line、ArrowLine,称之...
  • 这句话就是装载类的(和new 不一样,要分清楚)。  至于什么时候,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。  A...
  • 首先看下JAVA创建对象的四种方式:用new关键字创建;(最常用的)调用对象的clone方法;利用反射,调用Class类的或者是Constructor类的newInstance()方法;用反序列化,调用ObjectInputStream类的readObject()方法;在...
  • 除了初学者,稍微懂些java语言的人都会注意到引用数据类型的问题.b并不是被创建的和a相同的对象,b就是a,b只是获得a指向的对象的引用.2.其次就是最朴素的,怎么创建的a就怎么创建b,重新走一遍获得a的流程这算是最基础的...
  • Scanner是SDK1.5新增的一个类,可使用该类创建一个对象。Scannerreader=newScanner(System.in);然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型next.Byte(),nextDouble(),nextFloat,nextInt(),...
  • 创建一个女朋友,她有很多的属性,比如:性别,年龄,身高,体重,类型等等,虽然每个女朋友都有这些属性,但是每个...相比如文字解释,我更习惯撸代码来解释,下面来一步步实现怎么用java来为你创建一个女朋友 首先定义一个女...
  • 通常用new操作符来实现,new关键字的意思是“给我一个新对象” String s=new String("asdf") 它不仅表示“给我一个新的字符串”,而且通过提供一个初始字符串,给出了怎样产生这个String的信息。 存储到什么地方 ...
  • if(SystemTray.isSupported()){//判断系统是否托盘//创建一个托盘图标对象TrayIcon icon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(Clock.class.getResource("/javax/swing/plaf/basic/icons/JavaCup16....
  • 1、Java 对象和类Java作为一...1.1 创建对象对象是根据类创建的,在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:(1) 声明:声明一个对象,包括对象名称和对象类型。(2) 实例化:使用关键字new...
  • 创建一个女朋友,她有很多的属性,比如...我们不需要关心她是怎么建造的,我们只需要去指定她的属性就行了相比如文字解释,我更习惯撸代码来解释,下面来一步步实现怎么用java来为你创建一个女朋友首先定义一个女朋友类:...
  • 对象的创建pyhton__new__来创建对象(__new__相当于Java中的构建函数),对象创建好之后会立即调用__init__方法,__init__方法有个参数self就是刚才__new__创建好的那个对象。通过我们有__init__方法中给对象的属性...
  • 当我们创建任何用户定义类的对象并打印该对象时,我们将获得该对象的十六进制地址。见下文,BookB=newBook("IncludeHelp");System.out.println(B);输出结果@2a139a55在这里,当我们打印Book类的B对象时,我们将获得...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 303
精华内容 121
关键字:

java怎么用new创建对象

java 订阅