面向对象(Object Oriented Programming,OOP)是一种思想,Java可以通过这种思想设计程序。最笨的理解就是让别人去干活,自己做管理。
一. 类:
class Human { public static void main(String[] args) { System.out.println("HelloWorld!我是human."); }}
前面几篇中的程序上来就有一个HelloWorld类,其中有个程序入口main方法。所谓的方法也就是功能,通过它我们可以做到在屏幕上向世界问好。现在有一个类叫人类(Human),他自己在喊话,的确显得有点累。下面我们让他操作一台机器来喊话。
在同一个java文件里,我们新建了一个机器(Machine)类,此时的类Machine并不是实实在在的机器,仅仅泛指“机器”这个种类,要想让它干活,还得具体到“对象”,也就是实实在在的机器。
二. 对象:
上面再main方法中,我们根据Machine这个种类,用new创建一个实实在在的machine对象。然后让这个对象运用shout功能,去打印Hello~。
三. 类和对象:
类,是对象的“模板”;对象,是类的实例。类,比如说人;对象,具体的某个人。类,比如说狗;对象,比如说我家的狗狗。我们所在的main方法是程序的Boss,调用其它对象干活,其它对象之间也可以互相调用。main方法所在的类也可以根据需要实例化。
在编程中,我们要根据需要将一些功能集成到一个类中,然后通过调用它的实例来处理数据。当对象产生,OOP就有了封装的概念。
四. 封装:
使用既定的权限关键字修饰,我们可以对类的属性和方法进行隐藏,这里就有了封装的概念。封装显示了Java的安全性。两个对象只能根据权限互相访问调用,而不是随意的。如果你不公开姓名,我就没法知道;我不公开自己的体重,你也不会知道。
public 公开:随意访问。
private 私有:同一个类中可以访问。只能修饰类的属性、方法,或内部类
protected 保护的:同一个包内,以及子类可以访问。只能修饰类的属性、方法,或内部类
default 默认的:同一个包内可以访问。默认没有标注权限修饰符的都是default。
public class PowerTest //我。一个java文件中只能有一个public修饰的类{ public static void main(String[] args) { System.out.println("\t警察抓小偷:\n"); Thief t=new Thief(); t.Steal(); Police police=new Police(); System.out.println("\t直接叫警察,警号:"+police.pliceNum); police.Call(); police.Catch(); police.Drive(); //police.Eta(); //私有的只能在同一个类中访问 Operator operator=new Operator(); System.out.println("\t打话务员报警"); operator.Call(); }} class Police //警员{ public int pliceNum=100010; //警号,公开 private int appetite=3; //饭量,私有 protected int familyMember=3; //家庭成员,受保护的 public void Call(){ System.out.println("我是警察,随时Call我"); } public void Catch(){ System.out.println("警察抓捕窃贼"); } private void Eat(){ System.out.println("警察在吃饭"); } protected void Drive(){ System.out.println("良民可以搭顺风车"); }} class Thief{ private String name="ThreeHand"; private void Eat(){ System.out.println("贼也得吃,自己吃"); } protected void Steal(){ System.out.println("小偷顺手牵羊"); }} class Operator{ public void Call(){ System.out.println("呼叫110,话务员转警察"); Police p=new Police(); p.Catch(); }}
五. 抽象:
抽象就是不仔细,没有细节,泛泛的,大体的。如果根据一群人抽象一下“人”这个概念,我们会总结身高、体重、吃饭、哭笑等等方面。身高体重是属性,这个不属于抽象的范围,但吃饭、苦笑是两个功能,属于抽象的范围,每个具体的人根据实际情况来实现吃饭或哭笑。abstract用来修饰抽象的类或方法。
如果出现了抽象方法,那么所在类一定为抽象类;但抽象类中不一定有抽象方法。
当子类没有全部实现抽象类的抽象方法时,须要下一级的子类实现剩余的抽象方法。
抽象类不能用new实例化出对象;须要被继承,并实现其定义的抽象方法。
六. 继承:
extends,继承。也就是遗传自,来源于,属于。如父子相传,小狗属于动物,大楼根据图纸盖得。当然根据封装的概念,如果图纸是保密的,大楼就没法盖。
class Human { public static void main(String[] args) { Bus bus=new Bus(); bus.shout(); bus.move(); }}abstract class Machine{ abstract void shout(); //后面没有大括号,没有任何语句 abstract void move();}class Bus extends Machine{ void shout () { System.out.println("嘀嘀!"); } void move() { System.out.println("跑~"); }}
1. 子类会得到父类所有非私有的属性和方法,
class Human { public static void main(String[] args) { Child child = new Child(); child.shout(); System.out.println(child.country); }}class Father{ String country="中国"; void shout () { System.out.println("我爱祖国"); }}class Child extends Father{ //继承了父类的属性和方法}
2. 重写,如果子类中有一个和父类中同名的方法,子类的这个会将父类中的覆盖,
/*方法覆盖*/class Father{ void shout () { System.out.println("父类中的方法"); }}class Child extends Father{ //重写父类中的同名方法 void shout () { System.out.println("子类中的方法"); }}class Human { public static void main(String[] args) { Child child = new Child(); child.shout(); }}
七. 接口:
一个特殊的抽象类,其中所有的方法都是抽象的。所有属性和方法都是public权限。接口的修饰符是interface,要实现接口需要implements。接口也是一系列功能的集合。
和抽象类一样,子类必须全部实现接口的抽象功能,否则子类也是抽象的。
class Human { public static void main(String[] args) { Child child = new Child(); child.eat(); child.shout(); System.out.println("Child实例:"+child.country); System.out.println("Child类:"+Child.country); System.out.println("Father类:"+Father.country); }}interface Father{ public static final String country="China"; public void eat(); public void shout();}class Child implements Father{ public void eat(){ System.out.println("Eatfood."); } public void shout(){ System.out.println("Letus sing"); }}
八. 构造方法
任何一个类都有构造方法,就如任何人都有魂儿一样(唯心的说法)。当我们用new创建一个实实在在的人(对象)时,实际是在调用人(类)的灵魂(构造方法)。灵魂是不能被继承的。灵魂可以有很多(精神分裂)。灵魂可能很贪婪。灵魂也是可以沟通的。
/*方法名与类名相同的无返回值*/class Human{ //穷发飙的魂儿,无参 Human () { System.out.println("我是魂儿"); } //贪婪的魂儿,须要获取参数 Human(int i) { System.out.println("干活收费:"+i+"刀"); } void shout () { System.out.println("我是人类"); }} class Structure { public static void main(String[] args) { Human h1=new Human(); h1.shout(); Human h2=new Human(10); h2.shout();}
这里又多了一个新的概念,重载。有两个构造函数,参数列表不同,两次调用实现了不同的功能。
参数列表中,如果参数数量不同,或参数的数据类型不同,或参数的顺序不同,都会发生重载。重载和构造函数的返回值无关。和参数名无关。
/*方法名与类名相同的无返回值*/class Human{ //穷发飙的魂儿,无参i Human (int i) { System.out.println("一个整型参数 "+i); } //贪婪的魂儿,须要获取参数 Human(int i, int j) { System.out.println("两个整型参数 "+i+","+j); } Human (int i, String s) { System.out.println("一个整型参数 "+i+",一个字符串 "+s); } Human (String s, int i) { System.out.println("一个字符串 "+s+",一个整型参数 "+i); }} class Structure { public static void main(String[] args) { Human h1=new Human(9); Human h2=new Human(9,8); Human h3=new Human(9,"Tom"); Human h4=new Human("Tom",8); }}
九. 多态
多种身份,见人说人话,见鬼说鬼话。比如我们有个鬼类,用它来创建了一个实实在在的人,这个人首先继承自鬼,有鬼的面孔,却说着人话。(这个例子很凌乱。)
class Ghost{ Ghost(){ } void horror () { System.out.println("鬼吓人!"); }} class Human extends Ghost{ Human(){ } void horror () //重写 { System.out.println("人吓人!"); }} class Polymorphism{ public static void main(String[] args) { Ghost gh=new Human(); gh.horror(); }}
我们无法让这个鬼面人心的家伙变得鬼面鬼心,但可以让它人面人心。修改main函数中的内容,
Ghost gh=newHuman(); //向上转型gh.horror();Humang=(Human)gh; //向下转型g.horror();
天才是百分之一的灵感加上百分之久十久的努力