Java 复习整理day05

 1 package com.it.demo01_oop;
 2 
 3 import java.util.Arrays;
 4 
 5 /*
 6     案例: 演示面向过程和面向对象代码的区别
 7 
 8     面向过程编程思想详解:
 9         面向过程思想其实就是一种编程思想. 所谓的面向过程开发, 指的就是面向着具体的每一个步骤和过程, 把每一个步骤和过程完成,
10         然后由这些功能方法相互调用, 完成需求.
11 
12         记忆: 面向过程的代表语言是: C语言.
13 
14     面向对象编程思想详解:
15         //推荐答题思路: 概述, 思想特点, 举例, 总结.
16 
17        首先, 面向对象是一种编程思想, 它是基于面向过程的, 强调的是以 对象 为基础, 完成各种操作.
18        说道面向对象不得不提的就是它的3大思想特点:
19         1. 把复杂的事情简单化.
20         2. 更符合人们的思考习惯.
21         3. 把程序员从执行者变成指挥者.
22        举个例子吧, 买电脑, 洗衣服 (例子越契合当时的场景, 案例价值越高)
23        总结: 万物接对象.
24 
25     程序开发:
26         就是在不断的创建对象, 使用对象, 指挥对象做事情.
27 
28     程序设计:
29         就是在维护 对象 和 对象之间的关系.
30  */
31 public class Demo01 {
32     public static void main(String[] args) {
33         //需求: 把数组元素按照[1, 2, 3, 4, 5]的格式进行输出.
34 
35         //1. 定义数组, 记录元素.
36         int[] arr = {1, 2, 3, 4, 5};
37 
38         //2. 按照格式进行输出.
39         //方式一: 面向过程编程思想, 即: 每个动作都亲力亲为.
40         System.out.print("[");
41         for (int i = 0; i < arr.length; i++) {
42             if (i == arr.length - 1)
43                 System.out.println(arr[i] + "]");
44             else
45                 System.out.print(arr[i] + ", ");
46         }
47         System.out.println("----------------------");
48 
49 
50         //方式二: 面向对象编程思想, 即: 我们只要找对 对象即可, 把事儿交给他/她/它做.
51         System.out.println(Arrays.toString(arr));
52 
53     }
54 }

 

 1 package com.it.demo01_oop;
 2 
 3 import java.util.Scanner;
 4 
 5 /*
 6     案例: 演示学生类的定义和使用.
 7 
 8     铺垫知识:
 9         1. Java语言是用来描述现实世界事物, 最基本的单位是: 类.
10         2. 类就是 属性和行为 的集合, 是一个抽象的概念, 看不见, 也摸不着.
11             属性:
12                 指的就是事物的外在特征(名词), 在Java中叫: 成员变量, 字段.
13 
14                 成员变量:
15                     和以前定义变量的格式一样, 只不过写在类中方法外, 且成员变量有默认值.
16 
17             行为:
18                 指的就是事物能够做什么(动词),  在Java中叫: 成员方法
19 
20                 成员方法:
21                     和以前定义方法格式一样, 只不过先不要写 static
22         3. 对象是类的具体体现, 实现, 能看的见, 也能摸得着.
23         4. 类的定义格式:
24             public class 类名 {
25                 //属性
26 
27                 //行为
28             }
29         5. 类的调用格式, 即: 如何使用类中的成员
30             步骤1: 创建该类的对象.
31                 类名 对象名 = new 类名();
32             步骤2: 通过 对象名. 的形式调用类中的成员.
33                 对象名.成员变量                //获取该成员变量的值.
34                 对象名.成员变量 = 值           //获取指定成员变量的值.
35                 对象名.成员方法()              //调用指定的成员方法
36 
37  */
38 public class Demo02 {
39     public static void main(String[] args) {
40         //需求: 调用Student类中的成员.
41         //1. 创建学生类的对象.
42         Student s = new Student();
43 
44         //2. 打印属性值.
45         System.out.println(s.name);     //null
46         System.out.println(s.age);      //0
47         System.out.println("---------------------");
48 
49         //3. 设置属性值.
50         s.name = "刘亦菲";
51         s.age = 33;
52 
53         //4. 打印属性值.
54         System.out.println(s.name);         //刘亦菲
55         System.out.println(s.age);          //33
56 
57         //5. 调用成员方法.
58         s.study();
59     }
60 }
package cn.it.demo01;
/*
 *  类的方式,描述现实中的事物 小汽车
 *  
 *    小汽车  属性和功能
 *      属性: 颜色  轮胎个数    变量定义
 *      功能: 跑  方法
 *      
 *    属性和方法,都属于类的成员
 *    
 *    属性, 成员变量
 *    方法, 成员方法
 */
public class Car {
  //定义Car类的属性
    
    //定义颜色属性
    String color ;
    //定义轮胎个数
    
    int count ;
    
    //定义跑的功能
    public void run(){
        System.out.println("小汽车在跑 ..."+color+"..."+count);
    }
    
}


package cn.it.demo01;
/*
 *   测试,自定义的类Car
 *   创建出Car类的变量
 *   变量,调用属性,成员变量
 *   变量,调用方法
 */
public class CarTest {

    public static void main(String[] args) {
        //创建出Car类的变量 , 创建出Car类的对象,小汽车真的有了
        Car c = new Car();
        //对象.调用类中的属性和方法
        c.color = "无色";
        c.count = 5 ;
        
        c.run();
    }

}

 

  1 package com.it.demo02_phone;
  2 
  3 //自定义的手机类.
  4 public class Phone {
  5     //属性: 品牌(brand), 价格(price), 颜色(color)
  6     String brand;           //品牌
  7     int price;              //价格
  8     String color;           //颜色
  9 
 10     // 行为: 打电话(call), 发短信(sendMessage)
 11     public void call(String name) {
 12         System.out.println("给" + name + "打电话!");
 13     }
 14 
 15     //发短信(sendMessage)
 16     public void sendMessage(String name) {
 17         System.out.println("给" + name + "发短信!");
 18     }
 19 
 20 }
 21 
 22 package com.it.demo02_phone;
 23 
 24 /*
 25     案例: 演示手机类的定义和使用.
 26 
 27     需求:
 28         1.定义手机类Phone.
 29          属性: 品牌(brand), 价格(price), 颜色(color)
 30          行为: 打电话(call), 发短信(sendMessage)
 31         2.创建测试类PhoneTest, 在类中定义main方法, 并访问手机类(Phone类)中的成员.
 32 
 33     PhoneTest: 手机类的测试类.3
 34 
 35     Phone:     具体的手机类.
 36  */
 37 public class PhoneDemo {
 38     public static void main(String[] args) {
 39         //需求: 访问Phone类中的成员.
 40         //1. 创建Phone类的对象.
 41         Phone p = new Phone();
 42         //2. 打印属性值.
 43         System.out.println(p.brand);
 44         System.out.println(p.price);
 45         System.out.println(p.color);
 46         System.out.println("---------------------------");
 47 
 48         //3. 设置属性值.
 49         p.brand = "华为P30";
 50         p.price = 5999;
 51         p.color = "土豪金";
 52 
 53         //4. 打印属性值.
 54         System.out.println(p.brand);
 55         System.out.println(p.price);
 56         System.out.println(p.color);
 57 
 58         //5. 调用成员方法.
 59         p.call("红红");
 60         p.sendMessage("红红");
 61     }
 62 }
 63 
 64 
 65 package com.it.demo02_phone;
 66 
 67 //案例: 两个对象的内存图
 68 public class PhoneDemo02 {
 69     public static void main(String[] args) {
 70         //1. 创建手机类的对象.
 71         Phone p = new Phone();
 72         //2. 设置成员变量值.
 73         p.brand = "华为";
 74         p.price = 6666;
 75         p.color = "黑色";
 76         //3. 打印成员变量.
 77         System.out.println(p.brand + "--" + p.price + "--" + p.color);
 78         //4. 调用成员方法.
 79         p.call("李四");
 80         p.sendMessage("李四");
 81 
 82         Phone p2 = new Phone();
 83         p2.brand = "小米";
 84         p2.price = 3333;
 85         p2.color = "白色";
 86         System.out.println(p2.brand + "--" + p2.price + "--" + p2.color);
 87         p2.call("张三");
 88         p2.sendMessage("张三");
 89     }
 90 }
 91 
 92 package com.it.demo02_phone;
 93 
 94 //案例: 演示两个对象指向同一个地址的内存图.
 95 public class PhoneDemo03 {
 96     public static void main(String[] args) {
 97         //1. 创建手机类的对象.
 98         Phone p = new Phone();
 99         //2. 设置成员变量值.
100         p.brand = "华为";
101         p.price = 6666;
102         p.color = "黑色";
103         //3. 打印成员变量.
104         System.out.println(p.brand + "--" + p.price + "--" + p.color);      //华为, 6666, 黑色
105         //4. 调用成员方法.
106         p.call("李四");             
107         p.sendMessage("李四");      
108 
109         Phone p2 = p;
110         p2.brand = "小米";
111         p2.price = 3333;
112         p2.color = "白色";
113         System.out.println(p.brand + "--" + p.price + "--" + p.color);          //小米, 3333, 白色
114         System.out.println(p2.brand + "--" + p2.price + "--" + p2.color);       //小米, 3333, 白色
115         p2.call("张三");           
116         p2.sendMessage("张三");    
117     }
118 }

