day10--Java面向对象--Javaobject01-3&javaobject02

今天我们主要学习了如下内容:


1. 代码块(局部代码块,构造代码块,静态代码块)
2. package和import关键字
3. 了解面向对象思想
4. 访问权限
5. 面向对象3大特征之封装

 1.补充昨天的,Static关键字:

 1 package com.cskaoyan.syntax.yesterday.keyStatic;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  *  对于: 静态上下文 不能访问非静态的成员变量和非静态的成员方法的补充说明
 8  *       a. 在静态方法中,不能访问的非静态的成员变量和非静态的成员方法(this的)
 9  *       b. 在静态方法中,对于非this的普通成员变量和普通成员方法,可以访问的
10  *
11  */
12 public class Demo1 {
13 
14   public static void main(String[] args) {
15     //StaticClass.testStatic();
16   }
17 
18 }
19 
20 class StaticClass {
21   int i;
22 
23 
24   public static void testStatic(StaticClass obj) {
25      // 静态上下文 不能访问(this当前对象)非静态的成员变量和非静态的成员方法
26     //System.out.println(this.i);
27     //this.method();
28 
29     // 我们在静态方法中,在我们创建的对象上,访问其普通成员变量和普通成员方法,都可以访问
30     //StaticClass staticClass = new StaticClass();
31     //System.out.println(staticClass.i);
32     //staticClass.method();
33 
34     System.out.println(obj.i);
35     obj.method();
36 
37   }
38 
39 
40   public void method() {
41 
42   }
43 
44 
45 }

2.代码块:

  1 package com.cskaoyan.syntax.codeblock;
  2 
  3 /**
  4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
  5  * @version 1.0
  6  *
  7  * 代码块
  8       1. 在Java中,使用{}括起来的代码被称为代码块
  9       2. 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)
 10 
 11 
 12    局部代码块(开发中,不会用):
 13     1. 声明位置:定义在 方法体 中的用{}括起来的一段代码
 14     2. 执行时机:随着方法的执行而执行
 15     优点:限定变量生命周期,及早释放,提高内存利用率
 16         (这个优点理论上确实存在,但是这个优点,在现在jvm中其效果,微乎其微的,甚至可以忽略不计)
 17         我们在开发中,同时还要追求,代码可维护性(包括代码的可读性)
 18 
 19      在嵌套的代码块中,不能定义同名变量
 20 
 21     构造代码块:
 22     1. 声明的位置, 类中,方法体之外{}包含的代码
 23     2. 执行特征: 创建对象的时候执行, 而且每次创建对象的时候必执行
 24        构造方法和构造代码块,都是在创建对象的时候执行,有没有先后顺序呢?
 25        构造代码块先执行,构造方法后执行
 26 
 27     构造代码块的使用场景:
 28           1. 可以把多个构造方法方法中相同的,提取朱来放到构造代码块中,每次调用构造都执行,并且在构造方法前执行
 29           2. 我们也可以用,构造代码块,来初始化对象的成员变量的值
 30 
 31      成员变量初始化语句 和 构造代码块他们的执行先后顺序是: 按照代码的书写先后顺序顺序
 32 
 33     关于成员变量 初始化语句,构造代码块中的赋值语句,以及构造方法中的赋值(都是对成员变量的赋值),有如下结论:
 34     1. 不管是成员变量的初始化语句,还是构造代码块中的赋值语句,它们都先于构造方法的赋值执行
 35     2. 初始化语句和构造代码块中的赋值语句,执行的先后顺序和代码书写顺序有关,谁在前谁就先执行
 36 
 37    静态代码块:
 38     1. 声明位置:类中方法体之外,除此之外,还被static修饰
 39     2. 执行特征:静态代码块,随着类加载而执行,所以,静态代码块,它的执行还有一个特征,至多执行一次
 40 
 41     注意事项:
 42        a. 在学习了静态代码块之后,静态上下文,就多了一个,静态代码块
 43  */
 44 public class Demo1 {
 45 
 46   public static void main(String[] args) {
 47 
 48     // 可以在主方法中,创建一个对象,然后在该对象上调动,其非静态成员方法
 49     //CodeBlockClass obj = new CodeBlockClass();
 50     // 运行方法的局部代码块
 51     //obj.testLocalBlock();
 52 
 53     //CodeBlockClass obj1 = new CodeBlockClass(1);
 54     //CodeBlockClass obj2 = new CodeBlockClass(1, 2);
 55 
 56     // 测试 成员变量的初始化语句和构造构造代码块中的成员变量的赋值语句,谁先执行,谁后执行?
 57     //System.out.println(obj.i);
 58 
 59     // 在不创建对象的情况下,我们可以通过访问类中的静态变量或者静态方法,来触发类加载
 60     System.out.println(CodeBlockClass.staticInt);
 61     //System.out.println(CodeBlockClass.staticInt);
 62   }
 63 
 64   public void test() {
 65 
 66   }
 67 }
 68 
 69 class CodeBlockClass {
 70   int j;
 71 
 72   /*
 73       假设,我有这样一个功能要实现:我希望有一段代码,不管在创建对象时,
 74       用的是哪个构造方法,来初始化对象初值,我都希望这段代码一定执行
 75    */
 76   public CodeBlockClass() {
 77     //System.out.println("构造方法执行了");
 78     // 必执行的一端代码
 79     //System.out.println("必执行的一端代码CodeBlockClass()");
 80 
 81     this.i = 20;
 82   }
 83   public CodeBlockClass(int i) {
 84     this.i = i;
 85     // 必执行的一端代码
 86     //System.out.println("必执行的一端代码CodeBlockClass(int i)");
 87   }
 88   public CodeBlockClass(int i, int j) {
 89     this.i = i;
 90     this.j = j;
 91     // 必执行的一端代码
 92     //System.out.println("必执行的一端代码 CodeBlockClass(int i, int j)");
 93   }
 94   // 成员变量的初始化语句
 95   int i = 100;
 96 
 97   /*
 98           构造代码块, 中的代码,可以访问当前对象的成员变量
 99    */
100   {
101     //System.out.println("构造代码块执行了");
102     //System.out.println("必执行的代码");
103     this.i = 10;
104     System.out.println(i);
105   }
106 
107 
108   static int staticInt = 100;
109 
110   /*
111       静态代码块, 也是静态上下文的一种
112    */
113   static {
114     // 静态上下文不能访问非静态的成员变量或非静态的成员方法(this的)
115     //System.out.println(this.j);
116 
117     //访问静态成员变量
118     //System.out.println(staticInt);
119 
120     staticInt = 2000;
121 
122     //System.out.println("静态代码块执行了");
123 
124   }
125 
126 
127 
128 
129   /*
130     局部代码块
131  */
132   public void testLocalBlock() {
133     //int i;
134 
135     //这就是一个典型的局部代码块
136     {
137       int i = 0;
138       System.out.println(i);
139     }
140 
141     //System.out.println(i);
142   }
143 }

