JAVA面向对象知识点总结
- 形参如何放入数组?
第一种用类型+…的形式
第二种用可以直接把形参写成数组的形式
如下
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
class Group {
private String[] names;
public void setNames(String[] names) {
this.names = names;
}
}
-
参数绑定
当传递的参数为基本类型和引用类型时,参数的绑定状态有所不同。
当传递的参数为基本参数时,参数传递后,任意修改一方的数值,不影响另一方
当传递的参数魏引用类型是,参数传递后,修改一方的数值,另一方发生影响。因为它们共同引用同一个地址的数据。 -
继承时的构造函数
在子类的构造函数中,如果父类没有默认不传递值的构造函数,那么在子类构造函数需要传递值的时候,要切记传递父类的值,使用super调用父类构造函数。 -
关于继承中的转型问题
在想象类的继承结构的时候,最好把类的父类想象成更高一级的类。因此向上转型的含义为把一个子类当作父类来引用。最后又由向下转型来复原。
Person p1 = new Student();
Student si = (Student)p1;
为了避免向下转型的错误,可以用instanceof操作符来判断是否转的下去。
System.out.println(p instanceof Person); // true
-
多态
关于多态是指函数最后的运行方法取决于函数的实际类型。 -
抽象类
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。
因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。
使用abstract修饰的类就是抽象类。我们无法实例化一个抽象类:
抽象类的作用是提供一个类设计的模板。
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.run();
}
}
abstract class Person {
public abstract void run();
}
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}
总之 类中只要有一点abstract这个类就是抽象类,就还不可以实例化。
- 接口
接口跟抽象类的区别在于接口的全部属性均为public abstract 所以不能在接口中包含实例字段,此外,接口允许多继承。如果接口中存在字段,一定为public static final 类型。 - 静态方法
静态方法只能操作静态类。 - 内部类
内部类不能脱离外部包含的类独立存在,代码示例如下
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("Nested"); // 实例化一个Outer
Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
inner.hello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
class Inner {
void hello() {
System.out.println("Hello, " + Outer.this.name);
}
}
}
观察上述代码,要实例化一个Inner,我们必须首先创建一个Outer的实例,然后,调用Outer实例的new来创建Inner实例,访问时也要用outer.this来访问。
- 匿名类
匿名类的声明结构如下:
用来完成对某一特定功能的实现。
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("Nested");
outer.asyncHello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
void asyncHello() {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello, " + Outer.this.name);
}
};
new Thread(r).start();
}
}
- classpath
指定了jvm如何找到class文件,具体用法等用到了再深入。 - 模块
模块确定了不同jar之间的依赖关系.模块中的对外提供资源的权限要在module-info.java中说明。如
module hello.world {
exports com.itranswarp.sample;
requires java.base;
requires java.xml;
}