Java 复习整理day05

 

 

 

 

 

Java 复习整理day05

 

 

 

 

 1 package com.it.demo03_variable;
 2 
 3 /*
 4     案例: 演示成员变量和局部变量的区别.
 5 
 6     它们的区别有以下4点:
 7         1. 定义位置不同.
 8             成员变量:   定义在类中, 方法外的变量.
 9             局部变量:   定义在方法中, 或者方法形参上的变量.
10         2. 在内存中存储位置不同.
11             成员变量:   存储在堆内存.
12             局部变量:   存储在栈内存.
13         3. 生命周期不同.
14             成员变量:   随着对象的创建而存在, 随着对象的消失而消失.
15             局部变量:   随着方法的调用而存在, 随着方法的调用完毕而消失.
16         4. 初始化值不同.
17             成员变量:   有默认值.
18             局部变量:   没有默认值, 必须先声明, 后赋值, 然后才能使用.
19  */
20 public class Demo01 {
21     public static void main(String[] args) {
22         //需求: 调用Student#show(), 等价于:  调用Student类中的show()方法
23         //1. 创建Student类的对象.
24         Student s = new Student();
25         //2. 调用指定的成员方法
26         s.show();
27     }
28 }
29 
30 
31 package com.it.demo03_variable;
32 
33 //自定义的学生类
34 public class Student {
35     //成员变量, 属性
36     int a = 20;
37 
38     //成员方法, 行为
39     public void show() {
40         //局部变量
41         int b = 10;
42 
43         System.out.println(a);  //20
44         System.out.println(b);  //10
45     }
46 }
 1 package cn.it.demo02;
 2 
 3 public class Car {
 4     String color;
 5     int count ;
 6     public void run(){
 7         
 8         int x=1;
 9         /*for(int i = 0 ;  i < 4 ;i++){
10             
11         }*/
12         System.out.println("小汽车在跑 ..."+color+"..."+count);
13         System.out.println(x);
14     }
15 }
16 
17 
18 
19 package cn.it.demo02;
20 /*
21  *  成员变量和局部变量的区别
22  *  
23  *  1. 定义位置上的区别
24  *    成员变量,定义在类中,方法外
25  *    局部变量,方法内,语句内
26  *    
27  *  2. 作用域不同
28  *    成员变量,作用范围是整个类
29  *    局部变量,方法内,语句内
30  *    
31  *  3. 默认值不同
32  *     成员变量,有自己的默认值
33  *     局部变量,没有默认值,不赋值不能使用
34  *     
35  *  4. 内存位置不同
36  *     成员变量,跟随对象进入堆内存存储
37  *     局部变量,跟随自己的方法,进入栈内存
38  *     
39  *  5. 生命周期不同
40  *     成员变量,跟随对象,在堆中存储,内存等待JVM清理 , 生命相对较长
41  *     局部变量,跟随方法,方法出栈    生命相对较短
42  */
43 public class CarTest {
44     public static void main(String[] args) {
45         Car c = new Car();
46         c.run();
47     }
48 }
 1 package cn.it.demo03;
 2 
 3 public class Person {
 4    String name ;
 5 }
 6 
 7 package cn.it.demo03;
 8 /*
 9  *  方法的参数类型,是基本数据类型,引用数据类型
10  */
11 public class TestPerson {
12     public static void main(String[] args) {
13         int a = 1;
14         function(a);
15         System.out.println(a);
16         
17         Person p = new Person();
18         p.name = "张三";
19         System.out.println(p.name);
20         
21         function(p);
22         
23         System.out.println(p.name);
24     }
25     /*
26      * 定义方法,参数类型是引用数据类型
27      * 参数是Person类型
28      * p接受的是一个内存的地址
29      * main 中的变量p
30      * function  中的变量p  保存的地址是一样的
31      */
32     public static void function(Person p){
33         p.name = "李四";
34     }
35     
36     /*
37      * 定义方法,参数类型是基本数据类型
38      */
39     public static void function(int a){
40         a+=5;
41     }
42 }
 1 package com.it.demo04_private;
 2 
 3 //自定义学生类
 4 public class Student {
 5     //属性
 6     String name;
 7     private int age;
 8 
 9     //对外提供一个公共的访问方式, 来操作age变量.
10     //提供方法, 设置age的值.
11     public void setAge(int a) {
12         if (a >= 0 && a <= 250) {
13             //走到这里, 说明年龄合法.
14             age = a;
15         }
16     }
17 }package com.it.demo04_private;
18 
19 /*
20     案例: 演示private关键字的用法.
21 
22     private简介:
23         为什么要学习private?
24             因为目前我们代码中的成员变量, 外界是可以直接访问的, 这样的话, 用户就有可能给录入一些非法值,
25             造成安全隐患, 所以我们要对 成员变量进行一层封装, 不让外界直接访问了.
26             //大白话理解: 银行的钱用户是无法直接访问的, 要通过柜台小姐姐或者ATM自动存取款机来操作.
27         概述:
28             它是一个关键字, 表示"私有"的意思, 也是访问权限修饰符的一种,
29             被它修饰的内容, 只能在本类中直接使用.
30 
31         应用场景:
32             1.在实际开发中, 成员变量基本上都是用private关键字来修饰的.
33             2.如果明确知道类中的某些内容不想被外界直接访问, 都可以通过private来修饰.
34 
35        细节:
36             因为被private修饰的内容, 只能在本类中直接访问, 外界如果想使用这些私有成员, 需要通过特定方式.
37             即: 我们可以在类中定义两个方法, 一个是setXxx(), 用来设置属性值, 一个getXxx(), 用来获取属性值.
38 
39  */
40 public class StudentTest {
41     public static void main(String[] args) {
42         //1. 创建对象.
43         Student s = new Student();
44         //2. 给属性赋值.
45         s.name = "刘亦菲";
46         //s.age = -33;      //私有成员外界无法直接访问.
47         s.setAge(33);
48         //3. 打印属性值.
49         System.out.println(s.name + "..." + s.getAge());
50         //4. 调用成员方法.
51         s.study();
52     }
53 }
package cn.it.demo04;
/*
 *  描述现实生活中的人的事物
 *    属性:  姓名 年龄
 *    功能:  说话
 *    
 *  出现安全问题: age问题,可能出现赋值为负数的情况
 *  负数不会导致程序问题,违反生活中的真实情况
 *  
 *  提高安全问题: 让外面的类,不允许直接调用我的成员变量
 *  新的关键字  private 私有   属于成员修饰符,不能修饰局部变量
 *  被private修饰的成员,只能在自己的本类中被使用
 *  
 *  对私有变量,提供公共的访问方式: 方法
 */
public class Person {
     //人的姓名,成员变量
    String name;
    //人的年龄,成员变量
    private int age ;
    
    //变量age被私有,提供方法,让外面的类使用
    //定义方法,对age变量进行赋值,方法名字,必须set开头
    public void setAge(int a){
        //对变量参数a进行范围的限制
        if(a<0 || a > 200){
            //如果a超过范围,手动将age赋值为20
            age = 20;
        }else{
        //如果a没有超过范围,直接对age赋值
        age = a;
        }
    }
    
    //定义方法,对变量age获取值使用,方法名字get
    public int getAge(){
        return age;
    }
    
    
    //定义人的说话功能,方法中,要求说出自己的姓名和年龄
    public void speak(){
        System.out.println(name+"..."+age);
    }
}
package cn.it.demo04;
/*
 *   定义好的Person类进行测试
 *   创建对象,对象调用属性和方法
 */
public class PersonTest {

    public static void main(String[] args) {
        //创建Person类的对象  new
        Person p = new Person();
        //对成员变量赋值
        //p.age = -200;
        //对成员变量age赋值,只能调用Set方法赋值
        p.setAge(50);
        
        p.name = "张三";
        //调用类中方法
        p.speak();
        
        //输出成员变量age值,必须调用get方法
        System.out.println(p.getAge());
    }

}
 1 package com.it.demo05_student;
 2 
 3 //自定义的学生类, 像这种用来描述实体的类也叫: 实体类, 或者JavaBean类, POJO类.
 4 public class Student {
 5     //属性: 姓名和年龄
 6     private String name;        //姓名
 7     private int age;            //年龄
 8 
 9     //对外提供getXxx()和setXxx(), 让用户来操作name和age属性.
10     //获取姓名
11     public String getName() {
12         return name;
13     }
14     //设置姓名
15     public void setName(String n) {
16         //这里可以判断n(传入的姓名)是否合法, 但是我们不做
17         name = n;
18     }
19 
20     //获取年龄
21     public int getAge(){
22         return age;
23     }
24 
25     //设置年龄
26     public void setAge(int a) {
27         //这里可以判断a(传入的年龄)是否合法, 但是我们不做
28         age = a;
29     }
30 
31     //行为: 学习, 吃饭.
32     public void study() {
33         System.out.println("键盘敲烂, 月薪过万!");
34     }
35 
36     public void eat() {
37         System.out.println("学生吃牛肉!");
38     }
39 }
40 
41 package com.it.demo05_student;
42 
43 /*
44     案例: 演示加入private关键字后的 "标准代码".
45 
46     需求:
47         1.定义一个标准的学生类Student, 属性: 姓名和年龄, 行为: 学习, 吃饭.
48         2.在测试类中创建学生类的对象, 然后访问类中的成员.
49 
50     StudentDemo类: 测试类.
51  */
52 public class StudentDemo {
53     public static void main(String[] args) {
54         //1. 创建对象.
55         Student s = new Student();
56         //2. 设置属性值.
57         //s.name = "刘亦菲";     //private修饰的内容, 外界无法直接访问.
58         s.setName("刘亦菲");
59         /*
60             这里的-33是我们自己手动传入的, 实际开发中, 没有这种情况, 因为数据从前端传过来的,
61             当数据从前端传过来的时候, 已经经过了校验, 换言之, 我们在后台获取到的数据已经是合法的了,
62             如果再做校验属于二次校验, 可以做, 也可以不做, 一般不做, 具体看需求.
63          */
64         //s.setAge(-33);
65         s.setAge(33);
66         //3. 打印属性值.
67         System.out.println(s.getName() + "..." + s.getAge());
68         //4. 调用成员方法.
69         s.study();
70         s.eat();
71     }
72 }
package com.it.demo06_this;