3. package关键字

package com.cskaoyan.syntax.keypackage;

/**
 * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 * @version 1.0
 *
 * 在Java 源程序文件的第一行使用package 声明可以使文件中定义的类成为指定包的成员
 *
 *  package声明的语法如下:
       package 包名;

    包名通常由多个名字字符串构成,中间用句点“.”分隔,每个名字表示的包称为其前面的名字表示的包的子包。


    通常以组织机构的域名反转形式作为其所有包的通用前缀,比如:com.somecompany.apps



    注意:Java中定义的任何一个类,都是一定是在某一个包下的
         即使,我们的代码没有用package关键字声明,类所属的包,此时这样类其实仍然,在java中的一个默认包中
 */
public class Demo1 {

}

class TestPackage {

}

4. import关键字

 1 package com.cskaoyan.syntax.keyimport.onepackate;
 2 
 3 
 4 //import com.cskaoyan.object01.syntax.keyimport.otherpackage.*;
 5 
 6 
 7 import com.cskaoyan.syntax.keyimport.otherpackage.B;
 8 
 9 /**
10  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
11  * @version 1.0
12  *
13  * import关键字:
14  * 1. 预备知识,全限定类名,全类名
15  *    在类名前面加上类所属的包名,中间用句点“.”分隔,
16  *    称为类的完全限定名(Full Qualified Name),简称类的全限定名
17  *
18  *    比如说:这里的Demo1这个类,其全类名 包名+类名: com.cskaoyan.object01.syntax.keyimport.onepackate.Demo1
19  *    java语言中,我们是根据类的全限定名,唯一确定一个类
20  *
21  *
22  *    当在类体中使用了与当前类不同包的类名时,编译器编译时因为无法找到该类的定义而报错
23  *    1. 使用类的全限定名
24  *    2. 使用import关键字,在当前Java文件中,导入其他包下的类,信息
25  *
26  *    import注意事项
27             1. import声明一般紧跟在package声明之后,必须在类声明之前,其基本语法如下:
28                   import 类的完全限定名;
29             2. Java语言核心包java.lang包中的类 将被隐式导入,可以直接使用其中的类
30             3. import声明提供了一种包的智能导入方式:
31                import <包名>.*;
32               包中的类将 根据需 要导入,避免使用多条import声明
33               注意事项:
34               a. 智能导包,不会递归导入子包中的类
35               b. 导入方式,按需导入
36 
37  *
38  */
39 public class Demo1 {
40 
41   public static void main(String[] args) {
42     // 当使用其他包中的类(public),可以用全限定名,告诉编译器我们要使用的究竟是哪个类
43     // com.cskaoyan.object01.syntax.keyimport.otherpackage.A a = new com.cskaoyan.object01.syntax.keyimport.otherpackage.A();
44     //第二种解决方案,利用import关键字,导入其他包中的类
45     A a = new A();
46 
47     //String s = "hello world";
48 
49 
50     //当我们需要使用其他包中的,多个类的使用,可以使用,imort的智能导包方式,来一次导入多各类
51     B b = new B();
52 
53     // 智能导包方式,不会递归导入,某个包中,子包定义的类
54     //D d = new D();
55 
56 
57   }
58 
59 }

