01 instanceof和类型转换
instanceof的格式是System.out.println(x instanceof y);如果x和y是同一类型或者能类型转换(兄弟之间不能类型转换,父子之间可以类型转换)则编译通过,否则不通过。编译通过后会把x和y比较,如果x是y本类或者子类的对象,结果就是true,反之就是flase。
public class Application {
public static void main ( String [ ] args) {
Object object = new Student ( ) ;
System . out. println ( object instanceof Object ) ;
System . out. println ( object instanceof Person ) ;
System . out. println ( object instanceof Teacher ) ;
System . out. println ( object instanceof Student ) ;
System . out. println ( object instanceof String ) ;
System . out. println ( "=========================" ) ;
Person person = new Student ( ) ;
System . out. println ( person instanceof Object ) ;
System . out. println ( person instanceof Person ) ;
System . out. println ( person instanceof Teacher ) ;
System . out. println ( person instanceof Student ) ;
System . out. println ( "=========================" ) ;
Student student = new Student ( ) ;
System . out. println ( student instanceof Object ) ;
System . out. println ( student instanceof Person ) ;
System . out. println ( student instanceof Student ) ;
System . out. println ( "=========================" ) ;
}
}
类型转换:
把子类转换成父类,向上转型 把父类转换成子类,向下转型:强制转换
public class Student extends Person {
public void go(){
System.out.println("Student");
}
}
public class Application {
public static void main(String[] args) {
//高转低
Person obj = new Student();
//方法一
Student student = (Student) obj;
student.go();//Student
//方法二
((Student) obj).go();//Student
//低转高可能丢失一些自己本来的方法
Student student = new Student();
Person person = student;
//person.go();报错!
}
}
02 static关键字详解
public class Person {
{
System . out. println ( "匿名代码块" ) ;
}
static {
System . out. println ( "静态代码块" ) ;
}
public Person ( ) {
System . out. println ( "构造方法" ) ;
}
public static void main ( String [ ] args) {
Person p1 = new Person ( ) ;
System . out. println ( "==========" ) ;
Person p2 = new Person ( ) ;
}
}
非静态方法和静态方法可以调用静态方法,而静态方法不能调用非静态方法。 静态导入包:
import static java. lang. Math . random;
public class Person {
public static void main ( String [ ] args) {
System . out. println ( random ( ) ) ;
}
}
调用非静态方法必须new一个对象进行调用,而调用静态方法可以直接用类调用,比如Student.run()。 在方法中调用变量:调用非静态变量不能直接用类调用,要创建一个对象进行调用,而调用静态变量既可以用类进行调用,也可以用对象进行调用。
03 抽象类
abstract修饰符,如果修饰方法就是抽象方法,如果修饰类就是抽象类。 抽象类中可以没有抽象方法,但是只要有抽象方法,必须声明抽象类。 抽象类不能用new实例化。 抽象方法只有方法的声明而没有具体实现,实现是让子类来完成的。 子类继承抽象类,就必须实现抽象类中没有实现的抽象方法,否则子类也要声明为抽象类。
public abstract class Application {
public abstract void run ( ) ;
public void go ( ) {
System . out. println ( "有普通方法也是可以的" ) ;
}
}
04 接口
接口的本质是契约,是对对象的抽象 用interface定义接口 接口的作用:
约束 定义一些方法,让不同的人实现(10个人可以实现一个接口) 接口中的所有定义的方法其实都是抽象的 public abstract 接口中的所有定义的变量其实都是静态常量 public static final 接口也不能被实例化(没有构造方法) implements可以实现多个接口,就是相当于多继承 实现接口,必须要做重写接口中方法
public interface Person {
void add ( String name) ;
void delete ( String name) ;
void update ( String name) ;
void query ( String name) ;
}
public interface Teacher {
void run ( ) ;
}
public class Student implements Person , Teacher {
@Override
public void add ( String name) {
}
@Override
public void delete ( String name) {
}
@Override
public void update ( String name) {
}
@Override
public void query ( String name) {
}
@Override
public void run ( ) {
}
}