//自定义的学生类, 像这种用来描述实体的类也叫: 实体类, 或者JavaBean类, POJO类.
public class Student {
    //属性: 姓名和年龄
    private String name;        //姓名
    private int age;            //年龄

    //对外提供getXxx()和setXxx(), 让用户来操作name和age属性.
    //获取姓名
    public String getName() {
        return name;
    }

    //设置姓名
    public void setName(String name) {
        this.name = name;
    }

    //获取年龄
    public int getAge(){
        return age;
    }

    //设置年龄
    public void setAge(int age) {
        this.age = age;
    }

    //行为: 学习, 吃饭.
    public void study() {
        System.out.println("键盘敲烂, 月薪过万!");
    }

    public void eat() {
        System.out.println("学生吃牛肉!");
    }
}
package com.it.demo06_this;

/*
    案例: 演示this关键字.

    封装简介:
        概述:
            封装就是隐藏对象的属性和实现细节, 仅对外提供一个公共的访问方式.
            怎么隐藏?
                可以通过private关键字实现.
            公共的访问方式是什么?
                getXxx(), setXxx()
        原则:
            1. 把不需要对外暴漏的内容都封装起来.
            2. 把成员变量全部私有化(封装起来).
            //大白话翻译: 成员变量私有化(private修饰), 其他用public修饰.

        好处:
            1. 提高了代码的安全性.        由private保证.
            2. 提高了代码的复用性.        由方法保证.

    this关键字简介
        概述:
            它是一个关键字, 代表本类当前对象的引用.
            //大白话: 谁调用, this就代表谁.
        作用:
            用来解决局部变量和成员变量重名问题的.

        补充: 使用变量的原则
            使用变量遵循就近原则, 如果局部位置有, 就使用, 没有就去本类的成员位置找, 有就是使用.
            没有就报错.      //先这么记忆, 不严谨, 因为本类找不到, 还回去父类找.
 */
public class StudentDemo {
    public static void main(String[] args) {
        //需求1: 调用Teacher#show(), 演示使用变量的原则.
        //method01();

        //需求2: 加入this后的, 标准的Student类的代码编写和调用.
        //1. 创建对象.
        Student s = new Student();
        //2. 设置属性值.
        //s.name = "刘亦菲";     //private修饰的内容, 外界无法直接访问.
        s.setName("刘亦菲");
        s.setAge(33);
        //3. 打印属性值.
        System.out.println(s.getName() + "..." + s.getAge());
        //4. 调用成员方法.
        s.study();
        s.eat();

    }

    public static void method01() {
        Teacher t = new Teacher();
        t.a = 100;
        t.show();
    }
}
 1 package cn.it.demo05;
 2 
 3 /*
 4  *   类描述人:
 5  *     属性: 姓名和年龄
 6  *     方法: 说话
 7  *   
 8  *   私有化所有的属性 (成员变量) ,必须写对应的get/set方法
 9  *   凡是自定义的类,自定义成员变量,应该私有化,提供get/set
10  *   
11  *   this关键字:
12  *     区分成员变量和局部变量同名情况
13  *     方法中,方位成员变量,写this.
14  */
15 public class Person {
16     private String name;
17     private int age;
18 
19     // set方法,变量name,age赋值
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     // get方法,变量name,age获取值
29     public int getAge() {
30         return age;
31     }
32 
33     public String getName() {
34         return name;
35     }
36 
37     public void speak() {
38         String  name = "哈哈";
39         int age = 16;
40         
41         System.out.println("人在说话  " + this.name + "..." + this.age);
42     }
43 }
44 
45 
46 package cn.it.demo05;
47 
48 public class PersonTest {
49     public static void main(String[] args) {
50         Person p = new Person();
51         //调用set方法,对成员变量赋值
52         p.setAge(18);
53         p.setName("旺财");
54         p.speak();
55         
56         
57         //调用get方法,获取成员变量的值
58 //        System.out.println(p.getName());
59 //        System.out.println(p.getAge());
60     }
61 }
package cn.it.demo06;

public class Person {
    private int age;
    
    public void setAge(int age){
        this.age = age;
    }
    
    public int getAge(){
        return age;
    }
    
    /*
     * 定义方法: 比较是否是同龄人,是就返回true,不是就返回false
     * 谁和谁比呀,我自己和别人比 
     * 方法的返回值: true false
     * 方法参数: 别人
     */
    public boolean compare(Person p){
        //自己和别人比年龄,自己是谁 this和p
        return this.age == p.age;
    }
}

package cn.it.demo06;

public class PersonTest {
    public static void main(String[] args) {
        //测试Person类中的年龄比较功能
        //创建出2个Person对象
        Person p1 = new Person();
        Person p2 = new Person();
        
        p1.setAge(15);
        p2.setAge(16);
        
        //p1对象调用自己的方法compare传递p2对象
        boolean b = p1.compare(p2);
        System.out.println(b);
    }
}
 1 package com.it.demo07_constructor;
 2 
 3 //自定义的学生类
 4 public class Student {
 5     //属性
 6     private String name;
 7     private int age;
 8 
 9     //系统默认加的空参.
10     public Student() {
11         System.out.println("我是空参构造方法");
12     }
13 
14     //自己给的全参
15     public Student(String name, int age) {
16         System.out.println("我是全参构造方法");
17         this.name = name;
18         this.age = age;
19     }
20 }
21 
22 package com.it.demo07_constructor;
23 
24 /*
25     案例: 演示构造方法入门.
26 
27     构造方法详解:
28         概述:
29                               主职                          兼职
30             构造方法就是用来快速创建对象的, 捎带着可以给对象的各个属性赋值.
31         注意事项:
32             1. 构造方法名和类名完全一致(包括大小写)
33             2. 构造方法没有返回值的数据类型, 连void都不能写.
34             3. 构造方法没有具体的返回值, 但是可以写return.
35                 //return的作用是: 用来结束方法的, 捎带着可以返回具体的值.
36             4. 构造方法可以重载.
37             5. 每个类系统都会默认加一个: 空参构造, 如果你写了构造方法(不管是否是空参), 系统就不给了.
38             6. 推荐做法: 无论是否使用, 类中都要提供两个构造, 即: 空参构造, 全参构造.
39         格式:
40             public 类名(数据类型 参数名1, 数据类型 参数名2) {
41                 //这里可以给该类中对应的成员变量赋值.
42             }
43 
44     创建对象的格式:
45         类名 对象名 = new 构造方法名(值1, 值2, 值3);
46  */
47 public class StudentDemo {
48     public static void main(String[] args) {
49         //创建Student类的对象
50         Student s = new Student();
51         //s.setName("刘亦菲");
52         //s.setAge(33);
53         System.out.println("----------------------");
54 
55         Student s2 = new Student("刘亦菲", 33);
56     }
57 }

 

 

 1 package com.it.demo02_quickstart;
 2 
 3 //自定义的人类, 表示父类.
 4 public class Person {
 5     //属性
 6     private String name;    //姓名
 7     private int age;        //年龄
 8 
 9     //构造方法
10     public Person() {
11     }
12 
13     public Person(String name, int age) {
14         this.name = name;
15         this.age = age;
16     }
17 
18     //getXxx(), setXxx()
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public int getAge() {
28         return age;
29     }
30 
31     public void setAge(int age) {
32         this.age = age;
33     }
34 
35     //行为
36     public void eat() {
37         System.out.println("人要吃饭!");
38     }
39 
40     public void sleep() {
41         System.out.println("人要睡觉!");
42     }
43 
44     public void smoking() {
45         System.out.println("人要抽烟!");
46     }
47 }
48 
49 
50 package com.it.demo02_quickstart;
51 
52 //自定义的学生类, 继承人类.
53 public class Student extends Person{
54     //行为: 学习
55     public void study() {
56         System.out.println("学生要学习!");
57     }
58 }
59 
60 
61 package com.it.demo02_quickstart;
62 
63 //自定义的老师类, 继承人类.
64 public class Teacher extends  Person{
65     //构造方法, 子类的空参访问父类的空参, 子类的全参访问父类的全参.
66 
67     //行为: 教课
68     public void teach() {
69         System.out.println("老师要教课!");
70     }
71 }
package com.it.demo03_father;

//自定义的爷爷类
public class GrandFather {
    public void grandFatherSay() {
        System.out.println("爷爷都是从孙子过来的");
    }
}



package com.it.demo03_father;