面向对象思想oopthinking

 1 package com.cskaoyan.oopthinking;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  * 面向过程思想:
 8     所谓面向过程的编程思想,简单理解,程序是“动词”的集合,
 9     即程序功能是由一系列有序的动作来完成。
10 
11    面向对象的思想:
12     所谓面向对象的编程思想,简单理解,程序是由一系列的 对象(消息)+消息 组成,
13     即程序是由一系列的对象和对象间的消息组成。
14 
15     举一个例子,用代码来模拟:完成,将大象装进把冰箱
16  */
17 public class Demo1 {
18 
19   /*
20       用面向过程的思想,写代码模拟:将大象装进把冰箱
21       得把这个问题,转化成一些列动作集合:
22       1. 打开冰箱
23       2. 将大象塞进冰箱
24       3. 关上冰箱
25    */
26   public void prodcedure() {
27     //1. 打开冰箱
28     //2. 将大象塞进冰箱
29     //3. 关上冰箱
30   }
31 
32   /*
33       用面向过对象的思想,写代码模拟:将大象装进把冰箱
34       所谓向一个对象发送消息:就是指在这个对象上,调用其成员方法
35    */
36   public void oop() {
37     // 冰箱对象.in(大象对象)
38   }
39 
40 
41 }

面向对象和面向过程的比较:

1.结构化程序设计(面向过程程序设计)

  • 对应的典型的计算机语言, 例如: C
  • 面向操作
  • 函数(方法)是程序的基本单位

2.面向对象程序设计

  • 对应的典型的计算机语言, 例如: Java, C++, C#
  • 面向对象(object)
  • 类(class)是程序的基本单位

Java面向对象——Javaobject02

1.访问权限修饰符

  在Java语言中,一切事物(类所有成员)都具有(或显示定义或隐式定义的)访问权限,而这种语言层面的访问权限控制,是由访问权限修饰符实现。

访问权限修饰符的访问控制,分为2个层面:

  • 修饰类中成员(field & method)

     控制类中的成员,对其他类可见性(其他类是否可以直接使 用到)

  • 修饰类

     通常用来限定,类库中的类(自定义数据类型),对于外部使用者的可见性(是否能使用该类型)。

1.对类中成员的访问控制

对于类中成员的访问,可以使用的访问权限修饰符有4种:

    • public: 任意类均访问,实际就是没有限制访问权限
    • protected 同包中的其他类,和不同包的(可见)子类均可见
    • default(默认权限,隐式定义) 同包中的其他类可见
    • private 仅对同类中的其他成员可见

                                图:各权限修饰符对成员的可见性的影响

 1 package com.cskaoyan.object02.access.onepackage.member;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  * 对类中成员的访问控制
 8 
 9 对于类中成员的访问,可以使用的访问权限修饰符有4种:
