A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java基础编程白话讲解

(本文稿由武汉校区就业部老师提供)
day01
1.   javac 相当于一个翻译官 将你的.java文件翻译成虚拟机能读懂的内容
2.   java 相当于一个工具,虚拟机使用此工具去做文件里面要求做的事儿.
大白话:
比如你是外企员工,你的老板是外国人,安排你做事儿给你的文档你看不懂,然后找一个翻译官给你翻译,翻译过后,你根据文件内容去做事儿.其中虚拟机就是你自己,翻译官就是javac命令,java就是你完成工作的工具,然后你就输出了helloworld 做完了文档中的事儿.

day02
1.   常量:太阳的个数,一年有多少个季节,一天多少小时(这些永远不会改变的量,我们就称之为常量)
2.   变量:车的时速(同样是车的速度,在高速或者市区速度区间是不一样的),在程序运行中,会随各种情况改变的量.
3.   例子:
           intspeed;
           speed= 60;
           System.out.println("市区限速,最高只能跑" +speed);
           speed= 120;
           System.out.println("我们在高速上,可以随便跑"+ speed);
4.   8大基本数据类型:(相当于各个不同容量的容器,有的装水,有的饮料)  
      bytebeizi;//可以装1升水的
      shortwan;//可以装2升水的碗
      int  shuigang;//可以装4升水的水缸
      longshuichi;//可以装8升水的池子
      floatyouhu;//可以装4升油的壶
      doubleyutong;//可以装8升油的桶
      charjiuping;//可以装2升啤酒的瓶子
      boolean    yesOrno;//true false真相只有一个 要么真 要么假 是非黑白
思考:    如果有5升水 你应该用什么来装?
例子:    beizi = (byte) 128;
           System.out.println(beizi);//这里面 打印出-128 为什么了?因为你的杯子不够大水满则溢
5.   数据类型转换:  小杯子中的水倒入大杯子,水不会溢出 (叫隐式转换)
                         把大杯子中的水倒入大杯子中,虽然可以将小杯子装满,但是装不下的会溢出(水满则溢,月盈则亏) (叫强制转换)
6.   算术运算符:      (其实就是数学中的一些加减 乘 除 大于 小于 取余数 )
+         -          *          /          >         <         >=      <=      %
特殊的 ++ --
++我们在java中叫做自增
--我们在java中叫做自减
++在前,先做自增操作再执行后面的代码,++在后,先执行后面的代码再自增
--在前,先做自减操作再执行后面的代码,--在后,先执行后面的代码再自减
7.   赋值:我们给杯子里倒水 给油桶装油
8.    比较运算符:     相互比较    有大于,小于,等于,大于等于,小于等于
     判断完之后 结果始终是boolean (true,false)
9.   逻辑运算符 或 与 非   (死扣概念) 注意 短路区别
day03
1.   三目运算符
boolean ? 值1 : 值2
布尔值为true,取值1,布尔值为false,取值2
白话:   
明天下雨吗? 带伞: 不带伞
有xx吗? 男: 女     (可以引导到if elseif else)
解释:什么是三目?那么我要先问什么是两目?简单举个例子1+2=3;这就是两目,就是两个模块,那么一目呢?就是i++;这个就是单目,就是只有一个模块,我们观察上面的语法,有三个模块,所以我们称为三目。
再看他的语法结构,第一个模块:布尔。这里不管你直接给个布尔变量也好,还是给比较表达式,只要结果是布尔就可以。然后就?这就是问的意思,问第一个模块是真还是假,真的话怎么办?选择值1,假呢?选择值二。这就是三目的原理。合成一句话就是我问第一个模块是对还是错,对就选择值一,错就值二。
然后强调一点,三目的运算符的返回值是看你的值1:值2,这两个值是什么数据类型就返回什么数据类型。

