JavaSE学习总结第10天_面向对象5

10.01 运动员和教练案例分析

教练和运动员案例:运动员分乒乓球运动员和篮球运动员,教练分乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语。

分析:

10.02 运动员和教练案例实现

复制代码
  1 //定义一个说英语的接口
  2 interface SpeakEnglish 
  3 {
  4     //说英语
  5     public abstract void speak();
  6 }
  7 
  8 //定义人的抽象类
  9 abstract class Person 
 10 {
 11     private String name;
 12     private int age;
 13     
 14     public Person() {}
 15     
 16     public Person(String name,int age) 
 17     {
 18         this.name = name;
 19         this.age = age;
 20     }
 21     
 22     public String getName() 
 23     {
 24         return name;
 25     }
 26     
 27     public void setName(String name) 
 28     {
 29         this.name = name;
 30     }
 31     
 32     public int getAge() 
 33     {
 34         return age;
 35     }
 36     
 37     public void setAge(int age) 
 38     {
 39         this.age = age;
 40     }
 41     
 42     //睡觉
 43     public void sleep() 
 44     {
 45         System.out.println("人都是要睡觉的");
 46     }
 47     
 48     //吃饭
 49     public abstract void eat();
 50 }
 51 
 52 //定义运动员抽象类
 53 abstract class Player extends Person 
 54 {
 55     public Player() {}
 56     
 57     public Player(String name,int age) 
 58     {
 59         super(name,age);
 60     }
 61     
 62     //学习
 63     public abstract void study();
 64 }
 65 
 66 //定义教练抽象类
 67 abstract class Coach extends Person 
 68 {
 69     public Coach() {}
 70     
 71     public Coach(String name,int age) 
 72     {
 73         super(name,age);
 74     }
 75     
 76     //教学
 77     public abstract void teach();
 78 }
 79 
 80 //定义乒乓球运动员具体类
 81 class PingPangPlayer extends Player implements SpeakEnglish 
 82 {
 83     public PingPangPlayer(){}
 84     
 85     public PingPangPlayer(String name,int age) 
 86     {
 87         super(name,age);
 88     }
 89     
 90     //吃
 91     public void eat() 
 92     {
 93         System.out.println("乒乓球运动员吃大白菜,喝小米粥");
 94     }
 95     
 96     //学习
 97     public void study() 
 98     {
 99         System.out.println("乒乓球运动员学习如何发球和接球");
100     }
101     
102     //说英语
103     public void speak() 
104     {
105         System.out.println("乒乓球运动员说英语");
106     }
107 }
108 
109 //定义篮球运动员具体类
110 class BasketballPlayer extends Player 
111 {
112     public BasketballPlayer(){}
113     
114     public BasketballPlayer(String name,int age) 
115     {
116         super(name,age);
117     }
118     
119     //吃
120     public void eat() 
121     {
122         System.out.println("篮球运动员吃牛肉,喝牛奶");
123     }
124     
125     //学习
126     public void study() 
127     {
128         System.out.println("篮球运动员学习如何运球和投篮");
129     }
130 }
131 
132 //定义乒乓球教练具体类
133 class PingPangCoach extends Coach implements SpeakEnglish 
134 {
135     public PingPangCoach(){}
136     
137     public PingPangCoach(String name,int age) 
138     {
139         super(name,age);
140     }
141     
142     //吃
143     public void eat() 
144     {
145         System.out.println("乒乓球教练吃小白菜,喝大米粥");
146     }
147     
148     //教
149     public void teach() 
150     {
151         System.out.println("乒乓球教练教如何发球和接球");
152     }
153     
154     //说英语
155     public void speak() 
156     {
157         System.out.println("乒乓球教练说英语");
158     }
159 }
160 
161 //定义篮球教练具体类
162 class BasketballCoach extends Coach 
163 {
164     public BasketballCoach(){}
165     
166     public BasketballCoach(String name,int age) 
167     {
168         super(name,age);
169     }
170     
171     //吃
172     public void eat() 
173     {
174         System.out.println("篮球教练吃羊肉,喝羊奶");
175     }
176     
177     //教
178     public void teach() 
179     {
180         System.out.println("篮球教练教如何运球和投篮");
181     }
182 }
复制代码

