Java上路06-面向对象


       面向对象(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();  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值