//自定义的爸爸类
public class Father extends GrandFather{
    public void fatherSay() {
        System.out.println("爸爸都是从儿子过来的!");
    }
}


package com.it.demo03_father;

//自定义的儿子类.

//public class Son extends Father, GrandFather{   //报错:  Java中类与类之间只能单继承, 不能多继承.
public class Son extends Father{
}

package com.it.demo03_father;

/*
    案例: 演示Java中类与类之间的继承特点.

    需求:
        1.定义GrandFather类, 该类有一个grandFatherSay()方法, 该方法打印一句话爷爷都是从孙子过来的.
        2.定义Father类, 该类有一个fatherSay()方法, 该方法打印一句话爸爸都是从儿子过来的.
        3.定义Son类, 分别先继承自GrandFather类和Father类, 此时发现, 上述的两个方法只能同时调用一个.
        4.如果想让Son类的对象, 同时能调用上述的两个方法, 则可以这样做:
         Son类继承自Father类, Father类继承自GrandFather类.

    结论(记忆):   Java中类与类之间的继承关系特点如下:
        1. Java中类与类之间只能单继承, 不能多继承.          //大白话翻译: 一个人只能有一个亲爹.
        2. Java中支持多层继承.                              //大白话翻译: 一个人可以有一个亲爹, 还可以有一个亲爷爷.
        3. 所有的类都直接或者间接继承自Object类, 换言之, Object类是所有类的父类.

    快捷键:
        查看继承关系树:  ctrl + 字母H
 */
public class Demo01 {
    public static void main(String[] args) {
        Son s = new Son();
        s.fatherSay();      //从Father类继承的.
        s.grandFatherSay(); //从GrandFather类继承的.
    }
}
package cn.it.demo01;
/*
 * 定义员工类
 *   属性和方法
 *     属性成员变量, 姓名
 *     成员方法, 工作
 */
public class Employee {
     String name;
     
     public void work(){
         System.out.println("员工在工作");
     }
}



package cn.it.demo01;
/*
 *  定义研发部员工
 *    属于员工中的一种
 *    研发员工继承员工类
 *    
 *    关键字 extends
 *    子类是Develop, 父类是Employee
 *    子类自动拥有父类中可以继承的属性和方法
 *    
 *    子类中,可以直接调用父类的成员
 */
public class Develop extends Employee{
    //在子类中,可以定义方法
    public void print(){
        System.out.println(name);
    }
}
package cn.it.demo01;
/*
 *  定义维护员工类
 *    属于员工的一种, 继承员工类
 */
public class WeiHu extends Employee{
    public void print(){
        System.out.println(name);
    }
}

 

 

 1 package com.it.demo03_variable;
 2 
 3 //自定义的父类
 4 public class Father {
 5     //成员变量
 6     int age = 30;
 7 }
 8 
 9 
10 package com.it.demo03_variable;
11 
12 //自定义的子类
13 public class Son extends Father {
14     //成员变量
15     int age = 20;
16 
17     //成员方法
18     public void show() {
19         //局部变量
20         int age = 10;
21         System.out.println(age);            //10
22         System.out.println(this.age);       //20
23         System.out.println(super.age);      //30
24     }
25 }
26 
27 package com.it.demo03_variable;
28 
29 /*
30     案例: 演示继承关系中的成员变量的访问特点:
31 
32     需求:
33         1.定义Father类, 在该类的成员位置定义变量: int age = 30;
34         2.定义Son类, 让它继承Father类, 并在该类的成员位置定义变量: int age = 20;
35         3.在测试类FatherTest的main方法中, 定义变量: int age = 10;
36         4.通过输出语句, 直接打印age变量的值, 并查看程序的运行结果.
37 
38     结论(记忆):
39         1. 使用变量遵循就近原则, 局部位置有使用, 没有就去本类的成员位置找,
40            有就使用, 没有就去父类的成员位置找, 有就使用, 没有就报错.  //这里不考虑父类的父类这种情况, 会会一直找, 直到找到Object类.
41         2. 本类的局部变量, 本类的成员变量, 父类的成员变量重名时, 如何解决?
42             本类的局部变量: 直接写.
43             本类的成员变量: this.成员变量名
44             父类的成员变量: super.成员变量名
45 
46 
47     从本案例开始, 我们来研究继承关系中的成员特点:
48         成员变量的特点:
49             1. 就近原则.
50             2. 解决重名.  super, this
51         构造方法的特点:
52 
53         成员方法的特点:
54  */
55 public class Demo01 {
56     public static void main(String[] args) {
57         //需求: 调用Son#show()
58         Son s = new Son();
59         s.show();
60     }
61 }

 

package com.it.demo04_constructor;

//自定义的父类
public class Father {
    public Father() {
        //super();        //Father类的父类, Object类的.
        System.out.println("Father类的 空参 构造");
    }

    public Father(String name) {
        //super();        //Father类的父类, Object类的.
        System.out.println("Father类的 带参 构造");
    }
}

package com.it.demo04_constructor;

//自定义的子类
public class Son extends Father{
    /*public Son() {
        //super("abc");  //用来初始化Father类的成员的
        this("abc");
        System.out.println("Son类的 空参 构造");
    } //这行代码走完,意味着Son对象创建成功.

    public Son(String name) {
      // super(name);  //用来初始化Father类的成员的
        System.out.println("Son类的 带参 构造");
    }*/

    //实际开发写法: 子类的空参访问父类的空参, 子类的全参访问父类的全参.
    public Son() {
        super();
        System.out.println("Son类的 空参 构造");
    }

    public Son(String name) {
       super(name);
        System.out.println("Son类的 带参 构造");
    }
}

package com.it.demo04_constructor;

/*
    案例: 演示继承关系中 构造方法的访问特点..

    需求:
        1.定义父类Father, 并在空参构造中打印一句话: Father空参构造.
        2.定义子类Son, 并在空参构造中打印一句话: Son空参构造.
        3.在FatherTest测试类的main方法中, 创建Son类的对象, 并查看程序的执行结果.
        4.分别修改Father类和Son类的代码, 添加带参构造, 并观察程序的执行结果.

    结论(记忆:):
        1. 子类的所有构造方法的第一行默认都有一个: super() 访问父类的空参构造.
            问题一: 为什么这样设计?
                用于子类对象访问父类数据前, 对父类数据进行初始化.
                //大白话: 子类对象一旦创建成功, 就能直接使用父类的成员了, 因为父类成员在子类成员之前就已经初始化了.
            问题二: 为什么默认访问的是空参, 而不是带参?
                因为所有的类都直接或者间接继承自Object类, Object类是所有类的父类.
                它里边只有一个空参构造.
            问题三: 父类没有空参构造怎么办?
                方案一: 通过 super()访问父类的带参构造.
                方案二: 通过 this()访问本类的其他构造.
        2. 实际开发写法: 子类的空参访问父类的空参, 子类的全参访问父类的全参.

 */
public class Demo01 {
    public static void main(String[] args) {
        //需求: 创建Son类的对象.
        Son s = new Son();
        System.out.println("---------");

        Son s2 = new Son("abc");
    }
}

 

 

package com.it.demo05_method;

//自定义的Father类
public class Father {
    public void method() {
        System.out.println("Father method()方法");
    }

    public void show() {
        System.out.println("Father show()方法");
    }
}

package com.it.demo05_method;

//自定义的子类
public class Son extends Father{
    public void method() {
        super.method();     //调用父类的method()方法
        System.out.println("Son method()方法");
    }

   /* public void show() {
        System.out.println("Son show()方法");
    }*/
}


package com.it.demo05_method;

/*
    案例: 演示继承关系中的成员方法访问特点.

    需求:
        1.定义Father类, 并在类中定义method()方法和show()方法.
        2.定义Son类, 并在类中定义method()方法和show()方法.
        3.在FatherTest测试类中, 创建Son类的对象, 并调用类中的成员方法.
        4.注释子类中的method()方法或者show()方法, 并观察程序的执行结果.

    结论(记忆):
        调用成员方法时, 也遵循就近原则, 本类中有, 就直接调用, 本类中没有, 就去父类中查找, 有就使用, 没有就报错.

 */
public class Demo01 {
    public static void main(String[] args) {
        Son s = new Son();
        s.show();
        System.out.println("-----------");
        s.method();
    }
}

 

package com.it.demo06_override;

//自定义的手机类
public class Phone {
    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }

    public void show() {
        System.out.println("show方法");
    }
}


package com.it.demo06_override;

//自定义的新式手机类
public class NewPhone extends Phone{
    @Override
    public void call(String name) {
        super.call(name);   //调用Phone#call()方法
        System.out.println("新式手机会播放彩铃...");
    }

    @Override
    public void show() {     //报错: 父类中私有的方法不能被重写
        System.out.println("show方法");
    }


    /*private void show() {     //报错: 父类中私有的方法不能被重写
        System.out.println("show方法");
    }*/
}

package com.it.demo06_override;

//自定义的手机类
public class Phone {
    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }

    public void show() {
        System.out.println("show方法");
    }
}

package com.it.demo06_override;

