java面向对象和类,继承和多态
1.方法
定义方法
(1)public String getName(){
return this.name;
}
getName方法有返回值所用String
(2)public void setName(String name){
this.name = name;}
setName 没有方法没有返回值所以用void
方法名称首字母小写,后面的每个字母大写。
括号内是参数列表
this:方法内部可以使用隐式变量this,this指当前实例,this,field可以访问当前实例字段。
(2)中不能省略this,因为括号内部有局部变量名name,如果用name首先指的是局部变量名,而不是字段。
调用方法: 实例变量.方法名(参数)
方法中的参数绑定:你可以传递过去使name赋值,但是person中修改name变量,不影响main中的变量n的指向。
使用private定义方法,只能内部调用,外部只能掉public方法。
2.构造方法。
构造方法用来初始化实例,没有构造方法时编译器会自动调用构造方法。
定义多个构造方法,编译器根据参数自动判断。
构造方法里面也可以用构造方法。
public person();默认
3.继承
public class Person{...
}
public class Student extends Person{
}
Student从Person中继承,Student继承了Person的全部功能。Student只需要编写新的功能。
如果没有extends则默认从Object中继承。
继承树:一个类有且仅有一个父类,Object除外。
protected:
Person类定义的private字段无法被子类访问,
用protected修饰的字段可以被子类访问。
protected把字段和方法的访问权限控制在继承树内部。
super:
子类的第一句必须使用父类的构造方法,调用super()
没有super()时编译器会自动生成super()
如果父类不是默认的构造方法,子类就必须显示调用super()
向上转型:Person p = new Person(); Student s = new Student();
向上转型则为 Person ps = new Student(); Object o1 = p; Object o2 = s;
向下转型 :Person p = new Person();
Student s = (Student) p;向下转型。p可能指向的是Person的实例也可能是Student的实例。
当指向的是Persong 实例时会报错。
instanceof:操作符可以判断对象的类型。 p instanceof Person,p是Person的子类或本身是才为true。
p为null,则都为false。所以向下转型的时候先用instanceof判断,在向下转型
if(p instanceof Student){
Student s = (Student) p;
}
区分继承和组合:继承是is关系,组合是has关系。
Student 不宜从Book中继承但是可以有一个Book实例。
private Book book;
4.多态
(1)Override:子类再写父类的方法就叫覆写,
方法参数里也必须相同,方法签名不同就不是Override
加上@Override可以让编译器帮助检查是否进行了正确的覆写。
@Override不是必须的。
(2)Person p = new Student();
p.run();p声明的是Person,但是实际指向的是Student.所以调用的Student的run方法
(3)Objecr定义的几个重要的方法:
toString:把instance 输出为String public String toString(){}
equals: 判断两个instance是否逻辑相等 public boolean equals (Object o){}
hashCode:计算一个instance的哈希值。public int hashCode(){ }
(4)super:super可在子类的覆写方法中调用父类被覆写(Override)方法
public class Person{
public String hello(){
return “hello, ” + name;
}
}
public Student extends Person {
@ Override
public String hello(){
return super.hello() + "!";
}
}
(5) final:用final修饰的方法不能被覆写ovrride,public final setName (String name){}
用final修饰的字段在初始化后不能被修改。private final int score;
用final修饰的类无法被继承。public final class Student extends Person{}
5.抽象类
(1)抽象方法:class定义了方法但是没有执行的代码,这个方法就是抽象方法。
必须用abstract修饰,抽象方法没有执行语句,类也是抽象类
pinlic absttract class Person {
public abstract void run();
}
不能实例化抽象类如:Person p = new Person();
但是可以实例子类如:Person s = new Student(): Person t = new Teacher();
调用抽象方法可以实现多态。s.run(); t.run();
(2)抽象类是用来被继承,其子类必须实现其定义的抽象方法,否则编译错误。
所以抽象方法其实定义了规范。如果不是实现抽象方法,则该子类任是抽象类。
5.接口
接口(interface): 如果一个抽象类没有字段,所有的方法全是抽象方法,就可以把该抽象类改为接口
public interface Hello{
String hello();
String goodbye();
}
public class Person implements Hello {....}
public class Robot implements Hello,Comparable{...}
实现interface使用implements,可以实现多个interface.
抽象类和接口区别
注意:
inerface不能定义普通的实例方法但是能定义default方法
其子类不一定要实现default的方法,同时可以被子类覆写。
(2)一个interface可以继承自另一个interface,使用extens
public interface Person{String getName();}
public interface Students extends Person{String getSchool();}
public class primaryStudent implements Student{
@Overridde
public String getName(){...}
@Override
public String getSchool(){....}
}
PrimaryStudent必须实现Student的方法也必须实现Person的方法。