2.    程序运行流程:
顺序结构:   从上往下
If结构:
if(boolean){
}
白话:    相当于一个门 你拿到钥匙key 如果钥匙是对的,给你开门,执行{}中的代码钥匙不对,{}中不执行,If语句就像一个门,小括号就是钥匙孔,这个门只有true才能打开.
例子:    if(是男人嘛?)
{
男厕所
} else{
女厕所
}          //if你是男的 去男厕所 否则去女厕所
If else if...else结构
if (boolean){}
else if(boolean){}
else if(boolean){}
...
else{}
白话: 有多个箱子,其中一个有宝贝,你只有一把钥匙,然后你得一个个去试,只有一个箱子能被打开,然后你得到宝贝.

3.   if嵌套
if(大门钥匙){
      进了大门,看到房门
      if(房门钥匙){
           进了房门,拿到了房间里的钱
      }else{
           进不去房门,什么也拿不到
      }
}
例子:    boolean bigDoorKey = true; // 大门钥匙
           booleanbedRoomKey = true; // 房门钥匙
           if(bigDoorKey) {
                 System.out.println("我进了大门了,哈哈哈,看到一个房门");
                 if(bedRoomKey) {
                      System.out.println("我进了房门,拿到一个娃娃");
                 }else {
                      System.out.println("房门钥匙不对,什么都不给你看");
                 }
           }
           
4.    switch语句
   江苏卫视非诚勿扰节目
  int heartBitGirlNum=1;// 上台选心动女生编号
   switch (heartBitGirlNum){
         case 1:
                System.out.println("您的女朋女是如花");
               break;
             case 2:
                System.out.println("您的女朋女是石榴姐");
                break;     
             case 3:
                System.out.println("您的女朋女是马蓉");
                 break;  
             case 4:
                System.out.println("您的女朋女是梅超风");
                 break;
             case 5:
                System.out.println("您的女朋女是容嬷嬷");  
                break;
             case 6:
                System.out.println("您的女朋女是凤姐");

                 break;
             case 7:
                System.out.println("您的女朋女是灭绝师太");
                break;
             case 8:
                System.out.println("您的女朋女是东施");
                 break;
                 case 9:
                System.out.println("您的心动女生是韩红");
                 break;  
             case 10:
                System.out.println("您的女朋女是芙蓉姐");
                break;               
             case 11:
                System.out.println("您的女朋女是金星");
                  break;
           case 12:
                System.out.println("您的女朋女是芙姐");
             break;
              default:      
                System.out.println("您的女朋女是凤姐");
              break;           
        }
5.   for循环
            for (int i = 0; i < 100; i++) {
                 System.out.println("女朋友的名字");
           }
//首先 初始化条件,再判断条件 再第一次循环,在条件控制语句,也就是++,然后再条件判断,在条件控制,以此类推。

day04
1.   while循环
当我活着的时候,我每天都要吃饭,呼吸,睡觉
咯儿屁了 就break;
while(){
}//小括号里写条件判断表达式,或者boolean变量 重点是结果是boolean就可以
例子1:
           intage = 0; // 你出生了
           while(age <= 100) {
                 System.out.println("我过" + age + "岁生日了");
                 age++;
                 if(age == 100) {
                      System.out.println("嗝儿屁了");
                 }
           }
例子2:
           booleanisLive = true; // 你出生了
           while(isLive) {
                 for(int i = 0; i <= 100; i++) {
                      if(i == 100) {  //100岁的时候,嗝儿屁了
                            break;
                      }
                      System.out.println("我过" + i + "岁生日了");
                 }
           }
2.   do while()循环
do {
//首先执行这里面的代码
}     while() {//再判断小括号里面是是否是true 是true就继续执行
}
特点:循环必定执行一次,然后再判断条件是否满足
3.   continue   break   return
continue是结束本次的循环(就是这个关键字后面的代码不执行了),继续下一次
break,结束循环
return,结束这个方法,方法弹栈
4.   方法
解释:    做一件事的方式和方法
格式:
public static void 把妹(){
}
白话:撩妹三十六式 每个人把妹的方式都不一样
例子:    public static boolean 把妹(){
                 if(高富帅){
                      System.out.println("妹子跟我坐跑车走了...");
                      return true;
                 }else if(矮矬穷){
                      System.out.println("妹子说要坐在宝马里哭");
                      return false;
                 }
           }