10 
11         public:
12          任意类均访问,实际就是没有限制访问权限
13         a. 类体中,可以直接访问
14         b. 同包的其他类中,也可以访问
15         c. 不同包的的类中,也可以访问
16 
17         protected
18         同包中的其他类,和不同包的(可见)子类均可见
19         a. 类体中,可以直接访问
20         b. 同包其他类中,可以访问
21         c. 在非同包的一部分类中,访问不到,????????还有一部分(子类中可以访问到,父类中被protected)
22 
23         default(默认权限,隐式定义)
24         a. 类体中,可以直接访问
25         b. 同包其他类中,可以访问
26         c. 不同包的类中,访问不了
27 
28         private
29         仅对同类中的其他成员可见
30         a. 类体中,可以访问
31         b. 同包其他类中,无法访问
32         c. 非同包中,无法访问
33 
34  *
35  *
36  *
37  */
38 public class MemberAccess {
39 
40   // 具有public访问权限的成员变量
41   public double publicValue;
42 
43   // 具有受保护的访问权限的成员变量
44   protected boolean protectedValue;
45 
46   // 具有默认访问权限的成员变量
47   int defaultValue;
48 
49   // 具有私有访问权限的成员变量
50   private byte privateValue;
51 
52 
53   /*
54         在定义成员的类体中,不同访问权限的陈成员,能否被访问到
55    */
56   public void testAccess() {
57     // 测试
58 
59     //public
60     System.out.println(this.publicValue);
61 
62     //protected
63     System.out.println(this.protectedValue);
64 
65     //默认访问权限
66     System.out.println(this.defaultValue);
67 
68     //private访问权限
69     System.out.println(this.privateValue);
70 
71     MemberAccess memberAccess = new MemberAccess();
72     System.out.println(memberAccess.publicValue);
73     System.out.println(memberAccess.protectedValue);
74     System.out.println(memberAccess.defaultValue);
75     // 私有成员变量
76     System.out.println(memberAccess.privateValue);
77 
78   }
79 
80   // protected
81   protected void protectedMethod() {}
82 
83   // 默认访问权限
84   void defaultMethod() {}
85 
86   // 私有访问权限
87   private void privateMethod() {}
88 
89 
90 }
 1 package com.cskaoyan.object02.access.onepackage.member;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  */
 7 public class TestMemberAccess {
 8 
 9   public static void main(String[] args) {
10 
11     // 在同包中的其他类中,访问其他类中定义的不同访问权限的成员
12     MemberAccess memberAccess = new MemberAccess();
13 
14     //public  可以访问
15     System.out.println(memberAccess.publicValue);
16 
17     //protected 可以访问
18     System.out.println(memberAccess.protectedValue);
19 
20     //默认访问权限 可以访问
21     System.out.println(memberAccess.defaultValue);
22 
23     //private 私有访问权限  访问不到
24     //System.out.println(memberAccess.privateValue);
25 
26   }
27 
28 }

2. 对类的访问控制

能够修饰类的访问权限修饰符只有2种:

  • public 对其他任意类可见
  • default:对同包中的其他类可见
 1 package com.cskaoyan.object02.access.onepackage.classes;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  *  类的访问权限:
 8  *    1. 只有两种,public 和 默认访问权限
 9  *