10.03 运动员和教练案例测试

复制代码
  1 //定义一个说英语的接口
  2 interface SpeakEnglish 
  3 {
  4     //说英语
  5     public abstract void speak();
  6 }
  7 
  8 //定义人的抽象类
  9 abstract class Person 
 10 {
 11     private String name;
 12     private int age;
 13     
 14     public Person() {}
 15     
 16     public Person(String name,int age) 
 17     {
 18         this.name = name;
 19         this.age = age;
 20     }
 21     
 22     public String getName() 
 23     {
 24         return name;
 25     }
 26     
 27     public void setName(String name) 
 28     {
 29         this.name = name;
 30     }
 31     
 32     public int getAge() 
 33     {
 34         return age;
 35     }
 36     
 37     public void setAge(int age) 
 38     {
 39         this.age = age;
 40     }
 41     
 42     //睡觉
 43     public void sleep() 
 44     {
 45         System.out.println("人都是要睡觉的");
 46     }
 47     
 48     //吃饭
 49     public abstract void eat();
 50 }
 51 
 52 //定义运动员抽象类
 53 abstract class Player extends Person 
 54 {
 55     public Player() {}
 56     
 57     public Player(String name,int age) 
 58     {
 59         super(name,age);
 60     }
 61     
 62     //学习
 63     public abstract void study();
 64 }
 65 
 66 //定义教练抽象类
 67 abstract class Coach extends Person 
 68 {
 69     public Coach() {}
 70     
 71     public Coach(String name,int age) 
 72     {
 73         super(name,age);
 74     }
 75     
 76     //教学
 77     public abstract void teach();
 78 }
 79 
 80 //定义乒乓球运动员具体类
 81 class PingPangPlayer extends Player implements SpeakEnglish 
 82 {
 83     public PingPangPlayer(){}
 84     
 85     public PingPangPlayer(String name,int age) 
 86     {
 87         super(name,age);
 88     }
 89     
 90     //吃
 91     public void eat() 
 92     {
 93         System.out.println("乒乓球运动员吃大白菜,喝小米粥");
 94     }
 95     
 96     //学习
 97     public void study() 
 98     {
 99         System.out.println("乒乓球运动员学习如何发球和接球");
100     }
101     
102     //说英语
103     public void speak() 
104     {
105         System.out.println("乒乓球运动员说英语");
106     }
107 }
108 
109 //定义篮球运动员具体类
110 class BasketballPlayer extends Player 
111 {
112     public BasketballPlayer(){}
113     
114     public BasketballPlayer(String name,int age) 
115     {
116         super(name,age);
117     }
118     
119     //吃
120     public void eat() 
121     {
122         System.out.println("篮球运动员吃牛肉,喝牛奶");
123     }
124     
125     //学习
126     public void study() 
127     {
128         System.out.println("篮球运动员学习如何运球和投篮");
129     }
130 }
131 
132 //定义乒乓球教练具体类
133 class PingPangCoach extends Coach implements SpeakEnglish 
134 {
135     public PingPangCoach(){}
136     
137     public PingPangCoach(String name,int age) 
138     {
139         super(name,age);
140     }
141     
142     //吃
143     public void eat() 
144     {
145         System.out.println("乒乓球教练吃小白菜,喝大米粥");
146     }
147     
148     //教
149     public void teach() 
150     {
151         System.out.println("乒乓球教练教如何发球和接球");
152     }
153     
154     //说英语
155     public void speak() 
156     {
157         System.out.println("乒乓球教练说英语");
158     }
159 }
160 
161 //定义篮球教练具体类
162 class BasketballCoach extends Coach 
163 {
164     public BasketballCoach(){}
165     
166     public BasketballCoach(String name,int age) 
167     {
168         super(name,age);
169     }
170     
171     //吃
172     public void eat() 
173     {
174         System.out.println("篮球教练吃羊肉,喝羊奶");
175     }
176     
177     //教
178     public void teach() 
179     {
180         System.out.println("篮球教练教如何运球和投篮");
181     }
182 }
183 class Demo
184 {
185     public static void main(String[] args)
186     {
187         //测试运动员(乒乓球运动员和篮球运动员)
188         //乒乓球运动员
189         PingPangPlayer ppp = new PingPangPlayer();
190         ppp.setName("王浩");
191         ppp.setAge(33);
192         System.out.println(ppp.getName()+"---"+ppp.getAge());
193         ppp.eat();
194         ppp.sleep();
195         ppp.study();
196         ppp.speak();
197         System.out.println("----------------");
198         
199         //篮球运动员
200         BasketballPlayer bp = new BasketballPlayer();
201         bp.setName("姚明");
202         bp.setAge(34);
203         System.out.println(bp.getName()+"---"+bp.getAge());
204         bp.eat();
205         bp.sleep();
206         bp.study();
207         //bp.speak(); //没有该方法
208     }
209 }
复制代码