5.   方法重载:
死扣概念:方法名一样,参数列表必须不一样,跟返回值无关
例子:    public static int 把妹(){
                 return把了几个妹
           }     
           publicstatic String 把妹(鲜花,跑车){
                 return妹子的长相
           }
           publicstatic boolean 把妹(卫龙,棒棒糖,酸奶){
                 return把到没有
           }
day05
1.   数组
白话:就相当于一个酒窖 里面有很多瓶子
int[] pingzi = new int[10] //相当于有10个空瓶子瓶子
pingzi[0] = 啤酒;   //动态初始化,往瓶子里面灌各种各样的酒
pingzi[1] = 红酒;
pingzi[3] = 威士忌;
...
2.   引用类型和基本数据类型传参的区别
记住:    引用类型当参数传递的时候,传递的是它本身
基本数据类型当参数传递的时候,传递的是它的副本

day06
1.    类和对象
类:分类的意思(日常生活中我们先找到具有相同属性的事物把其分为一类)
对象:每个个体,具备相同属性的对象属于同一类(比如:在坐的属于人类,我们吃的属于食物类,我们喝的属于饮品类)
类和对象的关系:类是对象的模板,对象就是按照类的模型来创建
例子:   
/**
* 人类
* 人类需要具备各种属性
* 那么我们创建的人类对象所有人都会有这么几个属性:
* 人种,肤色,性别
* 证明人类是每个人的模板
*
*/
public class Human {
  String race;  //人种
  String color; //肤色
  String sex;   //性别
}
public static void main(String[] args) {
     //创建了三个人,每个人都有这些属性,所以类是对象的模板,所有对象都是按照类中的属性创建的
     Human xiaoming = new Human();  //一个人(对象出生了)
     xiaoming.color = "黄";       //每个人(对象)具备相同的属性 属性内容不一样(属性值)
     xiaoming.sex = "男";
     xiaoming.race = "中国人";
     
     Human jack = new Human();    //一个人(对象出生了)
     jack.color = "白";        //每个人(对象)具备相同的属性 属性内容不一样(属性值)
     jack.sex = "男";
     jack.race = "欧洲人";
     
     Human sam = new Human();     //一个人(对象出生了)
     sam.color = "黑";         //每个人(对象)具备相同的属性 属性内容不一样(属性值)
     sam.sex = "男";
     sam.race = "美国人";
  }
2.    封装
白话:    辛辛苦苦存了100万,直接放在家里茶几上,安全吗?看看代码:
public class Home {
    int money = 100; //辛辛苦苦攒了一百万
}
//你家熊孩子回来了,看见了一百万
public static void main(String[] args) {
     HomeXiongHaiZi = new Home(); // 你家熊孩子回家了
     System.out.println("熊孩子一回家,看见" + XiongHaiZi.money + "万"); // 看到一百万
}
//熊孩子一看,我靠,一百万,拿出去做个大保健,撩个妹,总之要花点儿去
public static void main(String[] args) {
     HomeXiongHaiZi = new Home(); // 你家熊孩子回家了
     System.out.println("熊孩子一回家,看见" + XiongHaiZi.money + "万"); // 看到一百万
     System.out.println("拿点儿花花,撩妹,大保健..."); // 激动的不行,拿钱出去花
     XiongHaiZi.money = 55; // 花了45万,100万剩下55万(重新赋值)
     System.out.println("只剩下" + XiongHaiZi.money + "万了");
  }
//辛辛苦苦好几年,一天回到解放前
这时候我们想,这怎么办,钱放茶几不安全啊,怎么办,那么伟大的java给我们提供了封装private(相当于保险箱,没有密码我不给你),现在我把钱藏起来了,一般人我不给他知道,看看代码
public static void main(String[] args) {
     HomeXiongHaiZi = new Home(); // 你家熊孩子回家了
     System.out.println("熊孩子一回家,看见" + XiongHaiZi.money + "万"); // 找不到钱了,哈哈哈
  } The field Home.money is not visible