/*
    案例: 演示方法重写.

    需求:
        1.定义Phone类, 并在类中定义call(String name)方法.
        2.定义NewPhone类, 继承Phone类, 然后重写call(String name)方法.
        3.在PhoneTest测试类中, 分别创建两个类的对象, 然后调用call()方法, 观察程序执行结果.

    方法重写简介:
        概述:
            子类中出现和父类一模一样的方法时, 称为方法重写, 方法重写要求子父类的方法的返回值类型也必须一致.
        应用场景:
            当子类需要沿袭父类的功能, 但是功能主体又有自己独有需求的时候, 就可以考虑使用方法重写来实现了.
        注意事项:
            1.子类重写父类方法时, 方法声明上要用@Override注解来修饰.
            2.父类中私有的方法不能被重写.
            3.子类重写父类方法时, 访问权限不能更低.
                访问权限修饰符的访问级别, 从小到大分别是:
                    private < 默认 < protected < public
 */
public class Demo01 {
    public static void main(String[] args) {
        //测试Phone#call()
        Phone p = new Phone();
        p.call("刘亦菲");
        System.out.println("-----------------");

        //测试NewPhoenix#call()方法
        NewPhone np = new NewPhone();
        np.call("赵丽颖");
    }
}

 

 

package com.it.demo07_exercise_person;

//自定义父类, 人类.
public class Person {
    //属性, 姓名, 年龄
    private String name;            //赵丽颖"
    private int age;                //31

    //构造方法
    public Person() {
    }

    public Person(String name, int age) {   //"赵丽颖", 31
        this.name = name;
        this.age = age;
    }

    //getXxxx(), setXxx()
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //行为: 吃饭.
    public void eat() {
        System.out.println("人要吃饭!");
    }
}



package com.it.demo07_exercise_person;

//自定义的学生类, 继承人类
public class Student extends Person{
    //构造方法: 空参访问空参, 全参访问全参.
    public Student() {
    }

    public Student(String name, int age) {   //"赵丽颖", 31
        super(name, age);       //"赵丽颖", 31
    }

    //行为
    //定义学习的方法
    public void study() {
        System.out.println("学生要好好学习");
    }

    @Override
    public void eat() {
        System.out.println("学生吃牛肉!");
    }
}


package com.it.demo07_exercise_person;


//自定义的老师类
public class Teacher extends Person {
    //变量, 目前没有.

    //构造方法: 子类空参访问父类空参, 子类全参访问父类全参.
    public Teacher() {
    }

    public Teacher(String name, int age) {
        super(name, age);
    }

    //行为
    // 定义teach()方法.
    public void teach() {
        System.out.println("老师要教课!");
    }

    //重写Person#eat()
    @Override
    public void eat() {
        System.out.println("老师喝牛肉汤!");
    }
}



package com.it.demo07_exercise_person;

/*
    案例: 继承版的人类案例.

    需求:
        1.已知老师类Teacher, 属性有姓名和年龄, 行为有teach()
        2.已知学生类Student, 属性有姓名和年龄, 行为有study()
        3.他们都要吃饭, 不同的是学生吃牛肉, 老师喝牛肉汤.
        4.分析上述的需求, 并通过代码实现.
        5.在PersonTest类的main方法中, 分别创建老师类和学生类的对象, 然后访问其成员.

     分析:
        1. 抽取父类 Person.
            属性:
                姓名, 年龄
            行为:
                吃饭eat()
        2. 定义子类Teacher, 继承Person
            行为:
                定义teach()方法.
                重写Person#eat()
        3. 定义子类Student, 继承Person
            行为:
                 定义study()方法.
                重写Person#eat()方法.
 */
public class PersonTest {
    public static void main(String[] args) {
        //需求: 测试学生类.
        //测试空参
        Student s1 = new Student();     //学生是学生
        //这些常用都是从Person类中继承过来的.
        s1.setName("刘亦菲");
        s1.setAge(33);
        System.out.println(s1.getName() + "..." + s1.getAge());
        s1.eat();       //重写Person#eat()方法
        s1.study();     //Student类的独有功能.
        System.out.println("-------------------------");

        //测试全参
        Student s2 = new Student("赵丽颖", 31);
        System.out.println(s2.getName() + "..." + s2.getAge());
        s2.eat();
        s2.study();

        //需求: 测试老师类, 代码留给你写了.
    }
}
package com.it.demo08_quickstart;

//自定义的动物类
public class Animal {
    public void eat() {
        System.out.println("动物要吃饭!");
    }
}


package com.it.demo08_quickstart;

//自定义的猫类, 继承动物类
public class Cat extends Animal{
    //重写Animal#eat()
    @Override
    public void eat() {
        System.out.println("猫吃鱼!...");
    }
}

package com.it.demo08_quickstart;

/*
    案例: 演示多态入门.

    需求:
        1.定义动物类Animal, 并在类中定义一个成员方法: eat()
        2.定义猫类Cat, 继承Animal类, 并重写eat()方法.
        3.在AnimalTest测试类的main方法中, 通过多态的方式创建猫类对象.
        4.通过猫类对象, 调用eat()方法.

    多态简介:
        概述:
            指的是同一个对象(事物)在不同时刻表现出来的不同形态, 状态.
            //例如: 一杯水,  高温: 气态,  常温: 液态,  低温: 固态.
        前提条件:
            1. 要有继承关系.
            2. 要有方法重写.
            3. 要有父类引用指向子类对象.
 */
public class AnimalTest {
    public static void main(String[] args) {
        //1. 通过多态的方式创建猫类对象.
        Animal an = new Cat();  //猫是动物.
        Cat c = new Cat();      //猫是猫

        //2. 调用eat()方法
        an.eat();
        System.out.println("..............");
        c.eat();
    }
}
package com.it.demo09_person;

//自定义的人类
public class Person {
    int age = 30;

    public void eat() {
        System.out.println("Person eat()");
    }

   /* public static void sleep() {
        System.out.println("Person sleep()");
    }*/
}


package com.it.demo09_person;

//自定义的学生类
public class Student extends Person {
    int age = 20;

    @Override
    public void eat() {
        System.out.println("Student eat()");
    }

    //自己独有的成员方法
    public void study() {
        System.out.println("学生要学习!");
    }

    /*public static void sleep() {
        System.out.println("Student sleep()");
    }*/
}

package com.it.demo09_person;

/*
    案例: 演示多态中的成员访问特点.

    需求:
        1.定义一个人类Person. 属性为姓名和年龄, 行为是: eat()方法.
        2.定义Student类, 继承自Person类, 定义age属性及重写eat()方法.
        3.在PersonTest测试类的main方法中, 创建Student类的对象, 并打印其成员.

    结论(记忆):
        成员变量:   编译看左, 运行看左.
        成员方法:   编译看左, 运行看右.

        解释:
            编译看左的意思是: 在程序的编译期间, 会看左边的数据类型有没有这个成员, 有则编译通过, 否则, 编译报错.
            运行看左(右)的意思是: 在程序的运行期间, 具体用的是左(右)边数据类型中的成员.
        简单记忆:
            只有非静态方法是 编译看左, 运行看右, 其他(成员变量, 静态方法)都是编译和运行都看左,
            原因是因为: 只有非静态方法有方法重写.

     多态的好处和弊端:
        好处:
            提高代码的扩展性.
        弊端:
            父类引用不能访问子类的特有功能.
 */
public class Demo01 {
    public static void main(String[] args) {
        //需求:  演示多态中的成员访问特点.
        //1. 通过多态, 创建学生类的对象.
        //父类引用 指向 子类对象, 多态写法.
        Person p = new Student();
        //2. 测试访问成员变量
        System.out.println(p.age);      //30
        //3. 测试访问成员方法
        p.eat();                        //student eat()

        //p.sleep();

        //这样写会报错, 因为多态的弊端是: 父类引用不能访问子类的特有功能
        //p.study();
    }
}

 

package com.it.demo10_case;

//自定义的父类, 动物类
public class Animal {
    public void eat() {
        System.out.println("动物要吃!");
    }
}


package com.it.demo10_case;

//自定义的猫类
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //猫独有的成员方法
    public void catchMouse() {
        System.out.println("猫会抓老鼠!");
    }
}


package com.it.demo10_case;

//自定义的父类, 动物类
public class Animal {
    public void eat() {
        System.out.println("动物要吃!");
    }
}

 

package com.it.demo11_animal;

//父类, 动物类
public class Animal {
    //属性, 全部私有
    private String name;
    private int age;

    //构造方法: 空参, 全参
    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //getXxx(), setXxx()
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //行为
    public void eat() {
        System.out.println("动物要吃!");
    }
}


package com.it.demo11_animal;

//猫类
public class Cat extends Animal{
    //构造方法: 空参访问空参, 全参访问全参.
    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

    //行为
    //1. 重写Animal#eat()

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //2. 自身独有的方法catchMouse()
    public void catchMouse() {
        System.out.println("猫会抓老鼠!");
    }
}

package com.it.demo11_animal;

//狗类
public class Dog extends Animal{
    //构造方法: 空参访问空参, 全参访问全参.
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    //行为
    //1. 重写Animal#eat()
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    //2. 自身独有的方法lookHome()
    public void lookHome() {
        System.out.println("狗会看家!");
    }
}

package com.it.demo11_animal;

import java.util.Calendar;