运行结果:

复制代码
王浩---33
乒乓球运动员吃大白菜,喝小米粥
人都是要睡觉的
乒乓球运动员学习如何发球和接球
乒乓球运动员说英语
----------------
姚明---34
篮球运动员吃牛肉,喝牛奶
人都是要睡觉的
篮球运动员学习如何运球和投篮
复制代码

10.04 类名作为形式参数

形式参数和返回值问题

形式参数:基本类型、引用类型(类、抽象类、接口)

返回值类型:基本类型、引用类型(类、抽象类、接口)

例:

复制代码
 1 class Student
 2 {
 3     public void study()
 4     {
 5         System.out.println("好好学习");
 6     }
 7 }
 8 class StudentTest
 9 {
10     //形式参数是一个类
11     public void method(Student s)
12     {
13         s.study();
14     }
15 }
16 class Demo
17 {
18     public static void main(String[] args)
19     {
20         StudentTest st = new StudentTest();
21         Student s = new Student();
22 //需要的是该类的对象
23         st.method(s);
24     }
25 }
复制代码

运行结果:

好好学习

10.05 抽象类名作为形式参数

例:

复制代码
 1 abstract class Person
 2 {
 3     public abstract void study();
 4 }
 5 
 6 class Student extends Person
 7 {
 8     public void study()
 9     {
10         System.out.println("好好学习");
11     }
12 }
13 class PersonTest
14 {
15     //形式参数是一个抽象类
16     public void method(Person p)
17     {
18         p.study();
19     }
20 }
21 class Demo
22 {
23     public static void main(String[] args)
24     {
25         PersonTest pt = new PersonTest();
26         Person p = new Student();
27         //需要该抽象类的子类对象
28         pt.method(p);
29     }
30 }
复制代码

运行结果:

好好学习

10.06 接口名作为形式参数

例:

复制代码
 1 interface Love
 2 {
 3     public abstract void love();
 4 }
 5 class Teacher implements Love
 6 {
 7     public void love()
 8     {
 9         System.out.println("老师爱学生");
10     }
11 }
12 class LoveTest
13 {
14     //形式参数是一个接口
15     public void method(Love l)
16     {
17         l.love();
18     }
19 }
20 class Demo
21 {
22     public static void main(String[] args)
23     {
24         LoveTest lt = new LoveTest();
25         Love l = new Teacher();
26         //需要该接口的实现类对象
27         lt.method(l);
28     }
29 }
复制代码

运行结果:

老师爱学生

10.07 类名作为返回值类型

例:

复制代码
 1 class Student
 2 {
 3     public void study()
 4     {
 5         System.out.println("好好学习");
 6     }
 7 }
 8 class StudentTest
 9 {
10     //返回值是一个类
11     public Student getStudent()
12     {
13         //真实返回的是该类的对象
14         return new Student();
15     }
16 }
17 class Demo
18 {
19     public static void main(String[] args)
20     {
21         StudentTest st = new StudentTest();
22         Student s = st.getStudent();
23         s.study();
24     }
25 }
复制代码

10.08 抽象类名作为返回值类型

例:

复制代码
 1 abstract class Person
 2 {
 3     public abstract void study();
 4 }
 5 class Student extends Person
 6 {
 7     public void study()
 8     {
 9         System.out.println("好好学习");
10     }
11 }
12 class PersonTest
13 {
14     //返回值是一个抽象类
15     public Person getPerson()
16     {
17         //真实返回的是抽象类的子类对象
18         return new Student();
19     }
20 }
21 class Demo
22 {
23     public static void main(String[] args)
24     {
25         PersonTest pt = new PersonTest();
26         Person p = pt.getPerson();
27         p.study();
28     }
29 }
复制代码

