继承、接口、抽象方法

  1 Runtime类
  2 
  3 public class Demo3 {
  4     public static void main(String[] args) {
  5         //Runtime:运行时
  6         //每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
  7         //可以通过 getRuntime 方法获取当前运行时。 
  8 
  9         //应用程序不能创建自己的 Runtime 类实例。
 10 
 11         //获取运行时对象
 12         Runtime runtime = Runtime.getRuntime();
 13         //获取的单位是字节
 14         System.out.println(runtime.totalMemory()/1024./1024);//我们使用的总内容量
 15         System.out.println(runtime.maxMemory()/1024./1024);//可以使用的最大内存量
 16         System.out.println(runtime.freeMemory()/1024./1024);//当前空余的内存量
 17     }
 18 }
 19 
 20 final关键字
 21 package com.qianfeng.test;
 22 
 23 public class Demo4 {
 24     /*
 25      * final:最终的,不可改变的.
 26      * 可以修饰的内容:
 27      * 1.类:不能有子类
 28      * 2.成员方法:不能重写
 29      * 3.成员变量:他的值是不能变了,成员变量必须先给一个值,并且值不能再改变
 30      * 4.局部变量:他的值是不能变了,变成一个定值.
 31      */
 32 }
 33 
 34  class FuTest{
 35     final int age = 10;//final修饰的成员变量必须先给一个值,并且值不能再改变
 36     public  void test(){
 37         //age = 12;
 38         final int height;
 39         height = 3;
 40         //height = 4;//当给定一个值之后,不能再改变值.
 41     }
 42 }
 43 
 44 class ZiTest extends FuTest{
 45     //final修饰的成员变量不能重写
 46 //    public void test() {
 47 //        // TODO Auto-generated method stub
 48 //        super.test();
 49 //    }
 50 }
 51 
 52 
 53 
 54 public class Demo5 {
 55     //求圆的面积
 56     public static void main(String[] args) {
 57         Circle circle = new Circle(2);
 58         double area = circle.getArea();
 59         System.out.println(area);
 60     }
 61 }
 62 class Circle{
 63     double r;
 64     final double PI = 3.14;//定值--符号常量
 65     
 66     public Circle(double r) {
 67         super();
 68         this.r = r;
 69     }
 70 
 71     public double getArea(){
 72         return PI*r*r;
 73     }
 74 }
 75 
 76 //单例中的饿汉式
 77 class SingleInstance{
 78     private static final SingleInstance singleInstance =   new SingleInstance();
 79     private SingleInstance(){
 80         
 81     }
 82     public static SingleInstance getInstance() {
 83         return singleInstance;
 84     }
 85 }
 86 
 87 抽象类和方法
 88 
 89 
 90 public class Demo6 {
 91     public static void main(String[] args) {
 92         /*
 93          * 方法的声明:没有方法体的方法
 94          * 
 95          * abstract:抽象的
 96          * 可以修饰的内容:
 97          * 1.方法:抽象方法
 98          * 2.类:抽象类
 99          * 抽象类:在继承中,提取父类方法的时候,每个子类都有自己的具体实现方法,父类不能决定他们
100          * 各自的实现方法,父类就不管了.所以在父类中只写方法的声明,将方法的实现交给子类.在类中
101          * 只有方法声明的方法称为抽象方法,拥有抽象方法的类称为抽象类.
102          * 
103          * 注意点:
104          * 1.抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类.
105          * 2.继承了抽象类的子类一定要实现抽象方法,如果不实现就只能将自己也变成抽象的.
106          * 3.抽象类不能直接创建对象,必须通过子类实现,所以抽象类一定有子类
107          * 
108          * 比较普通类与抽象类:
109          * 1.普通类可以直接创建对象
110          * 2.抽象类可以有抽象方法
111          * 
112          * 不能与abstract同时存在的关键字
113          * 1.final:被final修饰的类不能有子类,方法不能重写,但是abstract必须有子类,必须重写
114          * 2.static:修饰的方法可以通过类名调用,abstract必须通过子类实现
115          * 3.private:修饰的方法不能重写,abstract必须重写
116          */
117         //抽象类不能直接创建对象
118         //Person person = new Person();
119     }
120 }
121 
122 //抽象类--拥有抽象方法的类一定是抽象类
123 abstract class Person{
124     String name;
125     //抽象方法---相当于指定了一个规则
126     public abstract void teach();
127 }
128 
129 //可以将子类变成抽象的,之后要想使用当前的类就必须再创建子类,因为抽象类不能直接创建对象.
130 class Teacher extends Person{
131     //重写--写抽象方法的实现
132     public void teach() {
133         
134         
135     }
136 }
137 
138 代码案例
139 
140 public class Demo7 {
141     public static void main(String[] args) {
142         /*
143          * 求圆和矩形的面积
144          */
145         //测试:
146     }
147 }
148 
149 abstract class Shape{
150     public abstract  double getArea();
151 }
152 
153 class Circle1 extends Shape{
154     double r;
155     final double  PI = 3.14;
156     
157     public Circle1(double r) {
158         super();
159         this.r = r;
160     }
161 
162     public double getArea() {
163         
164         return PI*r*r;
165     }
166 }
167 
168 class Rectangle extends Shape{
169     double height;
170     double width;
171     
172     public Rectangle(double height, double width) {
173         super();
174         this.height = height;
175         this.width = width;
176     }
177 
178     public double getArea() {
179         return height*width;
180     }
181 }
182 
183 接口
184 /*
185  * 接口:interface
186  * 构成:
187  * interface 接口名字{
188  *         接口的实现部分
189  *         (默认是public static final)成员变量;
190  *         (默认是public abstract)成员方法;
191  * }
192  * 
193  * 一般接口中不写成员变量,只写方法--只写规则---方法列表
194  * 
195  * 接口起作用的方式:让类去实现接口
196  * 类与类之间的关系--继承---extends
197  * 类与接口之间的关系---实现----implements
198  * 
199  * 问题一:接口与父类可以同时存在吗?
200  * 答:可以
201  * 
202  * 问题二:一个子类只能有一个父类,也只能有一个父接口吗?
203  * 答:不对,可以同时存在多个接口.
204  * 
205  * 问题三:父类与接口的功能如何分配?
206  * 答:一般父类中放的是主要功能,接口中放的是额外的功能.接口作为父类的补充
207  * 
208  * 问题四:接口可以直接创建对象吗?
209  * 答:不可以,因为接口默认是抽象的
210  * 
211  * 问题五:接口与接口之间可以有关系吗?如果有,是什么关系?
212  * 答:可以有,是多继承的关系.
213  * 
214  * 问题六:当一个类实现的接口中出现了相同的方法,子类中实现方法的时候会不会混淆?
215  * 答:不会,接口中的方法都是抽象的,要通过子类写具体的实现.我们在调用方法的时候,最终看的功能,而功能只有一份.
216  * 
217  * 接口功能总结:让java从单继承间接的实现了多继承.扩充了原来的功能.
218  * 
219  * 了解:
220  * 从jdk1.7之后,接口中可以有方法的实现,但是方法必须是被static或者default修饰的.
221  */
222 
223 interface Inter1{
224     int age = 3;//默认前面是public static final,所以成员变量必须先给一个值
225     public void play();//默认就是抽象的
226 }
227 
228 interface Inter2{
229     public void show();
230 }
231 
232 //接口Inter3同时继承了两个接口
233 interface Inter3 extends Inter1,Inter2{
234     
235 }
236 
237 //这里是继承了Object类,同时实现了两个接口,接口之间用,隔开
238 class Dog extends Object implements Inter1,Inter2{
239     
240     public void play() {
241 
242     }
243 
244     public void show() {
245         // TODO Auto-generated method stub
246         
247     }
248 }
249 
250 package com.qianfeng.test;
251 
252 public class Demo8interface {
253     //1.在jdk1.7的接口中可以写方法的实现,方法必须是default或static的
254     //2.接口还是不能直接创建对象,要通过子类
255     /*
256      * 接口的子类重写方法注意事项
257      * 如果一个类实现两个接口,这两个接口同时有相同的抽象方法,在类中只需要重写一次这个方法。 
258     如果接口中有default修饰的方法不需要重写。 
259     如果两个接口里的方法名相同都是default方法,里面的方法体不同,在类中需要重写该方法。 
260     如果两个接口中方法名,参数都相同的方法,一个接口是抽象方法,另一个是default修饰有方法体。这时该类也必须重写该方法。
261      */
262     public static void main(String[] args) {
263         //一个类有一个接口的情况
264         
265 //        //讲解Test6
266 //        Test6 test1 = new Test6();
267 //        test1.run();
268 //        test1.eat();//调用父类的defalut方法,可以通过子类的引用调用
269 //        //接口中static类型的方法,必须使用当前方法所在的接口名字去调用
270 //        inter5.bark();
271         
272         
273         
274         //一个类有两个接口的情况
275         
276         Test5 test = new Test5();
277         test.run();
278         //两个接口的同名方法,两个都是default类型的
279         test.eat();
280         
281         //子类的静态方法可以与父类的相同,但是方法在调用的使用各自调用各自的
282         inter5.bark();
283         //如果两个接口中只有一个有default方法,不需要重写,可以直接使用
284         test.song();
285 
286         Test5.bark();
287         
288         //两个接口中的同名方法,一个是default类型的(有实现),一个是抽象的
289         test.play();
290     }
291 }
292 
293 interface inter5{
294     public void run();
295     
296     default public void song() {
297         System.out.println("song");
298     }
299     default public void eat(){
300         System.out.println("default");
301     }
302     
303     static public void bark(){
304         System.out.println("static");
305     }
306     
307     default public void play() {
308         System.out.println("play");
309     }
310 }
311 
312 interface inter6{
313     public void run();
314     default public void eat(){
315         System.out.println("default1");
316     }
317     
318     static public void bark(){
319         System.out.println("static1");
320     }
321     
322     public void play();
323 }
324 
325 class Test6 implements inter5{
326 
327 
328     //
329     public void run() {
330         System.out.println("Test6");
331         
332         
333     }
334     
335     //default只能放在接口中
336         //如果当前接口中有一个default方法,不需要重写,可以直接使用
337     //比如现在的eat方法
338     
339     //子类的静态方法可以与父类的相同,但是方法在调用的时候各自调用各自的
340     static public void bark(){
341         
342         System.out.println("static");
343     }
344     
345 }
346 
347 class Test5 implements inter5,inter6{
348 
349     //如果两个接口中有相同的抽象方法,只需要重写一次
350     public void run() {
351         System.out.println("run");
352         
353     }
354     
355     
356     
357     
358     //如果两个接口中有相同的都有default实现的方法,我们必须要重写
359     //在重写方法中可以同时对两个父接口的调用,也可以只调用其中一个
360      public void eat() {
361         // TODO Auto-generated method stub
362         inter6.super.eat();//调用inter1中的方法
363         inter5.super.eat();//调用inter中的方法
364         
365         //再写自己的功能
366         System.out.println("Test-eat");
367     }
368 
369     //如果两个接口中有两个同名的方法,一个是default实现的方法,一个是抽象方法,我们必须要重写
370     //在重写方法中可以同时对两个父接口的调用,也可以调用一个
371     public void play() {
372         inter5.super.play();
373         System.out.println("");
374     }
375 
376 
377     //子类的静态方法可以与父类的相同,但是方法在调用的时候各自调用各自的
378     static public void bark(){
379         
380         System.out.println("substatic");
381     }
382     
383 }
384 
385 package com.qianfeng.test;
386 
387 public class Demo9 {
388     /*
389      * 实例:防暴犬,搜救犬,导盲犬都去工作,中间还有一个导盲驴也要干活儿,导盲犬和导盲驴都要学习导盲技术
390      * 
391      * 抽象类,抽象方法,接口,继承
392      */
393 }
394 
395 abstract class 犬{
396     public abstract void work();
397 }
398 
399 class 防暴犬 extends 犬{
400     
401     public void work() {
402         System.out.println("防爆");
403         
404     }
405 }
406 
407 class 搜救犬 extends 犬{
408     
409     public void work() {
410         System.out.println("搜救");
411         
412     }
413 }
414 
415 interface Inter{
416     public void study();
417 }
418 
419 class 导盲犬 extendsimplements Inter{ 
420     @Override
421     public void work() {
422         System.out.println("导盲");
423         
424     }
425     
426     @Override
427     public void study() {
428         System.out.println("学习导盲技术");
429         
430     }
431 }
432 
433 class 导盲驴  implements Inter{
434     @Override
435     public void study() {
436         System.out.println("学习导盲技术");
437         
438     }
439 }
440 
441 package com.qianfeng.test;
442 /*
443  * Object类:
444  */
445 public class Demo10 {
446     /*
447      * 实例:根据轮子的个数比较两辆车
448      */
449     public static void main(String[] args) {
450         Car car1 = new Car(3);
451         Car car2 = new Car(4);
452         boolean b = car1.comWithWheels(car2);
453         System.out.println(b);
454         //默认的equals方法的比较规则是比较两个对象的地址
455         //我们可以通过重写equals方法达到自己指定规则的目的.
456         boolean b1 = car1.equals(car2);
457         System.out.println(b1);
458         
459         //hashCode()获取是当前对象的哈希码值--直接拿到的是十进制的
460         System.out.println(car1.hashCode());//31168322
461         System.out.println(car2.hashCode());//17225372
462         
463         //得到十六进制的数
464         System.out.println(Integer.toHexString(car1.hashCode()));//1db9742
465         
466         //toString(),默认打印的是包名+类名+@+十六进制的哈希值
467         System.out.println(car1.toString());//com.qianfeng.test.Car@1db9742
468         System.out.println(car1);//默认执行的是toString()
469         
470         //了解:
471         //getClass():获取的是当前对象的字节码文件
472         //字节码文件:一个类只有一个
473         //字节码文件本身就是一个对象
474         //字节码文件对象对应的类是Class
475         Class class1 = car1.getClass();
476         System.out.println(class1);//字节码文件对象  class com.qianfeng.test.Car
477         //拼成默认的toString
478         System.out.println(class1.getName()+"@"+Integer.toHexString(car1.hashCode()));//com.qianfeng.test.Car@1db9742
479     }
480 }
481 
482 class Car{
483     int wheels;
484     public Car(int wheels) {
485         super();
486         this.wheels = wheels;
487     }
488     public boolean comWithWheels(Car car){
489         return wheels>car.wheels;
490     }
491     
492     //重写equals方法,自己制定比较规则
493     public boolean equals(Object obj) {//多态  obj = new Car(4) ,就是用父类的引用指向子类的对象.
494         //向下转型-多态中的知识,从高类型转成低类型
495         Car car = (Car)obj; //car = new Car(4)
496         return wheels<car.wheels;
497     }
498     
499     //重写toString---目的:可以更加方便的查看当前对象的属性信息
500     public String toString() {
501         return "Car [wheels=" + wheels + "]";
502     }
503     
504     
505     
506 }

 

posted @ 2018-08-10 15:52  lijun199309  阅读(373)  评论(0编辑  收藏  举报