/*
    多态案例: 动物类案例.

    需求:
        1.已知猫狗都有姓名和年龄, 都要吃饭.
        2.猫类独有自己的catchMouse()方法, 狗类独有自己的lookHome()方法.
        3.在AnimalTest测试类的main方法中, 通过多态分别创建猫类, 狗类的对象.
        4.分别通过猫类对象和狗类对象, 访问对象的成员.

     分析:
        父类: 动物类 Animal
            属性: 姓名, 年龄
            行为: eat()吃饭
        子类:
            猫类: Cat
                行为:
                    1. 重写Animal#eat()
                    2. 自身独有的方法catchMouse()
             狗类: Dog
                行为:
                    1. 重写Animal#eat()
                    2. 自身独有的方法lookHome()
 */
public class AnimalTest {
    public static void main(String[] args) {
        //需求1: 多态测试猫类
        //测试空参
        Animal an1 = new Cat();
        //设置成员变量值
        an1.setName("机器猫");
        an1.setAge(16);
        //打印成员变量值
        System.out.println(an1.getName() + "..." + an1.getAge());
        //调用方法
        an1.eat();          //猫吃鱼, 因为有方法重写.
        //an1.catchMouse();   //报错, 父类应用不能直接使用子类的特有成员.
        Cat c1 = (Cat)an1;
        c1.catchMouse();
        System.out.println("-------------------------");

        //测试全参
        Animal an2 = new Cat("加菲猫", 13);
        //打印成员变量值
        System.out.println(an2.getName() + "..." + an2.getAge());
        //调用方法
        an2.eat();             //猫吃鱼, 因为有方法重写.
        //an2.catchMouse();   //报错, 父类应用不能直接使用子类的特有成员.
        Cat c2 = (Cat)an2;
        c2.catchMouse();


        //需求2: 多态测试狗类, 自己写.
        //测试空参

        //测试全参
    }
}


package com.it.demo11_animal;

/*
    案例: 演示类型转换异常(ClassCastException)

    大白话理解:
        猫不能转成狗.
 */
public class AnimalTest02 {
    public static void main(String[] args) {
        Animal an = new Cat();  //动物是猫
        Cat c = (Cat)an;        //猫是猫
        c.catchMouse();
        System.out.println("-----------------");

        //会报: 类型转换异常(ClassCastException)
        //多态
        an = new Dog();
        Dog d = (Dog)an;
        d.lookHome();
    }
}


package com.it.demo11_animal;

/*
    案例: 演示多态在实际开发中的应用场景.

    多态在实际开发中的应用场景:
        父类型可以作为方法的形参类型, 这样可以接受其任意的子类对象,
        然后调用方法的时候, 根据"编译看左, 运行看右"的原则, 传入什么
        子类对象, 就调用其对应的方法.
 */
public class AnimalTest03 {
    public static void main(String[] args) {
        //测试: 调用猫类
        Cat c = new Cat();
        printAnimal(c);
        System.out.println("-------------");

        //测试: 调用狗类
        Dog d = new Dog();
        printAnimal(d);
    }

    //需求: 定义方法, 接收动物类型的对象, 然后调用其eat()方法
    //方式二: 采用多态解决.
    public static void printAnimal(Animal an) {     //Animal an = ?
        an.eat();
    }

    //方式一: Low版本, 一种动物, 一个方法.

    //针对于Cat(猫)类
    public static void printAnimal(Cat c) {
        c.eat();
    }

    //针对于Dog(狗)类
    public static void printAnimal(Dog d) {
        d.eat();
    }
}


package com.it.demo11_animal;

/*
    案例: 演示instanceof关键字的用法

    instanceof关键字详解:
        格式:
            对象名 instanceof 数据类型(类名)
        作用:
            判断前边的对象, 是否是后边的数据类型, true: 是, false: 不是

 */
public class AnimalTest04 {
    public static void main(String[] args) {
        //测试: 调用猫类
        Cat c = new Cat();
        printAnimal(c);
        System.out.println("-------------");

        //测试: 调用狗类
        Dog d = new Dog();
        printAnimal(d);
    }

    //需求: 定义方法, 接收动物类型的对象, 然后调用其eat()方法
    //方式二: 采用多态解决.
    public static void printAnimal(Animal an) {     //Animal an = ?
        //通用功能
        an.eat();

        //某些子类独有的功能
        if (an instanceof Cat) {
            Cat c = (Cat)an;
            c.catchMouse();
        } else if (an instanceof Dog) {
            Dog d = (Dog)an;
            d.lookHome();
        }
    }

   /* //方式一: Low版本, 一种动物, 一个方法.

    //针对于Cat(猫)类
    public static void printAnimal(Cat c) {
        c.eat();
        c.catchMouse();
    }

    //针对于Dog(狗)类
    public static void printAnimal(Dog d) {
        d.eat();
        d.lookHome();
    }*/
}

 

package com.it.demo01_final;

//父类
//public final class Father extends Object{     //final修饰的类: 不能被继承, 但是可以继承其他类.
public class Father{
    int a = 10;
    public final void show() {
        System.out.println("这个是绝密文件, 不能动!");
    }

}


package com.it.demo01_final;

//子类
public class Son extends Father{
    final int age = 20;

    //重写父类的show()方法, 这样写会报错, 因为父类用final修饰的方法, 子类无法重写.
    /*@Override
    public void show() {
        System.out.println("这个是垃圾文件, 赶紧删除!");
    }*/
}



package com.it.demo01_final;

/*
    案例: 演示final关键字

    需求:
        1.定义Father类, 并定义它的子类Son.
        2.先用final修饰Father类, 看Son类是否还能继承Father类.
        3.在Son类中定义成员变量age, 并用final修饰, 然后尝试给其重新赋值, 并观察结果.
        4.在Father类中定义show()方法, 然后用final修饰, 看Son类是否能重写该方法.

    final关键字简介:
        概述:
            它是一个关键字, 表示 最终 的意思, 可以修饰类, 成员变量, 成员方法.
        特点:     //记忆
            修饰的类:           不能被继承, 但是可以继承其他类.
            修饰的变量:         是一个常量, 只能赋值一次.
            修饰的成员方法:     不能被子类重写.
 */
public class FatherTest {
    public static void main(String[] args) {
        //演示final修饰局部变量.
        final int a = 10;
        //a = 20;       //报错, final修饰的变量:  是一个常量, 只能赋值一次.
        System.out.println(a);
        System.out.println("------------------");

        //演示final修饰成员变量.
        Son s = new Son();
        //s.age = 30;  报错, final修饰的变量:  是一个常量, 只能赋值一次.
        System.out.println(s.age);
        System.out.println("------------------");
        s.show();

    }
}

package com.it.demo01_final;

/*
    案例: 演示final修饰的变量的特点.

    结论(记忆):
        1. final修饰的变量如果是基本类型: 说明值不能变化.
        2. final修饰的变量如果是引用类型: 说明地址值不能变化, 但是属性值可以变化.
 */
public class FatherTest02 {
    public static void main(String[] args) {
        //演示: final修饰的变量如果是基本类型: 说明值不能变化.
        final int a = 10;
        //a = 20;       //报错: final修饰的变量如果是基本类型: 说明值不能变化.


        //演示: final修饰的变量如果是引用类型: 说明地址值不能变化, 但是属性值可以变化.
        final Father f = new Father();
        //f = new Father();   //报错, 说明地址值不能变化
        f.a = 100;          //不报错, 但是属性值可以变化
        System.out.println(f.a);
    }
}

 

package com.it.demo02_static;

//学生类
public class Student {
    String name;            //姓名
    int age;                //年龄
    static String graduateFrom;    //毕业院校, 共享

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, String graduateFrom) {
        this.name = name;
        this.age = age;
        this.graduateFrom = graduateFrom;
    }

    //定义show()方法, 用来打印上述的各个属性信息.
    public String show() {
        return name + "..." + age + "..." + graduateFrom;
    }
}

package com.it.demo02_static;

/*
    案例: 演示static关键字的特点

    需求:
        1.定义学生类, 属性为姓名, 年龄, 毕业院校(graduateFrom).
        2.在学生类中定义show()方法, 用来打印上述的各个属性信息.
        3.在测试类的main方法中, 创建学生对象, 并调用学生类的各个成员.

    static简介:
        概述:
            它是一个关键字, 表示 静态 的意思, 可以修饰成员变量, 成员方法.
        特点:
            1. 静态成员是随着类的加载而加载的.
            2. 静态成员是优先于对象存在的.
            3. 静态成员可以被该类下所有的对象所共享.
                //这个判断是否使用静态的一个标准.
            4. 静态成员可以被 类名. 的形式调用,  也可以通过 对象名. 的形式调用,
               推荐使用前者.
 */
public class StudentTest {
    public static void main(String[] args) {
        //前提: 这些学生都是同一个大学的学生.
        //学生来自于: 传智大学
        Student.graduateFrom = "传智大学";

        //创建学生, 属性值为: 刘亦菲, 33, 北影, 打印该学生的信息.
        Student s1 = new Student("刘亦菲", 33);
        System.out.println(s1.show());

        //创建学生, 属性值为: 赵丽颖, 31, 北影, 打印该学生的信息.
        Student s2 = new Student("赵丽颖", 31, "北影");
        System.out.println(s2.show());

        //创建学生, 属性值为: 高圆圆, 35, 北影, 打印该学生的信息.
        Student s3 = new Student("高圆圆", 35);
        System.out.println(s3.show());
    }
}

 

package com.it.demo03_static;

//学生类
public class Student {
    //属性
    String name;        //姓名, 非静态成员变量
    static int age;     //年龄, 静态成员变量

