一 类
定义:类可以看作是具有同一中属性/行为的集合;比如人(属性:姓名;行为:学习/吃饭)
相关定义:类名,实例,构造方法,属性,方法
代码举例:
public class People{ //类名通常大写
public String name; //公共属性
private int weight; //私有属性
public void study(){ //公共方法
System.out.println("i am studying"); //方法体
}
public void useprivatefun(){ //公用方法,可以调用私有方法
this.privatefun()
}
private void privatefun(){ //私有方法
System.out.println(this.weight+"too fat"); //方法体
}
public People(){} //构造方法,与类名相同,可以省略
public People(String name){ //构造方法的重构
new People(); //调用上述构造方法,一定要加new,一定要加new,一定要加new
this.name = name;
}
public static void main(String args[]){
People p1 = new People(); //p1就是People类的实例,这一过程叫实例化
People p2 = new People("tom") ; //p2也是实例,
p1.study(); //调用方法
}
}
二 继承
对于面向对象语言而言,继承最大的特点,可以理解为类的细分或者繁衍,如上述People是一个基类,可再分为Woman 和Man两个派生类,也可以分为Student,WOrker,Baby等派生类;
基类的属性和方法,派生类都能够直接继承过来
注意:对于基类的私有属性与方法(即用private修饰的),派生类都能全部继承过来,但是不饿能直接访问,例如
class Student extends People {
private int grade; //专有属性 成绩
@Override
public void study(int grade){
super.Speak();
}
@Override
public void useprivatefun(){
super.useprivatefun()
} //注意,只能重写public 和protected修饰的方法
public static void main(String args[]) {
Student s1 = new Student();
People s2 = new Student(); //向上转型
s1.study(); //正确
System.out.print(s1.weight); //正确 name公共属性,可以直接调用
s1.privatefun(); //直接报错
System.out.print(s1.weight); //直接报错 weight私有属性,不能直接调用
s1.useprivatefun(); //调用基类私用方法的途径,在父类中写一个公有方法调用私有方法,再在派生类中直接调用共有方法,也可以重写后调用
}
}
三 接口与实现
接口是java编程语言中的一个抽象类型,是抽象方法的集合,接口通常以interface来声明,一个类通过实现接口的方式,从而继承接口的抽象方法;接口的方法默认声明是 public abstract
接口不是类,编写接口的方式与类很相似,但它们属于不同概念,
相似点:①都可以有不同的方法;②字节码都在.class文件中;③类可以继承类,接口可以实现接口。
不同点:①接口不能实例化②接口中只能有抽象方法;③类中有构造方法,接口没有构造方法;④接口中没有普通成员变量,但可以有static final 修饰的变量,即常量⑤接口可以多实现,类只能单继承
接口与抽象类的区别:
①既然是类,抽象类可以有抽象方法(即没有方法体{}),也可以有普通方法(有方法体),还有构造方法,也能有各种类型的成员变量;但接口中只能有抽象方法,且成员变量(如果有)一定是public static final类型的;
注意:抽象类中有构造方法,但不能用new实例化;普通类中一定没有抽象方法,一旦有抽象方法一定是抽象类;
②接口中不能含有静态代码块及静态方法,但抽象类可以有
注意:jdk1.8之后,接口中可以有静态方法,其中包括方法体,调用可以直接用 接口名.方法名
③单继承,多实现
④类一旦实现接口,就要重写所有方法,除非该类是抽象类;
public interface OrderService { //jdk1.8
public static final String waitPay = "waitPay";
String w = "wy"; //public static final可以省略,默认
default void add(Order c){
System.out.print("df");
}; //default修饰方法必须要有方法体,调用需要实现类
static void fun(){
System.out.print("df");
} //静态方法必须要有方法体,调用直接用 接口名.方法
void delete(int id);
} //普通抽象方法,默认修饰为public abstract,可以省略
抽象类与接口使用场景:
①想要继承一些方法,并让它有默认实现,就用抽象类
②想要多继承,必须用接口
③如果基本功能一直在改变,就用抽象类
四 重写与重构
重写:子类对父类的允许访问的方法进行重新编写,或实现类对接口的方法进行具体实现编写,满足 “两同两小一大”原则
两同:方法名称与参数类型完全相同
两小:抛出异常情况更小或等于,比如父类抛出Exception,子类可能抛出IOException; 返回值类型更小或等于,比如父类方法返回List,子类可返回ArrayList;
一大:子类中被重写方法访问权限大于或等于父类中的原方法,比如父类中的方法就是public,子类中一定只能public
注意事项:父类中只有子类能访问到的方法能被子类重写(所以的方法和成员都被继承,但是被private的访问不到,没法重写)
声明为final的方法不能被重写;
声明为static的方法不能被重写;
重构:同一个类或其子类中,一定是同一个方法名,因为参数不同,返回类型可以相同,也可以不同;
参数不同包括:参数个数,参数类型,参数输入顺序必须至少满足一种不同; 满足后,可以改返回类型,可以改变访问修饰符;
但是不能以返回值类型作为重载函数的区分标准,一定是参数不同。
重写:可以理解为覆盖;;重载:多种表现形式
五 多态
多态可以理解为对象的多种表现形式,可理解为同一个行为具有不同表现形式或形态的能力,可理解为同一个接口,使用不同实例而执行不同的操作。
例如:一个按键在不同界面中有不同功能,可能弹出java API,可能弹出python api;打印功能在不同的机子上有不同形式,有黑白,有彩色;
People这个类,有fun方法,Man和Woman都继承了People这个类, Man中重写fun方法,playgame(),Woman中重写fun方法,shopping();这就是多态的体现;
因此多态存在必须满足:继承(或者实现), 重写,父类引用指向子类对象;
如
People p = new Man(); //调用方法时,首先检查父类有无该方法,没有就报错,有的话,就去调用子类的同名重写的方法
多态的好处:
使得程序具有良好的扩展性,并对所有类的对象进行通用处理;可以消除类型之间的耦合关系,可替换性,具有接口性,简化。