熊孩子回家了,还想再花点儿,找不到钱了.
封装特性:就是在其他类中无法直接访问你私有的属性(安全)

关于get和set
嗯你钱是藏起来了,但是问题来了,万一你老婆要用找不到怎么办 ????
public static void main(String[] args) {
     HomeLaoPo = new Home(); // 你家老婆要买包
     System.out.println("熊孩子一回家,看见" + LaoPo.money + "万"); // 找不到钱,等着你回来,今晚睡沙发
}
你老婆也没看到钱,等你回来,要么跪CPU,要么今天晚上睡沙发
所以不管你藏在哪你的告诉你老婆啊,那么在java代码中private,是封装,(藏钱的关键字)
那么还有public,暴露自己,在其他的类中可以访问到(也就是告诉你老婆钱在哪),不多说,撸代码!!!
你把钱藏的位置和保险箱的密码也告诉你老婆了
public class Home {
  private int money = 100; // 辛辛苦苦攒了一百万,用保险箱private保险箱藏起来
  // public修饰对外提供访问的公有方法,让其他类可以直接访问,相当于只要有密码,保险箱就可以打开
  public int zaiZhe() { // 告诉你老婆钱在这里,你老婆现在能看到钱在保险箱里
     return money; // 私有的属性,在本类中可以直接拿来用,有了密码我就可以找到钱了.
  }
  public void huaQian(int money) { //花钱的方法,小括号里面表示让你老婆自己来决定花多少
     System.out.println("密码输入正确,拿着花吧!!!");
     this.money = money; //this代表谁来花钱,然后重新赋值,将剩下的钱放回到保险箱
  }
}
现在告诉了你老婆钱放在那儿,也告诉了密码,你老婆就可以直接拿着钱去消费了
public static void main(String[] args) {
     HomeLaoPo = new Home(); // 你家老婆回来了
     System.out.println("找到了" + LaoPo.zaiZhe() + "万"); // 通过你告诉的位置和密码,你老婆拿到钱了
     LaoPo.huaQian(90);// 买了个迪奥的包,香奈儿的香水,一套纪梵希的衣服
     System.out.println("花钱就是开心,还剩" + LaoPo.zaiZhe() + "万");
  }
控制台输出结果:
找到了100万
密码输入正确,拿着花吧!!!
花钱就是开心,还剩90万

以上代码就是get set方法的由来 只是我把方法名字换了,结合生活,为什么要有这两个方法,get就相当于zaiZhe()这个方法,经过同意才能找到(public修饰的get方法,调用就等同于同意被访问),set就相当于huaQian()这个方法(public修饰的get方法,调用就等同于同意被访问赋值),
综合上面代码所述所以构建完整代码一定要有构造,要有封装,要有get,和set方法,我们来看看一个类的完整代码:
/**
* 人类 人类需要具备各种属性 那么我们创建的人类对象所有人都会有这么几个属性: 人种,肤色,性别 证明人类是每个人的模板
*
*/
public class Human {
  Stringrace; // 人种
  Stringcolor; // 肤色
  Stringsex; // 性别
  public Human() {
  }
  // 这个就是构造方法,在创建人的时候,就给他把颜色涂好了,其他的属性也都设置好了....
  public Human(String race, String color, String sex) {
     this.race = race;
     this.color = color;
     this.sex = sex;
  }
  public String getRace() {
     return race;
  }
  public void setRace(String race) {
     this.race = race;
  }
  public String getColor() {
     return color;
  }
  public void setColor(String color) {
     this.color = color;
  }
  public String getSex() {
     return sex;
  }
  public void setSex(String sex) {
     this.sex = sex;
  }
}
day07
1.    构造方法
什么是构造方法???
上面的代码逻辑跟生活不符合比如(看下面代码)
Human xiaoming = new Human();  //一个人(对象出生了)
这句话的意思是,天天滚出去的小明出生了
xiaoming.color = "黄";       //每个人(对象)具备相同的属性 属性内容不一样(属性值)
     xiaoming.sex = "男";
     xiaoming.race = "中国人";