    //行为
    public void show1() {
        System.out.println(name);   //非静态成员变量
        System.out.println(age);    //静态成员变量
        show2();                     //非静态方法
        show4();                     //静态方法

        System.out.println("非静态 show1()方法");
    }

    public void show2() {
        System.out.println("非静态 show2方法");
    }

    public static void show3() {
        //System.out.println(name);   //非静态成员变量
        System.out.println(age);    //静态成员变量
        //show2();                     //非静态方法
        show4();                     //静态方法


        System.out.println("静态 show3()方法");
    }

    public static void show4() {
        System.out.println("静态 show4()方法");
    }
}


package com.it.demo03_static;

/*
    案例: 演示static的访问特点和注意事项.

    需求:
        1.定义学生类, 属性为姓名和年龄(静态修饰), 非静态方法show1(),show2(), 静态方法show3(), show4().
        2.尝试在show1()方法中, 调用: 姓名, 年龄, show2(), show4().
         结论: 非静态方法可以访问所有成员(非静态变量和方法, 静态变量和方法)
        3.尝试在show3()方法中, 调用: 姓名, 年龄, show2(), show4().
         结论: 静态方法只能访问静态成员.

    结论(记忆):
        1. 静态成员方法只能访问静态成员(静态成员变量和静态成员方法).
            大白话理解: 静态只能访问静态.
        2. 在静态方法中, 是没有this, super关键字的.
        3.因为静态的内容是随着类的加载而加载, 而this和super是随着对象的创建而存在.
            即: 先进内存的, 不能访问后进内存的.

 */
public class StudentTest {
    public static void main(String[] args) {
        //需求: 调用Student#show1()
        Student s = new Student();
        s.show1();  //非静态成员方法, 可以访问非静态成员, 也可以访问静态成员.
        System.out.println("---------------------");

        //需求: 调用Student#show3();
        Student.show3();


    }
}
package com.it.demo04_abstract;

/*
    案例: 抽象类入门.

    结论(记忆):
        1. 没有方法体的方法叫; 抽象方法.
        2. 有抽象方法的类一定是抽象类.
        3. 抽象方法和抽象类都用关键字: abstract修饰.
 */
public abstract class Animal {

    //抽象方法
    public abstract void eat();

    //非抽象方法
    /*public void eat() {
        System.out.println("动物会吃!");
    }*/
}

package com.it.demo04_abstract;

//测试类
public class AnimalTest {
    public static void main(String[] args) {
        //需求: 调用Animal#eat()方法
        //下边这个代码是无意义的, 并没有给出具体的动物.

        //报错原因: 抽象类不能直接实例化.
        //Animal an = new Animal();       //动物是动物
        //an.eat();                       //动物会吃!
    }
}
package com.it.demo05_animal;

//父类, 动物类.
public abstract class Animal {
   //抽象方法, 吃饭
   public abstract void eat();

   //非抽象方法, 睡觉.
    public void sleep() {
        System.out.println("动物要睡觉!");
    }
}

package com.it.demo05_animal;

//非抽象的子类, 猫类
public class Cat extends Animal{
    //如果是普通类: 则必须重写父抽象类中 所有的抽象方法.

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

package com.it.demo05_animal;

//抽象的子类, 狗类

//抽象类的子类: 如果是抽象类, 则可以不用重写父抽象类中的 抽象方法.
public abstract class Dog extends Animal{
}

package com.it.demo05_animal;

/*
    案例: 演示抽象类的特点

    需求:
        1.定义抽象类Animal , 类中有一个抽象方法eat(), 还有一个非抽象方法sleep().
        2.尝试在测试类中, 创建Animal类的对象, 并观察结果.
        3.创建普通类Cat, 继承Animal类, 观察是否需要重写Animal#eat()方法.
        4.创建抽象类Dog, 继承Animal类, 观察是否需要重写Animal#eat()方法.

     结论(记忆:):
        1. 抽象方法和抽象类都要用 abstract 关键字修饰.
        2. 有抽象方法的类一定是抽象类, 但是抽象类中不一定有抽象方法.
        3. 抽象类不能直接实例化.
            那抽象类如何实例化呢?
                可以通过 多态的形式创建其子类对象, 来完成抽象类的初始化, 这种做法叫: 抽象类多态.
        4. 抽象类的子类:
            如果是普通类: 则必须重写父抽象类中 所有的抽象方法.
            如果是抽象类: 则可以不用重写父抽象类中的 抽象方法.
 */
public class AnimalTest {
    public static void main(String[] args) {
        //Animal an = new Animal();   //报错, 抽象类不能直接实例化

        //那抽象类如何实例化呢?
        //抽象类多态
        Animal an = new Cat();
        an.eat();

    }
}

 

 

package com.it.demo06_abstract;

//人类, 抽象类
public abstract class Person {
    //变量
    int age;
    //常量, 系统不给默认值, 留给用户来设置.
    final String country = "中国";   //null


    //构造方法
    public Person() {
    }
    public Person(int age) {
        this.age = age;
    }

    //非抽象方法
    public void eat() {
        System.out.println("人要吃饭!");
    }

    //抽象方法
    public abstract void sleep();
}

package com.it.demo06_abstract;

/*
    需求: 演示抽象类的成员特点, 即抽象类中可以写什么.

    需求:
        1.定义抽象类Person, 在类中定义变量age, 常量country, 空参, 全参构造.
        2.在Person类中定义非抽象方法show(), 抽象方法eat().
        3.在测试类的main方法中, 创建Person类的对象, 并调用类中的成员.

     结论(记忆):
        专业版:
            抽象类中可以写变量, 常量, 构造方法, 非抽象方法, 抽象方法.
        大白话版:
            抽象类比普通类多一种抽象方法, 而且抽象方法还可以不写.
 */
public class PersonTest {
    public static void main(String[] args) {

    }
}

 

package com.it.demo08_interface;

/*
    案例: 演示接口的成员特点, 即: 接口中可以写什么.

    结论:
        1. JDK1.8以前, 接口中有且只能有 常量 和 抽象方法, 原因是因为:
            接口中的成员变量有默认修饰符: public static final
            接口中的成员方法有默认就是福: public abstract
        2. JDK1.8开始, 接口中可以写如下成员:
            静态方法: 直接写即可, 和以前的规则一样.
            默认方法: 即非静态方法, 要用 default 关键字修饰.
 */
public interface Inner {
    //接口中的成员变量有默认修饰符: public static final
    public static final int age = 20;

    //接口中的成员方法有默认就是福: public abstract
    //public abstract void eat();
    //上述代码可以简写成: 如下的形式
    void eat();

    public static void show() {
        System.out.println("JDK1.8开始, 接口中可以写 静态方法了");
    }

    public default void method() {
        System.out.println("JDK1.8开始, 接口中可以写 非静态(默认)方法了");
    }
}

package com.it.demo08_interface;

//测试类
public class InnerTest {
    public static void main(String[] args) {
        //调用接口中的 成员变量, 其实是一个常量
        //Inner.age = 30;       //报错, 常量值只能赋值一次, 不能修改.
        System.out.println(Inner.age);

        //调用接口中的 成员方法
        Inner.show();

        //下述代码会报错, 因为method()是默认方法(非静态), 必须通过 对象名. 的形式调用.
        //Inner.method();
    }
}


package com.it.demo08_interface;

//自定义接口Jumpping, 表示具有跳高功能.
public interface Jumpping {

    //jump()方法, 表示具有跳高功能
    public abstract void jump();
}


package com.it.demo08_interface;

/*
    案例: 演示接口的特点.

    需求:
        1.定义Jumpping接口, 接口中有一个抽象方法jump().
        2.定义Cat类, 实现Jumpping接口, 重写jump()方法.
        3.在测试类的main方法中, 创建Jumpping接口对象, 并调用其jump()方法

    结论(记忆):
        1. 接口用 interface 关键字修饰.
        2.
 类和接口之间是实现关系, 用关键字 implements 来修饰.
        3. 接口不能直接实例化.
            那接口如何实例化呢?
                可以通过多态的形式, 创建其子类对象, 来完成接口的实例化. 这种写法叫: 接口多态.
        4. 接口的子类:
             如果是普通类: 则必须重写父接口中 所有的抽象方法.
             如果是抽象类: 则可以不用重写父接口中的 抽象方法.

 */
public class JumpTest {
    public static void main(String[] args) {
        //演示: 接口不能直接实例化
        //Jumpping jm = new Jumpping();   //接口不能直接实例化

        // 那接口如何实例化呢?
        Jumpping jm = new Cat();          //接口多态
    }
}


package com.it.demo08_interface;

//自定义的猫类, 实现Jumpping接口

//接口的子类: 如果是抽象类, 则可以不用重写父接口中的 抽象方法.
//public abstract class Cat implements Jumpping{

//接口的子类:  如果是普通类, 则必须重写父接口中 所有的抽象方法.
public class Cat implements Jumpping{
    @Override
    public void jump() {
        System.out.println("猫会跳高!");
    }
}
package com.it.demo09_interface_class;

public class A {
}


package com.it.demo09_interface_class;

public class B {
}

package com.it.demo09_interface_class;

//演示: 类与类之间: 继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
//public class C extends B, A{        //报错


//演示: 类和接口之间: 实现关系, 可以单实现, 也可以多实现, 还可以在继承一个类的同时实现多个接口.
//public class C implements Inner1{             //单实现

//public class C implements Inner1,Inner2{        //多实现

//public class C extends B implements Inner1,Inner2{   //继承一个类的同时实现多个接口.

public class C implements Inner3{
    @Override
    public void show3() {

    }

