1、方法 class
class Person {
public String name;
public int age;
}
2、构造方法
当未定义构造方法时,默认为
class Person {
public Person() {
}}//没有参数也没有执行语句
当定义了构造方法后,Java就不会再提供默认的无参构造方法
如定义了一个带参数的构造方法,Person(String name, int age)。若在main函数里写
Person p = new Person();就会发生编译错误
就需要把两个构造方法都定义出来
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Xiao Ming", 15); // 既可以调用带参数的构造方法
Person p2 = new Person(); // 也可以调用无参数构造方法
}
}
3、继承extends
已知存在person类(父类),构造student类(子类)继承于person:
class Student extends Person {
注:
通过继承,Student只需要编写额外的功能,不再需要重复代码。
子类无法访问父类私有字段和方法
只允许单继承
4、多态
在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写
加上@Override可以让编译器帮助检查是否进行了正确的覆写
// override
public class Main {
public static void main(String[] args) {
}
}
class Person {
public void run() {}
}
public class Student extends Person {
@Override // Compile error!
public void run(String s) {}
}
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
// Polymorphic
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income... incomes) {
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
}
class Income {
protected double income;
public Income(double income) {
this.income = income;
}
public double getTax() {
return income * 0.1; // 税率10%
}
}
class Salary extends Income {
public Salary(double income) {
super(income);
}
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
观察totalTax()方法:利用多态,totalTax()方法只需要和Income打交道,它完全不需要知道Salary和StateCouncilSpecialAllowance的存在,就可以正确计算出总的税。如果我们要新增一种稿费收入,只需要从Income派生,然后正确覆写getTax()方法就可以。把新的类型传入totalTax(),不需要修改任何代码。
5、抽象类
抽象类
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。
因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。
6、接口
如果一个抽象类没有字段,所有方法全部都是抽象方法:
abstract class Person {
public abstract void run();
public abstract String getName();
}
就可以把该抽象类改写为接口:interface。
接口也可以继承
7、静态字段
用static修饰的字段,称为静态字段:static field。所有实例都会共享该字段
无论修改哪个实例的静态字段,所有实例的静态字段都被修改了
静态方法
有静态字段,就有静态方法。用static修饰的方法称为静态方法。
调用静态方法则不需要实例变量,通过类名就可以调用
8、包
把各种类封装在包里
package ming; // 申明包名ming
public class Person {
}
引用其他包的class:
1)直接写出完整类名:
mr.jun.Arrays arrays = new mr.jun.Arrays();
2)用import语句,导入小军的Arrays,然后写简单类名:
package ming;
// 导入完整类名:
import mr.jun.Arrays;
public class Person {
public void run() {
// 写简单类名: Arrays
Arrays arrays = new Arrays();
}
}
3)import static的语法,可以导入一个类的静态字段和静态方法:
package main;
// 导入System类的所有静态字段和静态方法:
import static java.lang.System.*;
public class Main {
public static void main(String[] args) {
// 相当于调用System.out.println(…)
out.println("Hello, world!");
}
}
9、作用域
2053

被折叠的 条评论
为什么被折叠?