10  *  具有public权限的类所具有的访问特征:
11  *     在任何其他地方都可以访问到这个类(同一个module下),比如:同包中的其他类,以及非同包的其他类
12  *
13  *  具有默认访问权限的类所具有的访问特征:
14  *    同包中的其他类,可以访问,非同包的类访问不了
15  *
16  */
17 public class Demo1 {
18 
19   public static void main(String[] args) {
20 
21     //当我们创建对象的时候,就会需要使用类定义信息来创建对象,此时会访问类
22     //DefaultClass defaultClass = new DefaultClass();
23 
24   }
25 
26 }
27 
28 // protected 不能用来修饰类
29 //protected class protectedClass{}
30 
31 // 具有默认访问权限的类
32 class DefaultClass {}
33 
34 //private  不能用来修饰类
35 //private class PrivateClass {}
 1 package com.cskaoyan.object02.access.onepackage.classes;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  */
 7 public class TestClassAccess {
 8 
 9   public static void main(String[] args) {
10 
11     // public修饰的类
12     Demo1 demo1 = new Demo1();
13 
14 
15     //访问默认访问权限的类
16     DefaultClass defaultClass = new DefaultClass();
17   }
18 
19 }
 1 package com.cskaoyan.object02.access.otherpackage;
 2 
 3 import com.cskaoyan.object02.access.onepackage.classes.Demo1;
 4 
 5 /**
 6  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 7  * @version 1.0
 8  */
 9 public class TestClassAccess {
10 
11   public static void main(String[] args) {
12     // 访问public修饰的的类
13     Demo1 demo1 = new Demo1();
14 
15     // 访问默认访问权限的类, 其他包中访问不到
16     // DefaultClass defaultClass = new DefaultClass();
17   }
18 
19 }
 1 package com.cskaoyan.object02.access.otherpackage;
 2 
 3 import com.cskaoyan.object02.access.onepackage.member.MemberAccess;
 4 
 5 /**
 6  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 7  * @version 1.0
 8  */
 9 public class TestMemberAccess {
10 
11   public static void main(String[] args) {
12     // 在同包中的其他类中,访问其他类中定义的不同访问权限的成员
13     MemberAccess memberAccess = new MemberAccess();
14 
15     //public  可以访问
16     System.out.println(memberAccess.publicValue);
17 
18     //protected
19     //System.out.println(memberAccess.protectedValue);
20 
21     //默认访问权限 不可以访问
22     //System.out.println(memberAccess.defaultValue);
23 
24     //private 私有访问权限  访问不到
25     //System.out.println(memberAccess.privateValue);
26   }
27 
28 }

为什么要使用访问控制修饰符?

  • 使用户不要触碰他们“不该”触碰的代码(private)
  • 类库设计者可以安全的修改实现细节

2.面向对象3大特征之封装(encapsulate)

封装是一种信息隐藏技术。

  • 是指将数据和基于数据的操作封装在一起
  • 数据被保护在内部
  • 系统的其他部分只有通过在数据外面的被授权的操作才能够进行交互
  • 目的在于将类使用者class user和类设计者class creator分开。

在面向对象的编程中,用类来封装相关的数据和方法,保证了数据的安全和系统的严密性。

  1 package com.cskaoyan.object02.encapsulate;
  2 
  3 /**
  4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
  5  * @version 1.0
  6  *
  7  *
  8  * 针对private成员变量,专门定义public的方法,让外部能够访问私有成员变量的值
  9  *  get:让外部读取到私有成员变量值
 10  *  set:让外部通过该方法,修改私有成员变量的值
 11  *
 12  *  同时,为了清楚的表名get和set分别获取和改变的 是 哪个成员变量的值
 13  *  常规命名规则:
 14  *  xxx
 15  *  getXxx()
 16  *  setXxx(修改目标值参数)
 17  *
 18  *  注意:
 19  *    提供get,set方法的好处:
 20  *    1. 可以满足,某些场景下,需要访问私有成员变量值的需求
 21  *    2. 通过定义get和set方法,来实现了对私有成员变量的读写分离
 22  *    3. 因为,一旦一个成员变量,一旦被private修饰,别人就无法直接 对象名.访问
 23  *       只能通过,set(),此时我们在set方法中,就可以自己通过代码控制,别人的修改
 24  *
 25  *
 26  *   类
 27       成员变量(一定要考虑访问权限)
 28       构造方法
 29         无参构造方法
 30         带参构造方法
 31       成员方法
 32         getXxx()
 33         setXxx()
 34 
 35     给成员变量赋值的方式
 36           1.无参构造方法 + setXxx()
 37           2. 带参构造方法
 38 
 39 
 40  *
 41  *
 42  */
 43 public class Demo1 {
 44 
 45   public static void main(String[] args) {
 46     Student student = new Student("张三", 18, false, 1);
 47 
 48     // 一旦类中成员,被private,该成员变量的值,就不能被别人轻易的访问到了
 49     //System.out.println(student.name);
 50 
 51     // 比如说,教务处的老师,这类特殊的存在,应该有权限能访问到学生的私有信息
 52     student.setName("");
 53     System.out.println(student.getName());
 54 
 55   }
 56 
 57 }
 58 
 59 
 60 class Student {
 61 
 62   private String name;
 63 
 64   private int age;
 65 
 66   private boolean isMale;
 67 
 68   private int sno;
 69 
 70   public Student(String name, int age, boolean isMale, int sno) {
 71     this.name = name;
 72     this.age = age;
 73     this.isMale = isMale;
 74     this.sno = sno;
 75   }
 76 
 77   /*
 78         专门用来给外部,返回私有成员变量name的值
 79      */
 80   public String getName() {
 81     return this.name;
 82   }
 83 
 84   /*
 85       专门用让外部,可以修改私有成员变量name的值
 86    */
 87   public void setName(String name) {
 88     // 自己可以根据需要做一些检查
 89     if (name == null || name.equals("")) {
 90       return;
 91     }
 92 
 93     this.name = name;
 94   }
 95 
 96   public int getAge() {
 97     return age;
 98   }
 99 
100   public void setAge(int age) {
101     this.age = age;
102   }
103 
104   public boolean isMale() {
105     return isMale;
106   }
107 
108   public void setMale(boolean male) {
109     isMale = male;
110   }
111 
112   public int getSno() {
113     return sno;
114   }
115 
116   public void setSno(int sno) {
117     this.sno = sno;
118   }
119 }