    @Override
    public void show1() {

    }

    @Override
    public void show2() {

    }
}

 

package com.it.demo09_interface_class;

public interface Inner1 {
    void show1();
}

package com.it.demo09_interface_class;

public interface Inner2 {
    void show1();
    void show2();
}


package com.it.demo09_interface_class;


//演示: 接口与接口之间的关系: 继承关系, 可以单继承, 也可以多继承.
public interface Inner3 extends Inner2, Inner1{
    void show3();
}

package com.it.demo09_interface_class;


/*
案例: 演示接口 和 类之间的关系.
类与类之间:
继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
类与接口直接:
实现关系, 可以单实现, 也可以多实现, 还可以在继承一个类的同时实现多个接口.
接口与接口之间:
继承关系, 可以单继承, 也可以多继承.
*/
public class Test {


}

 

 

package com.itheima.demo11_package;

import java.util.Scanner;
import java.util.HashSet;
import java.io.InputStreamReader;

/*
    案例: 包的详解

    包(package)的简介:
        概述:
            包就是文件夹, 用来区分重名类的, 多级包之间用.隔开, 一般是命名格式为: 公司域名反写 + 项目名 + 部门名(编号) + 功能模块 格式.
        常见的分包方式:
            基本划分: 一般是按照功能或者模块划分的
                按照模块划分:
                    com.itheima.student     学生模块
                        AddStudent
                        DeleteStudent
                        UpdateStudent
                        SelectStudent
                    com.itheima.teacher     老师模块
                        AddTeacher
                        DeleteTeacher
                        UpdateTeacher
                        SelectTeacher
                 按照功能划分:
                    com.itheima.add
                        AddStudent
                        AddTeacher
                        ...
                    com.itheima.delete
                        DeleteTeacher
                        DeleteStudent
                        ...
            高级划分: 按照具体的业务划分的
                com.it.controller      控制层
                com.it.service         业务层
                com.it.dao             数据访问层
                com.it.utils           存放的是所有的工具类
                com.it.pojo            存放所有的JavaBean类
                ...

        格式:
            package 包名1.包名2.包名3;
        注意事项:
            1.package语句必须是程序的第一条可执行的代码.
            2.package语句在一个.java文件中只能有一个.
 */
public class Demo01 {
    public static void main(String[] args) {

    }
}

//class A{ }

 

 

package com.it.demo10_exercise;

//接口, 表示具有说英语的功能
public interface SpeakEnglish {
    void speakEnglish();
}


package com.it.demo10_exercise;

//父类, 人类
public abstract class Person {
    //属性: 姓名, 年龄
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //行为: 吃
    public abstract void eat();
}


package com.it.demo10_exercise;

//篮球教练类, 需要继承: 教练类
public class BasketballCoach extends Coach{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public BasketballCoach() {
    }

    public BasketballCoach(String name, int age) {
        super(name, age);
    }

    //重写吃的方法
    @Override
    public void eat() {
        System.out.println("篮球教练吃羊肉, 喝牛奶");
    }

    //重写教的方法
    @Override
    public void teach() {
        System.out.println("篮球教练教如何运球和投篮");
    }
}


package com.it.demo10_exercise;

//教练类, 需要继承人类
public abstract class Coach extends Person{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    //行为: 教学
    public abstract void teach();

}


package com.it.demo10_exercise;

//运动员类, 需要继承人类
public abstract class Player extends Person{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public Player() {
    }

    public Player(String name, int age) {
        super(name, age);
    }

    //行为: 学习
    public abstract void study();

}


package com.it.demo10_exercise;

//篮球运动员类, 需要继承: 运动员类
public class BasketballPlayer extends Player{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public BasketballPlayer() {
    }

    public BasketballPlayer(String name, int age) {
        super(name, age);
    }

    //重写学习的功能
    @Override
    public void study() {
        System.out.println("篮球运动员学习如何运球和投篮");
    }

    //重写吃饭的功能
    @Override
    public void eat() {
        System.out.println("篮球运动员吃牛肉, 喝羊奶");
    }
}


package com.it.demo10_exercise;

//乒乓球运动员, 需要继承 运动员类, 还得实现 说英语的接口.
public class PingPangPlayer extends Player implements SpeakEnglish{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public PingPangPlayer() {
    }

    public PingPangPlayer(String name, int age) {
        super(name, age);
    }

    //重写吃的功能
    @Override
    public void eat() {
        System.out.println("乒乓球运动员吃大白菜, 喝小米粥");
    }

    //重写学习的功能
    @Override
    public void study() {
        System.out.println("乒乓球运动员学习如何发球");
    }

    //重写说英语的功能
    @Override
    public void speakEnglish() {
        System.out.println("乒乓球运动员需要学习如何 说英语");
    }
}

package com.it.demo10_exercise;

//篮球教练类, 需要继承: 教练类
public class BasketballCoach extends Coach{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public BasketballCoach() {
    }

    public BasketballCoach(String name, int age) {
        super(name, age);
    }

    //重写吃的方法
    @Override
    public void eat() {
        System.out.println("篮球教练吃羊肉, 喝牛奶");
    }

    //重写教的方法
    @Override
    public void teach() {
        System.out.println("篮球教练教如何运球和投篮");
    }
}


package com.it.demo10_exercise;

//乒乓球教练, 需要继承 教练类, 还得实现 说英语的接口.
public class PingPangCoach extends Coach implements  SpeakEnglish{
    //构造方法, 子类空参访问父类空参, 子类全参访问父类全参.
    public PingPangCoach() {
    }

    public PingPangCoach(String name, int age) {
        super(name, age);
    }

    //重写吃的方法
    @Override
    public void eat() {
        System.out.println("乒乓球运动员吃小白菜, 喝大米粥");
    }

    //重写教的方法
    @Override
    public void teach() {
        System.out.println("乒乓球教练教如何发球");
    }

    //重写说英语的方法
    @Override
    public void speakEnglish() {
        System.out.println("乒乓球教练需要学习如何 说英语");
    }
}

 

 

package com.it;



/*
    案例: 演示各个权限修饰符的用法.

   
    结论(记忆):
        1. 测试图解
                                             private     默认      protected       public
            本类中:                            √        √          √              √
            同包下的类(子类或者无关类均可):              √          √              √
            不同包下的子类:                                          √              √
            不同包下的无关类:                                                        √

        2. 四大访问权限修饰符的权限从小到大分别是:
            private < 默认 < protected < public
        3. 大白话总结的结论(必须记忆):
            private:    强调的是给 本类       使用的.
            默认:       强调的是给 同包下的类 使用的.
            protected:  强调的是给 子类       使用的.
            public:     强调的是给 大家       使用的.

            以后写代码的时候, 如非必要, 基本都是: 成员变量全部用private修饰, 其他都用public修饰.
 */
public class Father {
    private void show1() {
        System.out.println("private show1()");
    }

    void show2() {
        System.out.println("默认 show1()");
    }

    protected void show3() {
        System.out.println("protected show1()");
    }

    public void show4() {
        System.out.println("public show1()");
    }


    public static void main(String[] args) {
        //创建Father类的对象, 调用四个方法
        Father f = new Father();
        f.show1();
        f.show2();
        f.show3();
        f.show4();
    }
}

package com.it;


//测试四大访问权限修饰符, 该类和Father类的关系:  同包下的子类.
public class Son extends Father {
    public static void main(String[] args) {
        //创建Father类的对象, 调用四个方法
        Father f = new Father();
        //f.show1();                private
        f.show2();
        f.show3();
        f.show4();
    }
}

 

 

package cn.it;

//老师类
public class Teacher {
    public void method() {
        System.out.println("Teacher类的 method()方法");
    }

}


package com.it;

//学生类
public class Student {
    public void show() {
        System.out.println("Student类的 show()方法");
    }
}



package com.it;





/*
    案例:  演示导包.

    

    导包简介:
        概述:
            当我们使用不同包下的类的时候, 就需要导包. 如果是同包下的类, 可以直接使用.
        格式:
            import 包名1.包名2.类名;      //只导入一个具体的包, 推荐使用.
            import 包名1.包名2.*;         //导入包2下所有的内容(包括所有的类和接口)
 */
public class Test {
    //main方法作为程序的主入口
    public static void main(String[] args) {
        //需求1: 调用Student#show(), 同包下的类, 直接用, 无需导包.
        Student s = new Student();
        s.show();

        //需求2: 调用Teacher#method()方法, 不同包下的类的使用.
        //方式一: 写全类名(即: 包名 + 类名)
        cn.it.Teacher t1 = new cn.itcast.Teacher();
        t1.method();
        System.out.println("-------------------");

        //方式二: 导包
        Teacher t2 = new Teacher();
        t2.method();
    }
}

package com.it;

//测试四大访问权限修饰符, 该类和Father类的关系:  同包下的无关类.
public class Test02 {
    public static void main(String[] args) {
        //创建Father类的对象, 调用四个方法
        Father f = new Father();
        //f.show1();        private
        f.show2();
        f.show3();
        f.show4();
    }
}

 

上一篇:JavaSE02_Day05(上)-WebServer项目解析web.xml文件、重构setEntity方法、完成注册业务


下一篇:JavaSE学习 Day05 - Java方法详解