多态的继承相关
无论父类中的成员变量是静态的、还是非静态的,都会被子类继承。但是父类中的私有成员变量,无法在子类中直接访问,可以通过从父类中继承得到的protected、public方法(如getter、setter方法)来访问。
接口
接口是一种特殊的抽象类,是常量值和方法定义的集合。java类是单继承的,但接口可以多继承。不允许类多重继承的主要原因是,当A同时继承B和C中,B和C同时有一个D方法,A不能确定继承哪一个。
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
注意:
1)一个类如果实现了一个接口,则必须实现该接口的所有强制方法。否则此类必须声明为抽象类。
2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。
3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。
4)接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。
5)接口中所有非静态非默认的方法都必须是抽象方法。(默认方法和静态方法JDK8版本才出的)
6)接口中没有构造方法,不能创建对象。
7)如果一个类实现了一个接口,那么这个类的实例可以赋值给这个接口类型的变量。
8)接口中所有非静态非默认的方法都必须是抽象方法。
嵌套接口
定义在类或接口中的接口
嵌套接口的修饰符限制:不论在接口中,还是类中,嵌套接口默认强制是static。
接口定义在类中可以使用四种访问权限;定义在接口中,则只有public。
枚举类型
枚举类型的实例可以像引用静态方法或者成员变量的方式被引用,但是不可以被实例化。
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
文档
构造函数
构造函数的函数名与类名相同,不用定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有)。
当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。
值传递
hashCode:散列码是由对象导出的一个整型值。散列码是没有规律的。类的hashCode()方法继承自Object类,因此每个对象都有一个默认的散列码,他的值为对象的存储地址(由对象的物理存储地址通过散列转换来的)。
package Day1;
public class Ex1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "java";
String b = "java";
String c = "ja";
String d = "va";
String e = c+d;
String f = a+b;
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
System.out.println(d.hashCode());
System.out.println(e.hashCode());
System.out.println(f.hashCode());
}
}
运行结果
访问控制
Java中不写访问控制符,默认为friendly类型,可以被同一个包中的类使用。
this关键字
this关键字指向的是当前对象的引用。如果不用this,会出现这种情况
public class Ex1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person();
p1.setName("Mike");
p1.setGender("man");
System.out.println("Name is "+p1.getName()+",sex is"+p1.getGender());
}
}
class Person{
private String name;
private String gender;
Person(){}
Person(String name,String gender){
this.name = name;
this.gender = gender;
}
public void setName(String name){
name = name;
}
public String getName(){
return name;
}
public void setGender(String gender){
gender = gender;
}
public String getGender(){
return gender;
}
}
而用加了this的构造函数时
package Day1;
public class Ex1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("Mike","Man");
System.out.println("Name is "+p1.getName()+",sex is "+p1.getGender());
}
}
class Person{
private String name;
private String gender;
Person(){}
Person(String name,String gender){
this.name = name;
this.gender = gender;
}
public void setName(String name){
name = name;
}
public String getName(){
return name;
}
public void setGender(String gender){
gender = gender;
}
public String getGender(){
return gender;
}
}
注解
@Override 对注解的方法进行检查(如名称拼错的情况)
注解不能改变程序的语义,只是提供编译或者运行时可选的元信息。
Lambda表达式
基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
用Lambda表达式遍历集合