java 关于初学面向对象的问题一:对象的三大特性
2016-04-12 14:49
344 查看
1、创建对象时,JVM给方法分配内存空间吗?
答:否。方法在main方法调用时才分配。
2、允许在本类中利用本类创建对象吗?
答:允许。但注意不要递归创建本类对象,会造成栈溢出。
3、方法的参数表/返回值类型允许是类吗?
答:可以。所有数据类型都可以作为参数类型和返回值类型。
4、方法名允许和类名相同吗(不是构造方法)?
答:程序语法没有做限制,但是不合乎规范。
5、private修饰的属性是不能被继承的,但是get/set方法是公开可以被继承的,这样做有什么作用?
答:private修饰的属性不能被直接引用,可以有效封装属性,避免被程序员的不小心滥用。但是属性在创建对象时依旧会占用内存空间尽管它不能被直接访问到。
6、如何通过子类的构造方法给父类(继承的)属性赋值?
答:使用super(参数表)调用父类的有参构造方法从而实给父类属性赋值。如下面的代码:
7、当构造方法既要引用本类的构造方法,又要调用指定父类的某个构造方法,我们怎么使用this()和super()?
答:两个不能同时显式调用,因此推荐调用super。
8、this()、super()都必须在构造方法中的第一句。在调用this()时,子类会调用父类的那个构造方法?
答:在使用了this()的情况下,系统默认调用父类的无参构造方法。但是不能显式调用父类的无参构造方法。
9、从父类继承的属性可以在子类中修改其数据类型吗?如何才能构成重写?
答:可以修改但是没有实际意义。而且父类引用将会访问父类的属性,不会访问子类的属性;子类引用将只能访问子类的属性。
10、继承的类创建对象过程和以类作为属性的创建对象过程有什么异同点?
答:请参考《ava
关于初学面向对象的问题二:创建对象过程》。
11、属性私有的父类声明的引用,子类的对象,堆空间是否存在属性空间?
答:存在。因为如果父类提供了公开的get/set方法,我们可以发现我们依旧能对这个属性进行访问和设值。另外在创建对象时,调用构造器的时候,会先递归创建父类对象在构造器中给属性初始化的赋值依旧有效。如果没有存储空间就意味着没有这个属性,自然也就不能访问。但是private只是提供一个访问权限,说明我们对继承下来的属性我们看不到,就像是将属性装在盒子里,如果父类给了我钥匙(get/set方法)我就能访问到。当然如果父类没有给出钥匙,我就只能知道有这么个盒子,但里面是什么我永远不会知道。所以如果父类是抽象类的话,我们就应该属性私有化的同时提供一对get/set方法,否则属性将不能访问控制,这就没有意义。
12、对于子类的静态成员,父类引用可以调用吗?
答:不能。所有子类特有(父类没有定义或者声明的)的成员,在多态中都无法调用。
13、可以将父类对象强制转化为子类吗?
答:不能。父类对象本质上不是子类的特殊对象,与子类不兼容。instanceof不兼容的条件是:声明的引用不能指向创建的对象。子类声明的引用不能指向父类创建的对象,两个非直系血缘关系的类之间声明的引用和创建的对象。然而在这是没有语法错误的,但运行时会抱一个类型不匹配的错误信息。
14、创建对象是抽象类是否分配空间?
答:创建对象会给所有属性分配空间,方法在调用时分配。
15、抽象类的属性私有化之后,子类如何给属性赋值?
答:构造方法和初始化代码块。
答:否。方法在main方法调用时才分配。
2、允许在本类中利用本类创建对象吗?
答:允许。但注意不要递归创建本类对象,会造成栈溢出。
3、方法的参数表/返回值类型允许是类吗?
答:可以。所有数据类型都可以作为参数类型和返回值类型。
4、方法名允许和类名相同吗(不是构造方法)?
答:程序语法没有做限制,但是不合乎规范。
5、private修饰的属性是不能被继承的,但是get/set方法是公开可以被继承的,这样做有什么作用?
答:private修饰的属性不能被直接引用,可以有效封装属性,避免被程序员的不小心滥用。但是属性在创建对象时依旧会占用内存空间尽管它不能被直接访问到。
6、如何通过子类的构造方法给父类(继承的)属性赋值?
答:使用super(参数表)调用父类的有参构造方法从而实给父类属性赋值。如下面的代码:
<span style="font-size:14px;"><span style="font-size:14px;">public class Person { String name; int age; boolean gender; double height; // 构造方法 public Person(String name, int age, boolean gender, double height) { this.name = name; this.age = age; this.gender = gender; this.height = height; } } public class Superman extends Person{ char clothesColor; double flySpeed; public Superman(String name, int age, boolean gender, double height, char clothesColor, double flySpeed) { super(name, age, gender, height); this.clothesColor = clothesColor; this.flySpeed = flySpeed; } }</span></span>调用super(参数表)就可以给继承到的父类属性赋值,要注意的是要将super调用的构造方法的参数在子类中将参数传进去。
7、当构造方法既要引用本类的构造方法,又要调用指定父类的某个构造方法,我们怎么使用this()和super()?
答:两个不能同时显式调用,因此推荐调用super。
8、this()、super()都必须在构造方法中的第一句。在调用this()时,子类会调用父类的那个构造方法?
答:在使用了this()的情况下,系统默认调用父类的无参构造方法。但是不能显式调用父类的无参构造方法。
9、从父类继承的属性可以在子类中修改其数据类型吗?如何才能构成重写?
答:可以修改但是没有实际意义。而且父类引用将会访问父类的属性,不会访问子类的属性;子类引用将只能访问子类的属性。
10、继承的类创建对象过程和以类作为属性的创建对象过程有什么异同点?
答:请参考《ava
关于初学面向对象的问题二:创建对象过程》。
11、属性私有的父类声明的引用,子类的对象,堆空间是否存在属性空间?
答:存在。因为如果父类提供了公开的get/set方法,我们可以发现我们依旧能对这个属性进行访问和设值。另外在创建对象时,调用构造器的时候,会先递归创建父类对象在构造器中给属性初始化的赋值依旧有效。如果没有存储空间就意味着没有这个属性,自然也就不能访问。但是private只是提供一个访问权限,说明我们对继承下来的属性我们看不到,就像是将属性装在盒子里,如果父类给了我钥匙(get/set方法)我就能访问到。当然如果父类没有给出钥匙,我就只能知道有这么个盒子,但里面是什么我永远不会知道。所以如果父类是抽象类的话,我们就应该属性私有化的同时提供一对get/set方法,否则属性将不能访问控制,这就没有意义。
12、对于子类的静态成员,父类引用可以调用吗?
答:不能。所有子类特有(父类没有定义或者声明的)的成员,在多态中都无法调用。
13、可以将父类对象强制转化为子类吗?
答:不能。父类对象本质上不是子类的特殊对象,与子类不兼容。instanceof不兼容的条件是:声明的引用不能指向创建的对象。子类声明的引用不能指向父类创建的对象,两个非直系血缘关系的类之间声明的引用和创建的对象。然而在这是没有语法错误的,但运行时会抱一个类型不匹配的错误信息。
14、创建对象是抽象类是否分配空间?
答:创建对象会给所有属性分配空间,方法在调用时分配。
15、抽象类的属性私有化之后,子类如何给属性赋值?
答:构造方法和初始化代码块。
相关文章推荐
- java.sql.Date 与 java.util.Date 的转换
- 权限管理框架实现(2)--Struts中ValueStack使用
- 搭建SpringMvc框架中遇到的问题记录
- 八皇后问题(java实现)
- java递归遍历文件
- [Java] 03 String获取文件后缀名,判断文件是否合法
- java在excel里插入文字数据和图片(JXL方式)
- Java进阶之----LinkedList源码分析
- XML数据映射到javaBean
- Java实现邮件发送实例
- myeclipse测试数据库连接
- 类字面变量
- java学生成绩管理系统
- 码农小汪-spring框架学习之9-基于 Java 的配置元数据 @ImportResource
- 怎样在MyEclipse上耍Chrome
- Java学习之TXT追加文本的三种的方式
- Java volatile Java虚拟机提供的最轻量级同步机制
- JAVA如何抛出异常
- LeetCode 35 -Search Insert Position ( JAVA )
- 学习JAVA中RSA算法实现