20170811 - 今日技能封装 - A

Posted 清及

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170811 - 今日技能封装 - A相关的知识,希望对你有一定的参考价值。

1 什么是单一继承?继承是否具有传递性?
父类可以拥有多个子类,子类只能有一个父类。
是。

4 子类重写父类方法后,可通过super.父类方法访问父类方法,请举应用例子
class Foo {
public void f() {
System.out.println("Foo.f()");
}
}
class Goo extends Foo {
public void f() {
super.f();
System.out.println("Goo.f()");
}
}
class Test{
public static void main(String[] args){
Foo obj2 = new Goo();
obj2.f();
}
}

5 重写的方法可以访问子类的对象吗?
可以。

8 重写与重载的区别有哪些?
重写
①发上在父子类中,方法名称相同,参数列表相同,方法体不同
②遵循运行期,看对象调用方法。

重载
①发生在一个类中,方法名称相同,参数列表不同,方法体不同
②遵循编译期,看引用调用方法。

8 分析如上代码,输出结果为?

class Super {
public void f() {
System.out.println ("super.f()");
}
}

class Sub extends Super {
public void f() {
System.out.println ("sub.f()");
}
}

class Goo {
public void g(Super obj) { 
System.out.println ("g(Super)"); 
obj.f();
}
public void g(Sub obj) {
System.out.println ("g(Sub) "); 
obj.f();
}
}

class Test{
public static void main(String[] args){
Super obj = new Sub();
Goo goo = new Goo();
goo.g(obj);
}
}
分析过程:
关键代码在于goo.g(obj),

