静态(可继承) 和类一起存储在方法区
静态常量 public static final int ANIMAL_LEG=4;
静态变量 static String school;
静态代码块 static{...}
静态方法 public static void study(){...} 只能调用静态变量/方法
this(对象)不能调用静态
调用 类名.静态变量/方法 对象.静态变量/方法
构造方法 创建对象时调用 构造方法不能调用成员方法
构造代码块 {...} 成员方法不能调用构造方法
无参构造 public 类名(){} 调用:new 类名();
有参构造 public 类名(String name, int age){
this.name=name; // super(name); 调用父类有参构造
this.age=age;
}
私有构造 private public 类名(){} 不能创建对象(只能类调用静态方法)
运行时 先(第一行)调用父类的无参/有参构造(不写 默认调用父类无参)
构造方法中如果先调用其他构造方法 是 间接先调用 父类的无参构造
this("张三",18):调用本类构造方法 super("张三"):调用父类构造方法
成员常量 final int num=10;
成员变量 String name;
private int age; 私有变量
成员方法 public void show(){...}
public void setAge(int age){this.age=age;} 私有变量 set方法
public int getAge(){return age;} 私有变量 get方法
[单]继承 子类可以继承父类非私有的成员变量、成员方法
重写继承的成员变量、成员方法 子类权限>=父类权限
public>不写(默认修饰符)>private
调用父类的 super.成员变量/方法
调用子类的this.成员变量/方法
抽象类 abstract class Animal{
成员变量、成员方法
抽象方法 [public abstract void eat();] 有抽象方法的一定是抽象类
}
private私有 ×无法继承
final ×无法重写
static静态 ×类.抽象方法(无方法体)
接口
public interface 接口{ 没有构造方法
public static final int num=10; 静态常量
public abstract void show(); 抽象方法 无方法体
}
接口[多]实现
class 类 implements 接口1[,接口2]{
public void show(){...}; 重写抽象方法
}
接口[多]继承
interface 接口3 extends 接口1,接口2{...}
继承+实现
class 类1 extends 类2 implements 接口A, 接口B{...}
多态
父类型 对象名=new 子类型(); 方法参数为父类型 传入子类型
父类可以是:抽象类、接口 方法返回父类型 return子类型
对象.成员变量 调用父类成员变量
对象.成员方法 调用子类重写的成员方法
对象.静态变量/方法 调用父类静态变量/方法(父类型.静态)
不能调用子类特有的变量/方法
向上转型:父类型 对象名 = new 子类型();
an instanceof Dog 对象an 是 Dog类 的 实例(后代元素)true
向下转型:子类型 对象名 = (子类型) 父类型的子对象;
向下转型后 可调用子类特有的变量/方法
修饰符 访问权限:
public: 本类中
不写: 同包下
protected: 同包下/子类中
public: 都能访问
注意:如果类用public修饰,则类名必须与文件名相同。
一个java文件中只能有一个public修饰的类。
this.xxx 调用子类的成员变量/方法
this(1) 调用子类其他构造方法 在子类的构造方法第一行
super.xxx 调用父类的成员变量/方法
super(1) 调用父类的构造方法 在子类的构造方法第一行
Student s = new Student();
new Student(); //匿名对象,没有名字的对象
new Student().study(); //匿名对象 调用方法/属性
method(new Student()); //匿名对象 作为参数
public static Student getStudent(){
return new Student(); //匿名对象 作为返回值
}
final修饰符,可以用于修饰类、成员变量/方法 不能修饰构造方法
final修饰类:不能被继承,不能有子类
final修饰方法:不能被重写
final修饰变量:是不可以修改的,是常量 要在创建对象(赋默认值)前赋值
final String name;
public Person(String name){
this.name=name; // 构造方法 赋值 创建对象前赋值 都不会报错
}