精华内容
下载资源
问答
  • 静态内部类可以被实例化!1.首先在外部类中的static方法中不能使用普通内部类,因为内部类必须要与外部类建立关联才能使用,可以说是同生共死。2.我在编码过程中,需要2个类共同完成一个功能,其中一个工具类只会被...

    最近遇到的一个问题,记录一下。

    静态内部类可以被实例化!

    1.首先在外部类中的static方法中不能使用普通内部类,因为内部类必须要与外部类建立关联才能使用,可以说是同生共死。

    2.我在编码过程中,需要2个类共同完成一个功能,其中一个工具类只会被用来完成这个功能,所以我选择将这个类作为内部类,但是这个内部类与外部类又没有直接的关联(使用普通内部类,我需要new一个外部类,通过外部类才能new一个内部类,这样显然不合适),所以我选择使用静态内部类。

    3.关于静态内部类的对象:首先多次new是在堆中创建了不同的对象,和普通类的对象一样。我在使用的时候,主要怕多个静态内部类的对象在程序运行过程中像静态成员变量一样一直占据内存空间导致OOM,经过验证,静态内部类的对象虽然每次new都生成一个对象,但是会被及时的回收,不会因为一直占据内存空间导致OOM。

    // 静态内部类

    private static class AA

    {

    int a;

    }

    btn1.setOnClickListener(new OnClickListener()

    {

    @Override

    public void onClick(View v)

    {

    for(int i = 0 ; i < 1000; i++)

    {

    // 静态内部类可以被实例化

    AA a = new AA();

    a.a = i;

    list.add(a);

    }

    }

    });

    btn3.setOnClickListener(new OnClickListener()

    {

    @Override

    public void onClick(View v)

    {

    for(int i = 0 ; i < list.size(); i++)

    {

    // 不为同一个对象

    Log.i("aaaa", list.get(i)+"");

    }

    }

    });

    e55789a2cbaa0fb37ed4300f61c9fe28.png

    通过btn3打印的Log我们可以看到静态内部类的对象不是同一个

    另外为了验证能不能及时回收,查看内存使用情况的方法:

    4bf887d102ba49d46fcf02634d068e06.png

    data object后面的Total Size就是程序中对象占用的内存,检测内存是否合理使用,你可以打开应该,来回的操作,看看TotalSize又没有明显的增长,正常情况下,如果没有垃圾数据,内存会及时的被回收,TotalSize也就维持在相对稳定的数值,如果,一直在上涨说明你的程序就有OOM的风险了。

    展开全文
  • java中静态代码块的用法 static用法详解 一java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始,在不...
  • 我试图使用mybatis连接本地mysql数据库,并...我搜索了一些结果,似乎我需要为POJO创建构造函数,但我想如果我使用lombok我必须这样做吗?Admin.java包com.cooldrinker.mybatis.model;import lombok.Builder;import l...

    我试图使用mybatis连接本地

    mysql数据库,并使用lombok for POJO对象,但我得到了“Error instantiating class”错误.我搜索了一些结果,似乎我需要为POJO创建构造函数,但我想如果我使用lombok我必须这样做吗?

    Admin.java

    包com.cooldrinker.mybatis.model;

    import lombok.Builder;

    import lombok.Data;

    @Builder

    @Data

    public class Admin {

    private String firstName;

    private String lastName;

    private String password;

    private String userName;

    }

    堆栈跟踪

    type Exception report

    message Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cooldrinker.mybatis.model.Admin with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.cooldrinker.mybatis.model.Admin.()

    description The server encountered an internal error that prevented it from fulfilling this request.

    exception

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cooldrinker.mybatis.model.Admin with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.cooldrinker.mybatis.model.Admin.()

    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)

    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    root cause

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cooldrinker.mybatis.model.Admin with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.cooldrinker.mybatis.model.Admin.()

    org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)

    org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)

    com.sun.proxy.$Proxy147.selectOne(Unknown Source)

    org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)

    org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)

    org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)

    com.sun.proxy.$Proxy149.getAdminByUsername(Unknown Source)

    com.cooldrinker.mybatis.dao.impl.AdminDaoImpl.getAdminByUsername(AdminDaoImpl.java:24)

    com.cooldrinker.dataservice.service.impl.AdminServiceImpl.getAdminByUsername(AdminServiceImpl.java:26)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)

    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)

    com.sun.proxy.$Proxy153.getAdminByUsername(Unknown Source)

    com.cooldrinker.controller.AdminLoginController.login(AdminLoginController.java:39)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)

    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)

    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)

    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)

    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)

    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)

    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)

    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    root cause

    org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cooldrinker.mybatis.model.Admin with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.cooldrinker.mybatis.model.Admin.()

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:83)

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:45)

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:38)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.createResultObject(FastResultSetHandler.java:376)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.createResultObject(FastResultSetHandler.java:355)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.getRowValue(FastResultSetHandler.java:255)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleRowValues(FastResultSetHandler.java:214)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSet(FastResultSetHandler.java:186)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:152)

    org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)

    org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)

    org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)

    org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)

    org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)

    org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)

    org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:59)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)

    com.sun.proxy.$Proxy147.selectOne(Unknown Source)

    org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)

    org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)

    org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)

    com.sun.proxy.$Proxy149.getAdminByUsername(Unknown Source)

    com.cooldrinker.mybatis.dao.impl.AdminDaoImpl.getAdminByUsername(AdminDaoImpl.java:24)

    com.cooldrinker.dataservice.service.impl.AdminServiceImpl.getAdminByUsername(AdminServiceImpl.java:26)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)

    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)

    com.sun.proxy.$Proxy153.getAdminByUsername(Unknown Source)

    com.cooldrinker.controller.AdminLoginController.login(AdminLoginController.java:39)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)

    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)

    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)

    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)

    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)

    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)

    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)

    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    root cause

    java.lang.NoSuchMethodException: com.cooldrinker.mybatis.model.Admin.()

    java.lang.Class.getConstructor0(Class.java:2902)

    java.lang.Class.getDeclaredConstructor(Class.java:2066)

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:57)

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:45)

    org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:38)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.createResultObject(FastResultSetHandler.java:376)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.createResultObject(FastResultSetHandler.java:355)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.getRowValue(FastResultSetHandler.java:255)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleRowValues(FastResultSetHandler.java:214)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSet(FastResultSetHandler.java:186)

    org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:152)

    org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)

    org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)

    org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)

    org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)

    org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)

    org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)

    org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)

    org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:59)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)

    com.sun.proxy.$Proxy147.selectOne(Unknown Source)

    org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)

    org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)

    org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)

    com.sun.proxy.$Proxy149.getAdminByUsername(Unknown Source)

    com.cooldrinker.mybatis.dao.impl.AdminDaoImpl.getAdminByUsername(AdminDaoImpl.java:24)

    com.cooldrinker.dataservice.service.impl.AdminServiceImpl.getAdminByUsername(AdminServiceImpl.java:26)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)

    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)

    com.sun.proxy.$Proxy153.getAdminByUsername(Unknown Source)

    com.cooldrinker.controller.AdminLoginController.login(AdminLoginController.java:39)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    java.lang.reflect.Method.invoke(Method.java:606)

    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)

    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)

    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)

    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)

    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)

    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)

    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)

    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    最佳答案 没有阅读文档,我想你可能需要一个no-args构造函数.你只有all-args构造函数.你可以告诉Lombok通过在类型中添加@NoArgsConstructor和@AllArgsConstructor来生成两者.

    展开全文
  • 对于初学JAVA的人总搞清楚对象是如何实例化的,假如之间存在继承关系,那就更糊涂了.总结以下内容,可以得到对象初始化过程: 1、 如果存在继承关系,就先父类后子类; 2 、如果在内有静态变量和静态块,就先...

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法。对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.

    总结以下内容,可以得到对象初始化过程: 1、 如果存在继承关系,就先父类后子类; 2 、如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数; 3 、继承关系中,必须要父类初始化完成后,才初始化子类。下面是一个例子:

    174ad5234c54e0e13cd176ca752f42b0.gif

    编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给静态变量分配内存空间并初始化,然后执行静态块。因此,在这里会输出: Static Block Employee Company:china soft Employee Company:china soft的输出也说明是先初始化静态变量然后再执行静态块,否则company将为null。 2然后在内存中为Employee分配内存空间,并做默认初始化(即所有变量初始化为默认值,这里都初始化为null)。 3 默认初始化完成后,开始显示初始化。即执行第5行,将phone初始化"0755-51595599",并且执行非静态方法块;因此在这里会有以下输出: Non-Static Block Employee phone:0755-51595599 4 最后才调用默认构造函数,在默认构造函数中调用了带参数的构造函数,所以在这里先输出带参数构造函数中的:Employee(String),然后才输出:Empoloyee()。

    23af9b48b88d0dcebcc5e60142d3aa26.gif

    上面的代码中Manager继承了前面写的Employee类,当我们编译并运行Manager类,会产生以下的输出:

    Static Block Employee Company:china soft Sub Static Block Manager department:sale Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager() 下面我们对结果做分析: 1 在行34实例化对象时,由于Manager继承了Employee,所以先从父类Employee开始;先给父类静态变量分配内存空间并初始化,然后执行父类静态块。然后再给子类静态变量分配内存空间并初始化,然后执行子类静态块,所以会得到以下输出: Static Block Employee Company:china soft Sub Static Block Manager department:sale

    2然后在内存中为父类Employee分配内存空间,并做默认初始化;再为子类Manager分配内存空间,并做默认初始化。 3默认初始化完成后,从父类开始显示初始化并执行非静态方法块和构造函数,然后再子类开始显示初始化并执行非静态方法块和构造函数。因此会产生以下的输出: Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()

    展开全文
  • Java中,文件是以.java为后缀的代码文件,在每个文件中最多只允许出现一个public,当有public的时候,文件的名称必须和public的名称相同,若不存在public,则文件的名称可以为任意的名称(当然以数字...

    一.你了解类吗?

    在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称(当然以数字开头的名称是不允许的)。

    在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化:

    1)对于  char、short、byte、int、long、float、double等基本数据类型的变量来说会默认初始化为0(boolean变量默认会被初始化为false);

    2)对于引用类型的变量,会默认初始化为null。

    如果没有显示地定义构造器,则编译器会自动创建一个无参构造器,但是要记住一点,如果显示地定义了构造器,编译器就不会自动添加构造器。注意,所有的构造器默认为static的。

    下面我们着重讲解一下 初始化 顺序:

    当程序执行时,需要生成某个类的对象,Java执行引擎会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象,如果已经加载,则直接生成对象。

    在类的加载过程中,类的static成员变量会被初始化,另外,如果类中有static语句块,则会执行static语句块。static成员变量和static语句块的执行顺序同代码中的顺序一致。记住,在Java中,类是按需加载,只有当需要用到这个类的时候,才会加载这个类,并且只会加载一次。看下面这个例子就明白了:

    public class Test {

    public static void main(String[] args) throws ClassNotFoundException {

    Bread bread1 = new Bread();

    Bread bread2 = new Bread();

    }

    }

    class Bread {

    static{

    System.out.println("Bread is loaded");

    }

    public Bread() {

    System.out.println("bread");

    }

    }

    运行这段代码就会发现"Bread is loaded"只会被打印一次。

    在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。也就是说类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散步于方法定义之间。

    public class Test {

    public static void main(String[] args) {

    new Meal();

    }

    }

    class Meal {

    public Meal() {

    System.out.println("meal");

    }

    Bread bread = new Bread();

    }

    class Bread {

    public Bread() {

    System.out.println("bread");

    }

    }

    输出结果为:

    bread

    meal

    二.你了解继承吗?

    继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。比如下面这段代码:

    class Person {

    public Person() {

    }

    }

    class Man extends Person {

    public Man() {

    }

    }

    类Man继承于Person类,这样一来的话,Person类称为父类(基类),Man类称为子类(导出类)。如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。

    1.子类继承父类的成员变量

    当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:

    1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;

    2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

    3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

    2.子类继承父类的方法

    同样地,子类也并不是完全继承父类的所有方法。

    1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;

    2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

    3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。

    注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)

    3.构造器

    子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。看下面这个例子就清楚了:

    class Shape {

    protected String name;

    public Shape(){

    name = "shape";

    }

    public Shape(String name) {

    this.name = name;

    }

    }

    class Circle extends Shape {

    private double radius;

    public Circle() {

    radius = 0;

    }

    public Circle(double radius) {

    this.radius = radius;

    }

    public Circle(double radius,String name) {

    this.radius = radius;

    this.name = name;

    }

    }

    这样的代码是没有问题的,如果把父类的无参构造器去掉,则下面的代码必然会出错:

    136b43b0bb01e889e0bc18d6740235f9.png

    改成下面这样就行了:

    aeb5d6e5cda9618e12a0e8b39fe426e9.png

    4.super

    super主要有两种用法:

    1)super.成员变量/super.成员方法;

    2)super(parameter1,parameter2....)

    第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。

    三.常见的面试笔试题

    1.下面这段代码的输出结果是什么?

    public class Test {

    public static void main(String[] args) {

    new Circle();

    }

    }

    class Draw {

    public Draw(String type) {

    System.out.println(type+" draw constructor");

    }

    }

    class Shape {

    private Draw draw = new Draw("shape");

    public Shape(){

    System.out.println("shape constructor");

    }

    }

    class Circle extends Shape {

    private Draw draw = new Draw("circle");

    public Circle() {

    System.out.println("circle constructor");

    }

    }

    shape draw constructor

    shape constructor

    circle draw constructor

    circle constructor

    这道题目主要考察的是类继承时构造器的调用顺序和初始化顺序。要记住一点:父类的构造器调用以及初始化过程一定在子类的前面。由于Circle类的父类是Shape类,所以Shape类先进行初始化,然后再执行Shape类的构造器。接着才是对子类Circle进行初始化,最后执行Circle的构造器。

    2.下面这段代码的输出结果是什么?

    public class Test {

    public static void main(String[] args) {

    Shape shape = new Circle();

    System.out.println(shape.name);

    shape.printType();

    shape.printName();

    }

    }

    class Shape {

    public String name = "shape";

    public Shape(){

    System.out.println("shape constructor");

    }

    public void printType() {

    System.out.println("this is shape");

    }

    public static void printName() {

    System.out.println("shape");

    }

    }

    class Circle extends Shape {

    public String name = "circle";

    public Circle() {

    System.out.println("circle constructor");

    }

    public void printType() {

    System.out.println("this is circle");

    }

    public static void printName() {

    System.out.println("circle");

    }

    }

    shape constructor

    circle constructor

    shape

    this is circle

    shape

    这道题主要考察了隐藏和覆盖的区别(当然也和多态相关,在后续博文中会继续讲到)。

    覆盖只针对非静态方法(终态方法不能被继承,所以就存在覆盖一说了),而隐藏是针对成员变量和静态方法的。这2者之间的区别是:覆盖受RTTI(Runtime type  identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。

    以上所述是小编给大家介绍的Java类的继承实例详解(动力节点Java学院整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    展开全文
  • 一、初始化过程1、2、二、静态代码块1、作用Java静态代码块的作用:Java静态代码块中的代码会在加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在...
  • 数据结构 - 如何在java实例化Queue对象?当我尝试:Queue q = new Queue();编译器给我一个错误。 有帮助吗?另外,如果我想初始化队列,我是否必须实现队列的方法?8个解决方案139 votesQueue是一个接口,这意味着...
  • 单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段。 通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前检查是否已实例化该对象(如果不是,则...
  • 构造器:就是构造函数,之前使用...这样java类中的数据的初始化和实例化捆绑在了一起,两者永不分离,提醒你必须实例化一些数据。而且一个类继承了它的父类总是在调用他自己的构造函数的时候先调用父类的构造函...
  • java变量的分类java变量大致可以分为三,第一为局部变量;第二为成员变量(通常也称为实例变量);第三为静态变量。第一:局部变量(local variable)局部变量是方法或语句块内部定义的变量,其生命周期是从...
  • 一、抽象类、抽象方法1、抽象类在面向对象的概念中,所有对象都是通过类来描述的。...由于抽象类不能实例化对象,所以抽象类必须被继承才能被使用。在java中,一个类只能继承一个抽象类。java中通过abstract ...
  • 如果你不需要内部对象与其外围对象之间有...而通常的内部需要在外部类实例化后才能实例化。想要理解static应用于内部时的含义,你就必须记住,普通的内部对象隐含地保存了一个引用,指向创建它的外围...
  • 当你自己写的想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用... 接口同抽象一样不能被实例化(但可以用作数据类型) ,抽象在继承另外一个抽象或者实现接口时 ,是可以不重写里面的方法的。
  • 因此如果子类是非抽象实现了接口,必须重写接口的所有方法.(接口的方法无法直接实例化)子类是抽象实现了接口,则不需要重写,因为抽象可以有抽象方法和非抽象方法. 二.继承 同理,父类如果是抽象.则子类必须重写...
  • java抽象详解

    千次阅读 2018-06-27 10:55:13
    1、Java抽象存在的意义,...3、抽象可以实例化吗?也就是说可以new吗? 抽象是不可以进行new的。所以想要使用抽象必须要用来继承它,然后可以用子类对象进行实例化。(抽象自身不能创建对象,但是它...
  • java 抽象

    2019-11-15 11:46:29
    /* 抽象类 抽象:模糊,不清晰,看不懂,...3.抽象类必须有子类覆盖其抽象方法,否则该子类依旧为抽象类 */ 抽象类中有构造函数吗 有,用于给子类进行初始 抽象类可以不定义抽象方法吗 可以,目的是为了不让这个...
  • 没有主体的方法称为抽象方法。它仅包含带有半冒号和前面的抽象关键字的方法签名。publicabstractmyMethod();要使用抽象方法,您需要通过扩展其并为...声明一个抽象后,它表明该不完整,无法实例化它。因此,如...
  • java抽象的构造方法和普通的构造方法...抽象就是一个不能实例化的不同不过如果方法加了abstract那么就必须在子类里面重写了(1)Java中抽象和接口中有构造方法吗?①在接口中 不可以有构造方法在接口里写入构...
  • 问题:Java的抽象可以实例化吗?如何实例化? 定义任何,若在关键词class 之前加上修饰符 abstract,它就成了抽象。抽象不允许直接被实例化。 也就是说,在任何一个能实例化的的定义前,放上关键字 ...
  • java抽象

    2020-06-08 08:55:50
    因为抽象不能实例化对象,所以必须要有子类重写他的属性和方法才能实现它。 当又有一个具有相似的组件产生时,只需要实现该抽象就可以获得该抽象的那些属性和方法。 1、 比如本科和研究生可以抽象成学生,他们...
  • 抽象类必须被子类继承来实现。 子类在调用父类时 无论自己有没有构造方法都会先去执行父类无参的函数。哪怕父类是抽象类。虽然抽象类不能被实例化,但是可以在构造方法中初始化一些参数;也可以在子类中调用父类的...
  • 没有主体的方法称为抽象方法。它仅包含带有半冒号和前面的抽象关键字的方法签名。publicabstractmyMethod();要使用抽象方法,您需要通过扩展其并为其...访问抽象的非静态方法由于无法实例化抽象,因此也无法访...
  • 接口和抽象的区别是什么? •接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象可以有非抽象的方法。...•接口不能用 new 实例化,但可以声明,但...
  • Java中,final是可与字段和方法一起使用的access修饰符。当一个方法为final时,它不能被覆盖。当变量为最终变量时,其值无法进一步修改。当结束时,不能扩展。无需初始即可声明最终变量如果稍后声明了最终...
  • 抽象类无法被实例化2.子类继承抽象类然后实例化子类3.子类继承了抽象类必须实现抽象类的中的抽象方法4.抽象类的定义:abstract class***5.抽象方法的定义:public abstract void ***();ps:抽象方...
  • 1. 抽象可以有构造函数吗?  抽象 可以有构造函数,但不显式调用;因为抽象不能直接实例化,也就是不能 new, ...2. abstract 可以实例化吗?  不可以直接实例化,只能被继承; 3.System class 中 In
  • java的关键字中,static...static关键字1,修饰成员变量,里面有属性和方法属性里面又分局部变量,实例变量和变量实例变量,在创建对象的时候分配空间初始化类变量不再属于某一个对象,它属于全公有;实例变...
  • 抽象类的概念: Java中,如果一个类中有一个方法声明是(抽象方法)抽象功能,...(不能创建对象) 接口也不能实例化关于抽象类: 1)如果一个类中有抽象方法,那么这个类是一定是一个抽象类 2)抽象类必须有抽象方法吗? ...
  • 面试题:1.抽象类可以有构造函数吗?2.抽象类的构造函数的作用?...抽象类的特点:抽象类不能实例化,即不能对其用new运算符如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的(否则,编译器就会报错)抽象类...
  • Java抽象有关知识点 什么是抽象 ...不能实例化抽象,只能靠它的子类去实现它,抽象是受约束的 那么抽象存在构造器吗? 我们可以通过下面的代码看出抽象存在构造器 public class Application {

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 177
精华内容 70
关键字:

java类必须实例化吗

java 订阅