Goo型对象goo调用了g方法传入super型对象obj,
由于obj对象类型为super,于是根据obj对象类型调用匹配的方法g(Super obj)
(如何判断传入参数类型?如此处obj为什么类型数据?
Super obj = new Sub();
Goo goo = new Goo();
goo.g(obj);
Super类型,Super obj = new Sub()该句意思为将Sub()型赋给super型数据obj,以被赋值对象
的类型为准,所以obj类型为super.

————这就是 看对象调用方法,发生于对象被传参(来判断调用方法)时,

又,再调用obj.f(),则调用super型对象的f方法,但由于super对象实际值为子类sub型,而子类进行了方法的重写,
所以实际为调用子类的f方法,因此为sub.f
————这就是看引用调用方法,发生于子型赋父型的对象(此处为sub赋给super)调用自身方法时
(非重载的方法——相同的参数,相同的名字——签名相同)

 

9 看代码时看到调用方法时需判断什么?
调用的方法是重写还是重载的


16 类中private a,外部定义一个类后cell.a = 1;是否正确?
不正确,private后只能在类中被调用。

17 访问控制修饰符有哪些?分别起什么作用?
public
private
protected
默认不写
补充图。

18 类的访问修饰有几种?
public 或 什么都不写。

19 类中成员的访问修饰有几种?
四种

 

21 import xx.xx.* 可导入?
包中所有类。

22 import xx.aa 提示错误是什么原因?
aa类没有public.

24 什么是垃圾?垃圾回收机制是?
没有任何引用所指向的对象为垃圾,
GC不定时到内存中回收垃圾,不一定发现垃圾就立刻回收,可调用System.gc()建议JVM尽快回收。

25 什么是内存泄漏? 
即不被使用的内存没有被及时回收。

26 如何避免内存泄漏?
将不再使用的对象的引用设置为null。

27 成员变量的生命周期为?
从对象在堆中创建开始到堆中被回收结束。

28 堆
1 存储正在调用的对象中的成员变量

28 栈
1 存储正在调用中的(包括类中)方法的所有局部变量,包括方法内的参数
2 调用时会被分配一个对应栈帧,存储局部变量及参数,
3 调用方法结束,则被回收

28 非堆(方法区)存放的是什么?
.class文件及方法。

29 cell c = new cell() 具体运行过程.
1 在方法区先加载.class文件,并存储方法(如果有静态变量也会存储静态变量)
2 在堆中新建cell对象
3 在栈中新建引用c指向cell

30 多个对象,方法区有几个方法?如何分辨是什么对象?
一个方法
this.

31 成员变量分几种?
静态变量,实例变量。

class{
int a;
static int b;
}

32 什么是静态变量?上例哪个是?
有static修饰的变量,不属于对象,属于类,存储在方法区,只有一份,使用 类名. 访问

33 什么是实例变量?
属于对象的,存储在堆中,有几个对象就有几份,使用 对象. 访问。
即成员变量

34 静态变量何时用?
所有对象共享的资源如视频/图片/音频等。

35 静态变量a,构造方法中a++,问第一次建立对象赋值a=0,第二次建立对象a=
1

36 静态方法何时用?
对象与方法无关仅与时定义,有关时定义实例方法。


37 静态方法特点是?
由static修饰
存在方法区中,只有一份
常常通过类名.来访问
没有隐式this传递,静态方法中不能直接访问实例成员
何时定义静态方法:方法的操作仅与参数相关而与对象无关时使用

39 首字母大写为?

一般为类

40 新建对象一般是大写小写?

小写

41 静态方法需要新建对象调用吗?
不需要

42 静态块的特点是?如何定义?
由static修饰
类被加载期间自动执行,
因为类只被加载一次,所以静态块也只执行一次

何时用:常常用于初始化静态资源(图片、音频、视频...)

static {

}

42 概念要清晰,并将每一步所造成的作用明列。

---

1 java内存管理又几块组成?
堆 栈 方法区

Cell cell = new Cell();
cell.row++
cell.moveleft
上例各步分别处于什么区?调用方法时方法区的方法有几份?如何区分是不同的对象调用呢?
首先在方法区中加载.class并存储方法,如果有静态相关代码会先运行相关代码
接着在堆中新建一个Cell对象,再在栈中新建一个引用指向Cell.
再调用方法区的方法,方法运行则会在栈中生成一个匹配的栈帧存储方法所有局部变量及参数 调用完栈帧清除

1份

通过this.(调用方法时实际传入的是带有this的参数)

2 堆,栈,方法区分别存储什么数据?
堆,new出来的对象,包括成员变量
栈,正在调用中的方法的所有局部变量及参数。
方法区,方法区中存储.class字节码文件及存储方法

3 成员变量的生命周期为?
在堆中创建对象开始至对象被回收

4 重载和重写分别发生于什么场合?
重载发生于传参,传参时判断参数类型,根据参数类型调用匹配的方法。(小转大的情况,参数类型还是大)
重写则发生于小赋小或小赋大的对象调用自身方法时,需判断子类有无重写调用的方法,若有,则调用。

5 重写需要遵守什么规则?
两同两小一大
两同:重写方法签名要与父类方法相同
两小:子类方法的返回类型必须小于或等于父类的方法;抛出的异常~
一大:子类方法的访问权限大于父类的。

6 如何理解子类方法的返回值类型必须小于等于父类的?
void,基本类型时,必须相等
引用类型时,可以小于

7 class Aoo(){
void show(){

}
}

class Boo() extends Aoo{
void show(){

}
}
上方代码是否实现了重写?

8 class Aoo(){
void show(){

}
}

class Boo() extends Aoo{
int show(){
return 1;
}
}
上方代码是否实现了重写?
是(方法名与参数列表相同)
但会报错,返回值为void及基本类型时重写方法必须与父类相同。

9 class Aoo(){
double show(){
return 0.0;
}
}

class Boo() extends Aoo{
int show(){
return 1;
}
}
上方代码是否实现了重写?
是(方法名与参数列表相同)
但会报错,返回值为void及基本类型时重写方法必须与父类相同。


10 class Aoo(){
Boo xx(){
return null;
}
}

class Boo() extends Aoo{
Aoo xx(){
return null;
}
}
上方代码是否会报错?如果报错原因是?
会,下方Boo类内重写方法会报错,
子类重写返回值类型大于父类的原方法。

11 Boo xx(){
return null;
}
上方代码是否是什么意思?
定义了一个返回Boo类型值的叫做xx的方法。

12 同一类文件下,类间可以互相调用新建方法吗?
class Aoo(){
Boo xx(){
return null;
}
}

class Boo() extends Aoo{
Aoo xx(){
return null;
}
}
可以

13 重写与重载的区别是?
重写
1,发生在父类及子类中,方法名称及参数列表相同,方法体不同
重载
1,发生在一个类中,方法名称相同参数列表及方法体不同

14 访问控制分为什么?
包及访问控制修饰符

15 Java中如何解决命名冲突的问题?
用包,在定义一个类时,还需要定义包名。

16 定义包名的语法是?
package xx.xx.xx;

17 类的全称是什么?类通常是小写还是大写?
package xx.xx.xx.class
大写

18 跨包访问类有几种方法?
①import java.util.Scanner;
②java.util.Scanner scan = new java.util.Scanner(System.in)

19 命名类应大写还是小写?
Cell

20 package的建议命名方式是?
域名反写 . 项目名称 . 模块名称 . 类名
cn.tedu tedumana classmana lampmana

21 为何不同包的类可以同名?
类名实际包含包名,两个类的包名不同,自然类名可以相同。<br />

22 在设计程序时应用什么思想设计?
封装的思想——
即将属性私有化,方法公开化。(使数据仅能在当前类中访问,其他类无法访问,从而实现其他类只能调用
当前类内方法来间接访问(不一定修改),想想看,如银行卡密码定义在了银行卡类中,
其他类可以直接访问公有成员变量银行卡密码来修改,那样还安全吗?因此必须私有化,使得当类中变量
只能通过调用当类方法访问,当类方法中可以不设定改变密码的方法,从而实现封装)

因此类内属性必须私有化,方法则需公开化。

23 如何简单理解封装?
即只能通过类内方法定义类内成员变量,不可直接定义。

24 
A类
public class Point{
private int x;
private int y;
Point(int x,int y){
...
}
public int distance(Point p){}
}

同一包内B类
Point p1 = new Point(1,2);
p1.x = 4;
int x = distance(p1);

是否会报错?
p1.x = 4,会报错,x为私有成员,无法从外部直接访问修改。

25 访问修饰符有哪些?

 


反省,

看代码与写代码与判断时不同的思维方式。
判断题,复杂问题要简化,与基本模型比照
看代码,快速理解当句词意

以上是关于20170811 - 今日技能封装 - A的主要内容,如果未能解决你的问题,请参考以下文章

20170811 - 今日技能封装 - Q

20170811 - 今日技能封装 - Q1

20170804 - 今日技能封装 - A

20170817 - 今日技能封装 - A

20170803 - 今日技能封装 - A

20170818 - 今日技能封装 - A