知识点第二次整理
目录
内容11、是否可以从一个static方法内部发出对非static方法的调用?12、Integer与int的区别13、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?14、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?
内容
11、是否可以从一个static方法内部发出对非static方法的调用?
我觉得主要是区分静态方法是类加载时就创建,而非静态则是属于对象级别的需要创建对象才会存在,在调用静态方法时可能对象并没有被初始化。
12、Integer与int的区别
首先Integer是封装类默认值为null,需要实例化指向对象地址,int是基本类型默认值是0直接村粗数值
小问题:
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = new Integer(1);
int c = 1;
int d = 1;
Integer e = 1;
Integer f = 1;
Integer g = 130;
Integer h = 130;
Integer i = new Integer(130);
int j = 130;
}
1:a == b 吗? 不相等。两个new出来的对象地址不一样。
2:c == d 吗? 都是基本数据类型的值相等。
3: e == f 吗? g == h 吗?
答案是:e == f; g != h。为什么会出现这种情况?因为ava在进行编译时 Integer g = 130会被编译成 Integer.valueOf(130) ,这个可以通过反编译class文件看到。而通过Integer源码可以得出,Integer.valueOf() 方法会在数值-128~127之间会对Integer进行缓存,不会再重新new一个,所以 e==f ;当数值二大于127或者小于-128的时候则会重新new一个,所以g != h 。
13、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
14、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?
方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与子类之间多态性的一种表现。重载Overload是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,那么我们说该方法被重写了。子类的对象使用这个方法时,将调用子类中的定义。对子类而言,父类中的定义如同被“屏蔽”了一样。关于重载,如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,也就是参数签名不同,这种情况出现方法的重载。重载的方法是可以改变返回值的类型。
扩展:
区分重载方法
一个类中要是有多个相同名字的方法,Java如何才能知道你指的是哪一个呢?其实规则很简单,每个重载的方法都必须有一个独一无二的参数类型列表。甚至参数顺序的不同也足以区分两个方法。但是一般情况下别这么做,因为这会使代码难以维护。
说到这,可能会有这样的想法:“在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?”比如下面两个方法,虽然它们有相同的名字和形式参数,但却很容易区分它们:
void method(){}
int method(){return 1;}
只要编译器可以根据语境明确判断出语义,比如int x=method()中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果,这是你可能会调用方法而忽略方法的返回值。所以,如果像下面这样调用方法:
method();
此时Java如何才能判断调用哪一个method()方法呢?别人该如何理解这种代码呢?因此,根据方法的返回值来区分重载方法是行不通的。
15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。
平时用的比较少的就是抽象类了吧,所以简要说一下:
abstract 修饰符
抽象类:
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();。

浙公网安备 33010602011771号