方法重载(overload)是指:
多个方法的方法名相同单各个的参数不同 参数个数不同参数类型不同参数位置不同方法返回值类型通常都是相同的 public class Hello() { public void hello(String) {} public void hello(int age) {} public void hello(String name, int age) {} public void hello(int age, String name) {} }判断实例p是否属于Person类
System.out.println(p instanceof Person); //true如果一个class定义了方法, 但没有具体执行代码, 这个方法就是抽象方法
一个抽象方法用abstract修饰抽象方法没有任何执行语句因为无法执行抽象方法, 因此这个类必须申明为抽象类(abstract class), 所以定义了抽象方法的类就是抽象类无法实例化一个抽象类无法实例化的抽象类有什么作用?
抽象类用于被继承抽象类可以强迫子类实现其定义的抽象方法(否则编译错误)抽象方法实际上相当于定义了一个"规范"注意: 从抽象类继承的子类必须实现抽象方法, 如果不实现抽象方法, 则该类仍然是一个抽象类
// 父类 public abstract class Person { public abstract void run(); public void hello() { System.out.println("hello world"); } } // 子类 public class Student extends Person{ public Student(String name) { super(); System.out.println("create Student: " + name); } @Override public void run() { System.out.println("Student running"); } public static void main(String[] args) { Student student = new Student("lingjing"); student.run(); student.hello(); } }如果一个抽象类没有字段, 所有方法都是抽象方法, 就可以把该抽象类改成成接口(interface)
使用interface声明一个接口接口定义的方法默认都public abstract(不需要写)一个interface可以继承另外一个interface, 继承使用extends, 相当于扩展了接口的方法抽象类和接口对比:
abstract classInterface继承只能extends一个class可以implements多个interface字段可以定义实例字段不能定义实例字段抽象方法可以定义抽象方法可以定义抽象方法非抽象方法可以定义非抽象方法可以定义default方法static 修饰字段就是静态字段
所有实例共享一个静态字段不推荐使用实例变量访问静态字段: Person person = new Person(); person.number推荐使用类名访问静态字段: Person.number可以把静态字段理解成描述class本身的字段 public class Person { public static int number = 100; }用static修饰的方法称为静态方法
一搬调用实例的方法必须通过实例变量: Person person = new Person(); person.run()调用静态方法不需要实例变量, 提前是必须是静态方法: Person.run()静态方法不能访问this变量静态方法不能访问实例字段静态方法可以访问静态字段静态方法经常用于工具类 Arrays.sort()Math.random()classpath是一个环境变量, 指示JVM在启动程序的时候在什么路径下去搜索相关的类
例如:
java -classpath /usr/bin;/data/servers/hadoop/bin com.longfor.Hello #或者 java -cp /usr/bin;/data/servers/hadoop/bin com.longfor.Hello这样JVM在加载com.longfor.Hello这个类的时候, 一次查找
/com/longfor/Hello.class/usr/bin/com/longfor/Hello.class/data/servers/hadoop/bin/com/longfor/Hello.class在某个路劲在找到, 就不在继续搜索, 如果没有找到, 就会报错
classpath的设定方法:
推荐使用:
java -classpath /usr/bin;/data/servers/hadoop/bin com.longfor.Hello #或者 java -cp /usr/bin;/data/servers/hadoop/bin com.longfor.Hello如果没有设置环境变量, 也没有设置-cp参数, 默认的classpath为. 及当前目录
jar包是zip格式的压缩文件, 包含若干.class文件
jar包相当于目录classpath可以包含jar文件: /data/tmp/all.jar使用jar可以避免大量的目录和.class文件
jar的其他动能
jar包课包含一个特殊的/META-INF/MANIFEST.MF文件MANIFEST.MF是纯文本, 可以指定Main-Class和其他信息jar包可以包含其他jar包jdk的class
jvm运行会自动加载jdk自带的classjdk自带的class被打包在rt.jar中不需要在classpath中引用rt.jar示例:
jt0101020164:hadooptest lingjing$ tree META-INF/ META-INF/ └── MANIFEST.MF jt0101020164:hadooptest lingjing$ cat META-INF/MANIFEST.MF Manifest-Version: 1.0 Main-Class: com.longfor.Main X-Copyright: blablabla... X-Build-Version: 1.0int <———>Integer
public class Integer { private int value; public Integer(int value) { this.value = value; } }定义一个Integer类, 包含一个实例字段int, 可以把Integer视为int的包装类型
JDK为各种基本类型都创建了对应的包装类型
基本类型对应的引用类型booleanBooleanbyteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacter编译器可以自动在int和Integer直接转型
自动装箱: auto boxing int -> Integer自动拆箱: auto unboxing Integer ->int Integer n = 99; int i = n; Integer s = i + n; // Integer s = Integer.valueof(i + n.intValue()); 自动装箱和自动拆箱值发生在编译阶段装箱和拆箱会影响执行效率编译后的class代码是严格区分基本类型和引用类型的包装类型定义了一些有用的静态变量
Boolean.TRUE Boolean.FALSE Integer.MAX_VALUE; //2147483647 Integer.MIN_VALUE; //-2147483648转载于:https://www.cnblogs.com/lingshang/p/10976744.html