博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java拾遗
阅读量:5102 次
发布时间:2019-06-13

本文共 2896 字,大约阅读时间需要 9 分钟。

虽然去年就自学过Java,也写过Android。但是最近又爆出很多问题,很多细节问题,很多基础问题。这让我再次意识到基础的重要性。

问题一:子类何时调用父类的构造方法

如果你之前问我,我肯定会说,super的时候。
吐舌头
那么问题来了
实际呢,没有super也会调用的
尴尬
class parent {	public parent() {		System.out.println("parent");	}}public class Child extends parent {	public Child() {		System.out.println("Child");	}	public static void main(String[] args) {		// TODO Auto-generated method stub		Child c = new Child();	}}
结果:
parentChild
子类新建对象的时候都会调用父类的构造方法。而如果使用了super那么就调用super指明的父类构造方法,如果没写super,那么默认调用父类的无参构造方法,如果此时父类没有无参构造方法,则报错。
super一般是用来用父类的含参构造方法来初始化子类的。当然了super可以是super(),这样调用的还是父类无参的,不过没什么意义。
总之一句话,子类每次新建对象都会调用父类构造方法,并且只有一次。
class parent {	public parent() {		System.out.println("parent");	}	public parent(String name){		System.out.println("I'm "+name);	}}public class Child extends parent {	public Child() {		super("jelly");		System.out.println("Child");	}	public static void main(String[] args) {		// TODO Auto-generated method stub		Child c = new Child();	}}
答案是:
I'm jellyChild

问题1.1如果父类是抽象类呢

首先要明确的是,抽象类也是可以有构造方法的,虽然抽象类本身不能实例化。
我可以负责任的告诉你,抽不抽象都无所谓。上面所说的内容都适用于抽象父类,结果也相同。

问题二:静态成员可以被this引用吗

我们都知道在定义类的时候,其内部所有成员,我们大都可以直接引用,或者通过this来引用。比如:
class parent {	String name;	public parent(String name){		this.name=name;	}}
因为参数名和成员名重复了,所以一般都会用this来引用name成员。
但如果在声明的时候,改为:static String name;呢。
那么问题来了。
答案是可以不会报错,但是不鼓励这样写,比如eclipse就会给你一个叹号:并提示:
The static field parent.name should be accessed in a static way

问题三:静态成员会被默认初始化吗

我们都知道,Java是一种极其安全且严格的语言,所以如果我们的成员声明的时候没有初始化,它会自动初始化。比如 int 初始化为0,boolean为false,对象就为null。
那么问题来了。
静态成员也会被默认初始化吗
答案是可以的。

问题四:接口中的方法能动态绑定吗

我们都知道,java中当用子类初始化父类句柄的时候(比如Parent p = new Child();),会调用子类中的方法而不是父类中的同名方法,即为
动态绑定。(C++需要使用virtual关键字来实现)
class Parent {	public void callMe() {		System.out.println("Call me father!");	}}public class Child extends Parent {	static String name;	public void callMe() {		System.out.println("Call me child~");	}	public static void main(String[] args) {		// TODO Auto-generated method stub		Parent p = new Child();		p.callMe();	}}
结果是:
Call me child~
这就是动态绑定。
那么问题来了。
如果子类中实现了某接口中的方法,而父类没有实现该接口,那么我么可以用父类的句柄来调用该接口中的方法吗?
class Parent {	public void callMe() {		System.out.println("Call me father!");	}}interface Game {	public void gamename();}public class Child extends Parent implements Teacher {	static String name;	public void callMe() {		System.out.println("Call me child~");	}	@Override	public void gamename() {		// TODO Auto-generated method stub		System.out.println("I love LOL");	}	public static void main(String[] args) {		// TODO Auto-generated method stub		Parent p = new Child();		p.gamename();//注意这句	}}
那么请注意,上例可以正确运行吗?即父类句柄p可以调用子类实现的接口中的方法gamename吗?
答案是否定的。
我们必须对p进行转型才能调用该方法。
那么问题来了。
你应该会想到转型成Child类型。如果你只有一个类实现了Game接口,我们可以这样做。但如果我们有一个父类的数组,并且许多不同的子类(本例中,比如有Child1,Child2等等)实现了某一接口。
我们该如何实现自动调用子类中对应的接口呢?
答案是转型成接口!!
Parent obj[]=new Parent[5];for (int i = 0; i < 5; i++) {	((Game)obj[i]).gamename();}

转载于:https://www.cnblogs.com/unclejelly/p/4082044.html

你可能感兴趣的文章
C#中out和ref之间的区别
查看>>
js获取html5 audio 音频时长方法
查看>>
C语言 · 判断回文
查看>>
分享一款在线less转css的神器
查看>>
pandas把'<m8[ns]'类型转换为int类型进行运算
查看>>
判断一个字符串(str)是否以指定的字符串(target)结尾。 如果是,返回true;如果不是,返回false。...
查看>>
控制台编程基础总结
查看>>
Guava CaseFormat
查看>>
第一个C#程序
查看>>
第六次作业-----抽奖系统
查看>>
Message讲解
查看>>
Python3 OOP(一) 类和实例
查看>>
MySQLdb 1031 Error
查看>>
部门开始做技术talk
查看>>
英语-180709
查看>>
函数的参数,参数为数组
查看>>
奚恺元《别做傻瓜做的事》
查看>>
python 面向对象
查看>>
分享网页加载速度优化的一些技巧?
查看>>
小特效【较完善的滑动下拉菜单】【购物车加减器】
查看>>