10.09 接口名作为返回值类型

例:

复制代码
 1 interface Love
 2 {
 3     public abstract void love();
 4 }
 5 class Teacher implements Love
 6 {
 7     public void love()
 8     {
 9         System.out.println("老师爱学生");
10     }
11 }
12 class LoveTest
13 {
14     //返回值是一个接口
15     public Love getLove()
16     {
17         //真实返回的是该接口的实现类对象
18         return new Teacher();
19     }
20 }
21 class Demo
22 {
23     public static void main(String[] args)
24     {
25         LoveTest lt = new LoveTest();
26         Love l = lt.getLove();
27         l.love();
28     }
29 }
复制代码

10.10 链式编程

例:

复制代码
 1 class Student
 2 {
 3     public void study()
 4     {
 5         System.out.println("好好学习");
 6     }
 7 }
 8 class StudentTest
 9 {
10     public Student getStudent()
11     {
12         return new Student();
13     }
14 }
15 class Demo
16 {
17     public static void main(String[] args)
18     {
19         //链式编程,每次调用方法完毕后返回的是一个对象
20         new StudentTest().getStudent().study();
21     }
22 }
复制代码

10.11 package关键字的概述及作用

包的概述:其实就是文件夹

作用:对类进行分类管理

包的划分:

例:学生的增加,删除,修改,查询和老师的增加,删除,修改,查询

基本的划分:

按照功能分

cn.itcast.add(AddStudent,AddTeacher)

cn.itcast.delete(DeleteStudent,DeleteTeacher)

cn.itcast.update(UpdateStudent,UpdateTeacher)

cn.itcast.find(FindStudent,FindTeacher)       

按照模块分

cn.itcast.teacher(AddTeacher,DeleteTeacher,UpdateTeacher,FindTeacher)

cn.itcast.student(AddStudent,DeleteStudent,UpdateStudent,FindStudent)           

10.12 包的定义及注意事项

定义包的格式:package 包名; 多级包用.分开即可

注意事项:

1.package语句必须是程序的第一条可执行的代码

2.package语句在一个java文件中只能有一个

3.如果没有package,默认表示无包名

10.13 带包的类编译和运行

手动式

1:javac编译当前类文件

2:手动建立包对应的文件夹

3:把1步骤的class文件放到2步骤的最终文件夹下

4:通过java命令执行。

注意:需要带包名称执行

例:

复制代码
1 package cn.itcast;
2 class Demo
3 {
4     public static void main(String[] args)
5     {
6         System.out.println("hello world");
7     }
8 }
复制代码

运行:

自动式

1:javac编译的时候带上-d即可

例:javac -d . HelloWorld.java (-d后面跟的是目录, .表示当前目录)

2:通过java命令执行。需要带包名称执行。

10.14 不同包下类之间的访问

例:

定义两个类:Demo,Test。

Demo:测试方法(main)

Test:求和方法(sum)

运行步骤如下:

 

10.15 import关键字的概述和使用

导包概述:不同包下的类之间的访问,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦。这个时候,java就提供了导包的功能。

导包格式:import 包名;

注意:这种方式导入是到类的名称。虽然可以最后写*,但是不建议。使用哪个类就导入哪个类。

例:

面试题:package,import,class有没有顺序关系?

有,package>import>class

package:只能有一个

import:可以有多个

class:可以有多个,建议只写一个

10.16 四种权限修饰符

10.17 类及其组成所使用的常见修饰符

权限修饰符:public、protected、默认的、private

状态修饰符:static、final

抽象修饰符:abstract

 

1.类:默认,public、final、abstract。其中使用public居多

2.成员变量:四种权限修饰符均可,final、static。其中使用private居多

3.构造方法:四种权限修饰符均可,其他不可以。其中使用public居多

4.成员方法:四种权限修饰符均可,fianl、static、abstract。其中使用public居多

 

10.18 内部类概述和访问特点