这三句话是说,小明出生了,然后我们给他涂了个黄颜色,装了个xxx,在中国出生所以是中国人,这符合逻辑吗?
所以说,我们应该在小明出生之前,这些东西就应该确定了,伟大的Java早就想到了这点,给我们提供了一个叫做构造方法的语法,看如下代码:
public class Human {
  Stringrace;  //人种
  Stringcolor; //肤色
  Stringsex;   //性别
  //这个就是构造方法,在创建人的时候,就给他把颜色涂好了,其他的属性也都设置好了....
  public Human(String race, String color, String sex) {
     this.race = race;
     this.color = color;
     this.sex = sex;
  }
}
现在我们再按以前的方式,让小明出生,看还能不能行:
public static void main(String[] args) {
     Humanxiaoming = new Human();  //现在来创建一个小明,结果是不是不行了,提示我们要设置属性
  }
那好,我们现在来利用构造方法来创建三个人
/**
   * 创建了三个不同的人,每个人都是这些属性,所以类是对象的模板
   * 一个人(对象)出生了:在创建对象的时候调用构造方法
   * 为属性赋值:确定人种,涂上颜色,重要的是确定了性别
   */
  public static void main(String[] args) {
     Humanxiaoming = new Human("中国人","黄","男"); //调用构造方法创建小明
     Humanjack = new Human("欧洲人","白","男");   //又一个健康的人出生了
     Humansam = new Human("美国人","黑","男");    //又一个健康的人出生了
System.out.println("我是" + xiaoming.race + ",我的皮肤是" + xiaoming.color +",我的性别是" + xiaoming.sex);
     System.out.println("我是" + jack.race + ",我的皮肤是" + jack.color + ",我的性别是"
+jack.sex);
     System.out.println("我是" + sam.race + ",我的皮肤是" + sam.color + ",我的性别是" + sam.sex);
  }
2.    Static关键字
静态关键字:static
先说概念:静态就是被所有类共享的......概念说了还是一脸的蒙蔽
那么直接撸代码吧:往下看
public class ClassRoom {
  int water = 100;  //教室里的饮水机有100L的水
}
然后同学去接水
public static void main(String[] args) {
     ClassRoomstu1 = new ClassRoom(); //学生1
     stu1.water = 99; //学生接了一杯水,还剩99L
     ClassRoomstu2 = new ClassRoom(); //学生2
     //按理说,学生2去接水的时候,饮水机里只有99L水了吧
     System.out.println("还剩" + stu2.water + "升水");
  }
请看运行结果:
还剩100升水
????不科学啊?怎么还剩100升水呢,我们推理一下,真相永远只有一个!!!
那就是因为这两个学员(对象)用的根本不是一个饮水机(属性没有共享)!!
那么我们要做的就是把饮水机让每个学员用的是一样的(属性共享)
Java中为我们提供了这样一个神奇的关键字static,接着看代码:
public class ClassRoom {
  //饮水机里有100升水,直接用static修饰
  static int water = 100; // 教室里的饮水机有100L的水
}
在看看第二个同学接水后的结果:
还剩99升水
通过上述案例我们知道static的应用,属性需要被每个对象的所共同拥有的时候就要用static修饰.
3.    代码块
代码块:静态代码块:随着类加载,在类中,方法外
  局部代码块:方法内
  构造代码块:在类中方法外

