Java基础篇--1
1、抽象的(Abstrect)方法是否能同时是static?
abstract修饰是为了子类重写的,而static修饰的方法不能被重写,所以不存在这样的情况。
定义抽象方法必须public 或 protect,也不能使用static,fianl或default修饰。
子类和父抽象类不能有相同的static方法(返回值,参数相同)否则编译报错。参数不同或类型不同时,他们不是重载,重载是在一个类中的概念,so此时,子类和父抽象类中2个静态方法没任何关系。
一个类继承抽象类,必须实现所有抽象方法,否则他还是抽象类
抽象方法中static方法调用:
1、子类没有相同的静态方法。可以
2、静态方法(static method)能否访问非静态方法?
静态方法只能访问静态成员变量,非静态方法的调用必须创建对象。
3、static可否用来修饰局部变量?
NO
4、内部类与静态内部类的区别?
静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法;
普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。
如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。
5、Java中是否可以覆盖(override) 一个private或者是static的方法?
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
6、switch
(1)、switch(value) value类型?jdk版本不同,一些实现不同
a.switch要求value值必须是整型
基本数据类型:int,byte,short,char
基本数据类型封装类:Integer,Byte,Short,Character
枚举类型:Enum(JDK 5+开始支持)
字符串类型:String(JDK 7+ 开始支持)
float double long型强转也行
case后面只能是常量,可以是运算表达式,但一定要符合正确的类型。不能是变量,即便变量在之前进行了赋值,JVM依然会报错。
value可以以参数传递进来。
(2)、beak
a.case没有匹配的值,则执行default。就算其他case没有break,也执行default。
b.匹配上,但无break。会执行该case后的case,直遇到break,若无则执行所有case后的语句,包括default。
c.匹配上,有break,则直接跳出。
(3)、default位置:
default位置不影响,可以放到case任意位置,但是一般在最后。
7、Integer
缓存:
public static final Class<Integer> TYPE = Class.getPrimitiveClass("int");//获取基本数据类型的class
Integer 类将 [-128-127] 这256个数字实例化了,也就是说用 Integer 来实例化其中某个数都是直接调用缓存中的实例,创建的多个实例都是同一个。
1 nteger h1 = new Integer(12); 2 Integer h2 = new Integer(12); 3 System.out.println(h1==h2); //false 注:生成新的 4 5 Integer int1 = Integer.valueOf("100"); 6 Integer int2 = Integer.valueOf("100"); 7 System.out.println(int1 == int2); // return true 8 在-128到127之间调用jvm缓存的数据 9 Integer int11 = 100; 10 Integer int21 = 100; 11 System.out.println(int11 == int21); // return true 12 13 Integer int12 =new Integer(100); 14 int int22 = 100; 15 System.out.println(int12 == int22); // return true
字符串:
String s ="ddd";
System.out.println(s instanceof String);//true
8、返回值区分重载?
只要编译器可以根据语境明确判断语义,那么的确可以区分重载方法。不过,有时候你并不关心方法的返回值,你想要的是方法调用的其他效果(为了副作用而调用),这时你可能会调用方法而忽略其返回值。
这时Java如何判断该调用哪个重载方法?别人该如何理解这种代码?因此根据方法的返回值来区分重载方法是行不通的
-- 摘自Java编程思想
比如有2个方法,
1 void f(List list) { } 2 int f(List list) { return 1; }
当你调用 int f(List list) 方法时,只是需要方法对list进行处理,但是并不需要返回值。因此在调用的时候,就会直接写成 f(List list); 而不会写成 int i = f(List list)。
这时编译器发现有 2个f(List list) ,无法知道你到底调用的哪个。别人看你写的代码时,也不好知道你调用的哪个方法。
9、接口:
接口的含义理解:接口可以理解成统一的"协议",而接口中的属性也属于协议中的内容;但是接口的属性都是公共的,静态的,最终的
接口的成员特点:
A:成员变量 只能是常量。默认修饰符 public static final 可以是public static String s="ds"; or public final String s="ds
B:成员方法 只能是抽象方法。默认修饰符 public abstract
方法可以实现具体实现,但修饰符必须是default /static,否则编译报错(static修饰时子类也有相同的该方法时,会隐藏接口里的该方法。)
ps:接口 对象名称 = new 子类();对象名称.该static方法。这种写法是错误的,编译报错,因为static不能被继承。若想调用接口中静态方法:接口.(static method)
//所以接口定义属性可以这么写:
public interface People { int age=10; String name="输出名字";//接口里面定义的成员变量都是 public static final修饰 public void eat(); //注意:要给出初始值 }
c、访问权限,接口啊接口,就是为了给别人用的,记得无论你写与不写,所有的一切都是public
1 public interface MyInterface { 2 static final String name = "test"; //默认给你加上public的,放心哥们 3 void walk(); //抽象方法也同理,隐式的有public的哦 4 void jump(); 5 abstract void fly();
d、接口可以继承一个接口,想不到吧,接口可以继承(扩展)多个、多个、多个(重要的事说三遍)接口。
1 public interface MyInterface extends FirInterface, SecInterface, ThirdInterface{ 2 static final String name = "test"; 3 void jump(); 4 abstract void fly();