把类定义在其他类的内部,这个类就被称为内部类。

例:在类A中定义了一个类B,类B就是内部类。

内部类的访问特点:

内部类可以直接访问外部类的成员,包括私有。

外部类要访问内部类的成员,必须创建对象。

例:

复制代码
 1 class Outer
 2 {
 3     private int num = 10;
 4 //内部类
 5     class Inner
 6     {
 7         public void show()
 8         {
 9             //内部类可以直接访问外部类的成员,包括私有
10             System.out.println("show run..."+num);
11         }
12     }
13     public void method()
14     {
15         //外部类要访问内部类的方法必须创建内部类的对象
16         Inner in = new Inner();
17         in.show();
18     }
19 }
复制代码

10.19 内部类分类及成员内部类的使用

按照内部类在类中定义的位置不同,可以分为如下两种格式:

在成员位置称为成员内部类

在局部位置称为局部内部类

例:

复制代码
 1 class Outer
 2 {
 3     //成员内部类
 4     class Inner
 5     {
 6     }
 7     public void method()
 8     {
 9         //局部内部类
10         class Inner
11         {
12         }
13     }
14 }
复制代码

外界创建成员内部类对象的格式:

外部类名.内部类名对象名 = 外部类对象.内部类对象;

例:

复制代码
 1 class Outer
 2 {
 3     private int num = 10;
 4     //成员内部类
 5     class Inner
 6     {
 7         public void show()
 8         {
 9             System.out.println(num);
10         }
11     }
12 }
13 class Demo
14 {
15     public static void main(String[] args)
16     {
17         //访问Inner类的show()方法
18      //外部类名.内部类名 对象名 = 外部类对象.内部类对象;
19         Outer.Inner oi = new Outer().new Inner();
20         oi.show();
21     }
22 }
复制代码

10.20 成员内部类的常见修饰符及应用

成员内部类的常见修饰符

1.private 为了保证数据的安全性

例:

复制代码
 1 class Outer
 2 {
 3     //成员内部类,私有
 4     private class Inner
 5     {
 6         public void show()
 7         {
 8             System.out.println("满足条件输出");
 9         }
10     }
11     public void method(int num)
12     {
13         if(num > 0)
14         {
15             Inner i = new Inner();
16             i.show();
17         }
18     }
19 }
20 class Demo
21 {
22     public static void main(String[] args)
23     {
24         Outer o = new Outer();
25         o.method(-8);
26     }
27 }
复制代码

上例中,只有当method方法传入的参数大于0时,才可以创建内部类的对象调用方法,否则不创建

2.static 为了让数据访问更方便

  • 被静态修饰的成员内部类只能访问外部类的静态成员
  • 内部类被静态修饰后的方法可以有静态方法也可以有非静态方法

例:

复制代码
 1 class Outer
 2 {
 3     private static int num = 10;
 4     //成员内部类,静态
 5     public static class Inner
 6     {
 7         //静态方法
 8         public static void show1()
 9         {
10             System.out.println(num);
11         }
12         //非静态方法
13         public void show2()
14         {
15             System.out.println(num);
16         }
17     }
18 }
19 class Demo
20 {
21     public static void main(String[] args)
22     {
23         //成员内部类被静态修饰后的访问方式:
24         //外部类名.内部类名 对象名 = new 外部类名.内部类名();
25         Outer.Inner oi = new Outer.Inner();
26         oi.show1();
27         oi.show2();
28 
29         //静态方法show1()的另一种调用方式
30         Outer.Inner.show1();
31     }
32 }
复制代码

10.21 成员内部类的面试题

分别输出30、20、10

复制代码
 1 class Outer
 2 {
 3     public int num = 10;
 4     class Inner
 5     {
 6         public int num = 20;
 7         public void show()
 8         {
 9             int num = 30;
10             System.out.println(num);//30
11             System.out.println(this.num);//20
12             System.out.println(new Outer().num);//10
13             System.out.println(Outer.this.num);//10
14         }
15     }
16 }
17 class Demo
18 {
19     public static void main(String[] args)
20     {
21         Outer.Inner oi = new Outer().new Inner();
22         oi.show();
23     }
24 }
复制代码

10.22 局部内部类访问局部变量的问题