上述三种代码块,不管怎么样他们都是代码块,所以我们首先搞懂什么是代码块!!
代码块:被大括号括起来的都是代码块,就这么简单!!
代码块做些什么事情?之前方法是不调用不执行,那么代码快呢?
静态代码块:随着类的加载就执行     语法:static {里面你想写的代码就可以了}
局部代码块:随着方法的调用而执行   语法:方法里面写个{里面你想写的代码就可以了}就O了
构造代码块:在创建对象的时候调用  语法:在类中方法外写个{里面你想写的代码就可以了}就可以了
上面这些个代码块的的区别:
位置的不同
静态代码块:随着类加载,在类中,方法外
局部代码块:方法内
构造代码块:在类中方法外
语法不同:这里就不写了都在上面的语法中。
执行顺序不同看下面代码就知道了:
这是以上的几个代码块的写法,还加了一个构造方法,更清晰的看到先后顺序
public class Test {
  public void show() {
     //我是局部代码块
     System.out.println("我是局部代码块");
  }
  {
     // 构造代码块
     System.out.println("我是构造代码块");
  }
  public Test() {
     // 构造方法
     System.out.println("我是构造方法");
  }
  static {
     // 静态代码块
     System.out.println("我是静态代码块");
  }
  public static void main(String[] args) {
     Testt = new Test();
     t.show();
  }
}
运行结果:
我是静态代码块
我是构造代码块
我是构造方法
我是局部代码块
4.    静态方法
特点:
静态的方法直接类名.调用
在静态方法中是没有this关键字的
静态方法只能访问静态的成员变量和静态的成员方法
之前普通方法都是通过对象调用的,那么为什么静态方法能直接类名调用呢?因为静态修饰的属性或者方法随着类的加载而加载,所以不需要有对象,类名就可以直接用。
看个例子:
public class Test {
  //将show方法定义为静态的
  static void show() {
     System.out.println("我是静态的");
  }
  public static void main(String[] args) {
     Test.show();
  }
}
运行结果:
我是静态的
我们一般专门写个的工具类,里面都是些常用方法用static,因为方便调用。

day08
1.    继承
子类继承父类大家都是这么说的,但是呢?这么说了之后还是懵圈啊~~并不理解啊
边看代码边解释吧:往下看
我们先创建个人类,get,set方法是有的 只是没有截图出来
public class Human {
  Stringrace; // 人种
  Stringcolor; // 肤色
  Stringsex; // 性别
  public Human() {
  }
  // 这个就是构造方法,在创建人的时候,就给他把颜色涂好了,其他的属性也都设置好了....
  public Human(String race, String color, String sex) {
     this.race = race;
     this.color = color;
     this.sex = sex;
  }
}
好那么,现在问题来了,人类是个大范围啊,世界上这么多国家,比如说中国人,美国人,英国人,等等...........................那么我们是不是要把这些各个国家的人分类呢?
好吧把这些类创建出来,
//中国人
class Chinese{
}
//美国人
class American{
}
//英国人
class English{
}
上面说到了,这些类,都具备什么特性呢?很明显,他们都是人!!!
那么这些各个国家的人类需要具备什么特性呢?不用说肯定是跟上面的最开始Human类具备相同的属性
此时的你们:“嗯明白!!(特么废话啊,都是人类肯定跟Human具备相同属性啊)”
好既然你们都知道要跟人类具备相同的属性,那么我们该怎么做呢?
难道是这样么???看下面的代码  (get,set,没写)
//中国人
class Chinese{
  private String race; // 人种
  private String color; // 肤色
  private String sex; // 性别
}
//美国人
class American{
  private String race; // 人种
  private String color; // 肤色
  private String sex; // 性别
}
//英国人
class English{
  private String race; // 人种
  private String color; // 肤色
  private String sex; // 性别
}
现在只有3个国家,我们这样直接复制就可以,那么我要是把所有的国家都写上呢?(还要把get,set加上)那么就算是复制也还是很累啊!!!
所以此时伟大的java就为我们提供了继承,extends不多说撸代码:
下面的都用类extends 关键字来继承Human 类
// 中国人用extends继承Human
class Chinese extends Human {
}
// 美国人用extends继承Human
class American extends Human {
}
// 英国人用extends继承Human
class English extends Human {
}
那么使用extends有什么用呢?就可以不用写那么多重复的属性了么??
看代码:
public static void main(String[] args) {
     Chinesec = new Chinese();
     c.setColor("黄");
     c.setRace("中国人");
     c.setSex("男");
     System.out.println("我的肤色是" + c.getColor() + ",我的种族是" + c.getRace()
         +",我的性别是" + c.getSex());
     Americana = new American();
     a.setColor("黑");
     a.setRace("美国人");
     a.setSex("女");
     System.out.println("我的肤色是" + a.getColor() + ",我的种族是" + a.getRace()
         +",我的性别是" + a.getSex());
     Englishe = new English();
     e.setColor("白");
     e.setRace("英国人");
     e.setSex("男");
     System.out.println("我的肤色是" + e.getColor() + ",我的种族是" + e.getRace()
         + ",我的性别是" + e.getSex());
  }