3.面向对象3大特征之继承(extend)

引例

根据我们刚刚学过的知识,完成如下练习:

  • 分别定义一个表示人和学生的类
  • 表示人的类有姓名属性,以及吃饭,睡觉的行为
  • 表示学生的类有姓名,学号两个属性,同时有吃饭,睡觉,学习3种行为

版本1,直接写:

 1 package com.cskaoyan.object02.extend.introduction.edition1;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  * 根据我们刚刚学过的知识,完成如下练习:
 8     分别定义一个表示人和学生的类
 9     表示人的类有姓名属性,以及吃饭,睡觉的行为
10     表示学生的类有姓名,学号两个属性,同时有吃饭,睡觉,学习3种行为
11 
12  */
13 public class Demo {
14 
15 }
16 
17 class Person {
18 
19   String name;
20 
21   public void eat() {
22     System.out.println(name + "eating");
23   }
24 
25   public void sleep() {
26     System.out.println(name + "sleeping");
27   }
28 }
29 
30 class Student {
31 
32   String name;
33 
34   //学号
35   int sno;
36 
37   public void eat() {
38     System.out.println(name + "eating");
39   }
40 
41   public void sleep() {
42     System.out.println(name + "sleeping");
43   }
44 
45   public void study() {
46     System.out.println(name + "studying");
47   }
48 }
49 
50 class Teacher {
51 
52 
53 }

版本2,用继承:

 1 package com.cskaoyan.object02.extend.introduction.edition2;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  * 根据我们刚刚学过的知识,完成如下练习:
 8       分别定义一个表示人和学生的类
 9       表示人的类有姓名属性,以及吃饭,睡觉的行为
10       表示学生的类有姓名,学号两个属性,同时有吃饭,睡觉,学习3种行为
11  */
12 public class Demo1 {
13 
14   public static void main(String[] args) {
15     Student student = new Student();
16     System.out.println(student.name);
17     student.eat();
18     student.sleep();
19   }
20 
21 }
22 
23 class Person {
24 
25   String name;
26 
27   public void eat() {
28     System.out.println(name + "eating");
29   }
30 
31   public void sleep() {
32     System.out.println(name + "sleeping");
33   }
34 }
35 
36 //我们使用继承的方式,复用已有的类定义代码,即继承Person类中定义的成员
37 class Student extends Person {
38 
39   //学号
40   int sno;
41 
42   public void study() {
43     System.out.println(name + "studying");
44   }
45 }

继承概述

 1 package com.cskaoyan.object02.extend.basic;
 2 
 3 /**
 4  * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/16.
 5  * @version 1.0
 6  *
 7  * 继承概述
 8         Java中的继承 和 我们现实生活中的“继承”的含义基本类似,但是含义更广。
 9         1. 简单来说都可以表示“不劳而获”(类似于现实世界中继承的含义)
10         2. 类型之间 “ is a” 的关系    一种类型(类) 继承 另外一种类型(类)
11 
12         被继承的类称之为父类(基类或超类),继承其他类的类称之为子类(派生类,导出类)
13         子类可以通过继承机制,不写任何额外代码就可以拥有父类的“所有”成员。
14  */
15 public class Demo1 {
16 
17 }
18 
19 // 父类(基类,超类)
20 class Father {}
21 // 继承其他类的类称之为子类(派生类,导出类)
22 class Son extends Father{}

4.面向对象3大特征之多态

原文地址:https://www.cnblogs.com/dust2017/p/12731253.html