1.可以直接访问外部类的成员

2.在局部位置可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

例:

复制代码
 1 class Outer
 2 {
 3     private int num = 10;
 4     public void method()
 5     {
 6         //局部内部类
 7         class Inner
 8         {
 9             public void show()
10             {
11                 //可以直接访问外部类的成员
12                 System.out.println(num);
13             }
14         }
15         //在局部位置创建内部类对象
16         Inner i = new Inner();
17         //通过对象调用内部类方法
18         i.show();
19     }
20 }
21 class Demo
22 {
23     public static void main(String[] args)
24     {
25         Outer o = new Outer();
26         o.method();
27     }
28 }
复制代码

局部内部类访问局部变量的注意事项:

例:

复制代码
 1 class Outer
 2 {
 3     public void method()
 4     {
 5         //局部变量
 6         final int num = 20;
 7         //局部内部类
 8         class Inner
 9         {
10             public void show()
11             {
12                 //局部内部类访问局部变量,该局部变量必须被声明为最终类型
13                 System.out.println(num);
14             }
15         }
16 
17         Inner i = new Inner();
18         i.show();
19     }
20 }
21 class Demo
22 {
23     public static void main(String[] args)
24     {
25         Outer o = new Outer();
26         o.method();
27     }
28 }
复制代码

因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。

10.23 匿名内部类的格式和理解

匿名内部类就是内部类的简化写法。

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类。

格式:new 类名或者接口名() {重写方法;}

本质:是一个继承了该类或者实现了该接口的子类匿名对象

例:

10.24 匿名内部类的方法调用

例:

复制代码
 1 interface Inter
 2 {
 3     public abstract void show1();
 4     public abstract void show2();
 5 }
 6 class Outer
 7 {
 8     public void method()
 9     {
10         /* 一个方法的调用
11         new Inter()
12         {
13             public void show1()
14             {
15                 System.out.println("show1");
16             }
17         }.show1();
18         */
19         //两个方法的调用
20         Inter i = new Inter()
21         {
22             public void show1()
23             {
24                 System.out.println("show1");
25             }
26             public void show2()
27             {
28                 System.out.println("show2");
29             }
30         };
31         i.show1();
32         i.show2();
33     }
34 }
35 class Demo
36 {
37     public static void main(String[] args)
38     {
39         Outer o = new Outer();
40         o.method();
41     }
42 }
复制代码

10.25 匿名内部类在开发中的应用

例:

复制代码
 1 interface Person
 2 {
 3     public abstract void study();
 4 }
 5 class PersonDemo
 6 {
 7     public void method(Person p)
 8     {
 9         p.study();
10     }
11 }
12 class Demo
13 {
14     public static void main(String[] args)
15     {
16         PersonDemo pd = new PersonDemo();
17         pd.method(new Person()
18         {
19             public void study()
20             {
21                 System.out.println("好好学习");
22             }
23         });
24     }
25 }
复制代码

当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递

10.26 匿名内部类的面试题

按照要求,补齐代码,要求在控制台输出”HelloWorld”

复制代码
 1 interface Inter 
 2 { 
 3     void show(); 
 4 }
 5 class Outer 
 6 { 
 7     //补齐代码 
 8 }
 9 class Demo
10 {
11     public static void main(String[] args)
12     {
13         Outer.method().show();
14     }
15 }
复制代码

补齐代码:

复制代码
 1 /*
 2 分析:
 3 1:Outer.method()可以看出method()是Outer中的一个静态方法
 4 2:Outer.method().show()可以看出method()方法的返回值是一个对象。
 5 又由于接口Inter中有一个show()方法,所以method()方法的返回值类型是一个接口。
 6 */
 7 interface Inter 
 8 { 
 9     void show(); 
10 }
11 class Outer 
12 { 
13     //补齐代码 
14     public static Inter method()
15     {
16         return new Inter()
17         {
18             public void show()
19             {
20                 System.out.println("helloworld");
21             }
22         };
23     }
24 }
25 class Demo
26 {
27     public static void main(String[] args)
28     {
29         Outer.method().show();
30     }
31 }
原文地址:https://www.cnblogs.com/hoop-superman/p/5495697.html