是不是很神奇,上面的三个类里面明明什么都没写,但是却神奇的可以用Human类的,get,set方法,这里有个概念就引伸出来
子类继承父类,可以直接调用父类的公有的方法,和公有的属性。
其实继承不单纯的是子类继承父类其实是一个大类,分多个子类,这些个子类都具备该大类的公有的属性和方法。
为什么强调是公有呢?看代码!!
private Stringrace; // 人种
  private Stringcolor; // 肤色
  private String sex; // 性别
以上这些属性是私有的吧,我们子类直接用用试试
怎么用?肯定是new 子类对象啊然后调用属性啊
public static void main(String[] args) {
     Chinesec = new Chinese();
     c.race = "中国人";
  }
看运行结果:
The field Human.race is not visible
直接报错......
所以说就算你爹有100万 ,他不愿意给你还是白搭
爸爸类:私有的方法(意思是不给儿子~~~)
public class Father {
  private void money(){
     System.out.println("爸爸有100万");
  }
}
很明显Son类继承了Father类(是上面的儿子)
class Son extends Father{
}
然后.............
public static void main(String[] args) {
     Sons = new Son(); //儿子来了
     s.money();  //儿子要用钱,结果发现用不了
  }
运行报错:
The method money() from the typeFather is not visible
就是这个意思,就算你爹有他也不愿意给你用啊,为啥因为是他私有的,
另外,子类可以有爹,有爷爷,这就是类的多层继承.
2.   多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态.编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话.
举个例子:你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
上代码:
//员工类
public class Employee {
  static {
     System.out.println("老板来了");
  }
  public void work() { // 员工的工作方法,看到老板来了,就要开始工作
     System.out.println("老板来了,让我们开始工作了");
  }
}
//销售员工继承员工类,销售的工作是卖车
class xiaoShou extends Employee {
  public void work() {
     System.out.println("销售今天卖了10辆车");
  }
}
//程序猿继承员工类,程序猿会撸代码
class chengXuYuan extends Employee {
  public void work() {
     System.out.println("程序猿一边撸代码,一边掉头发,还要当备胎");
  }
}
现在我们来测试一下:
public static void main(String[] args) {
     Employeexs = new xiaoShou();
     xs.work();
     Employeeyuan = new chengXuYuan();
     yuan.work();
  }
运行结果:
老板来了
销售今天卖了10辆车
程序猿一边撸代码,一边掉头发,还要当备胎
从这段代码可以清晰的看到,虽然都是员工(父类),但是实际创建的对象不同(销售和程序员),这就是父类引用指向子类对象,由于子类重写了父类的work方法,所以销售和程序员干的活儿不一样,类似的我还可以举一个例子:大哥叫小弟去收保护费,小弟A过去直接拿着搬砖棒子给人一顿打,进了医院,乖乖的交了保护费,小弟B叫了200收下,在大厅一坐,对方也吓傻了,请他的小弟吃了大排档,也交了保护费,小弟C一个人去,跟对方头头喝茶聊天唠嗑扯皮,对方被逼疯了,也交了保护费...得到同样的命令,三个人有各自的解决办法,这就是多态:复用相同接口,实现不同操作.
看代码:
//古惑仔接口
interface GuHuoZai {
  public abstract void shouBoHuFei();
}
//山鸡实现了古惑仔接口(当了古惑仔),重写收保护费方法
class ShanJi implements GuHuoZai{
  @Override
  public void shouBoHuFei() {
     System.out.println("山鸡叫了200人,吓得对方请吃饭,加大保健,收到了保护费");
  }
}
//陈浩南实现古惑仔接口(当了古惑仔),重写收保护费方法
class ChenHaoNan implements GuHuoZai{
  @Override
  public void shouBoHuFei() {
     System.out.println("陈浩南一个人去跟对面老大喝茶,因为陈浩南的人格魅力,收到了保护费");
  }
}
//大天二实现古惑仔接口(当了古惑仔),重写收保护费方法
class DaTianEr implements GuHuoZai{
  @Override
  public void shouBoHuFei() {
     System.out.println("大天二拿着搬砖和棒子,把对面打的头破血流,收到了保护费");
  }
}
测试一下:
public static void main(String[] args) {
System.out.println("大哥蒋天生缺钱,要收保护费!");
     ChenHaoNanc = new ChenHaoNan(); //陈浩南出现了
     c.shouBoHuFei(); //陈浩南收保护费
     ShanJis = new ShanJi();  //山鸡出现了
     s.shouBoHuFei(); //山鸡收保护费  
     DaTianErd = new DaTianEr(); //大天二出现了
     d.shouBoHuFei(); //大天二收保护费
  }
运行结果:
大哥蒋天生缺钱,要收保护费!
陈浩南一个人去跟对面老大喝茶,因为陈浩南的人格魅力,收到了保护费
山鸡叫了200人,吓得对方请吃饭,加大保健,收到了保护费
大天二拿着搬砖和棒子,把对面打的头破血流,收到了保护费
以上就是多态的体现,另外要记住,多态的还有一个好处是,作为形式参数时,可以接受一切子类对象.
public static void main(String[] args) {
     jiHe(new ChenHaoNan("陈浩南"));
     jiHe(new DaTianEr("大天二"));
  }
  // 古惑仔要打架,打电话叫人
  public static void jiHe(GuHuoZai g) {
     System.out.println(g.getName() + ",马不停蹄的赶到!!!");
  }
运行结果:
陈浩南,马不停蹄的赶到!!!
大天二,马不停蹄的赶到!!!
3.   多态&&抽象类
实现需求:一个公共厕所(容器,可以是数组或集合),5男五女,同时撒尿(打印:站着尿or蹲着尿).
参考
public abstractclass Human
{
  ...
  public abstract void goPee();
}
定义一个被称为"人类"的抽象基类."去撒尿"这个方法是抽象的,因为对于整个人类来说没有一个统一的撒尿方法.只有当你具体地讨论这个人是男人还是女人的时候,"撒尿"这个方法才有具体的含义.与此同时,"人类"也是一个抽象的概念-不可能有一个既不是男人也不是女人的"人类"存在.当我们讨论一个人的时候,TA要么是个男人,要么是个女人.
public class Maleextends Human
{
...
    @Override
    public void goPee()
    {
        System.out.println("StandUp");
    }
}
public classFemale extends Human
{
...
    @Override
    public void goPee()
    {
        System.out.println("SitDown");
    }
}
现在我们有了更具体的关于男人和女人的类定义.他们都是人类的继承类,但是他们有不同的撒尿方法.
多态最完美的展现在于当我们试图让一屋子的人都去撒尿的时候:
public staticvoid main(String args)
{
    ArrayList<Human> group = newArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    //... add more...
    // tell the class to take a pee break
   for (Human person : group) person.goPee();
}
得到的结果是:
Stand Up
Sit Down
..

12 个回复

正序浏览
很有用,值得学习,感谢楼主分享
回复 使用道具 举报
写的真是太好了,通俗易懂。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
很有趣,真是通俗易懂。
回复 使用道具 举报
学习 唯有学习才能使我快乐
回复 使用道具 举报
后排膜拜
回复 使用道具 举报
紫薯布丁。。。。
回复 使用道具 举报
围观一下楼主的学习笔记
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
赞赞赞赞赞赞攒攒
回复 使用道具 举报
66666666666666666666
回复 使用道具 举报
66666666666666666666
回复 使用道具 举报
沙发?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马