JavaSE Day09

面向对象(3)

 

1. static关键字

小技巧: 输出语句: 变量 . sout

new Student.run();加载方法

main也是一个static的

 1  package com.oop.demo06;
 2  3  public class Student {
 4  5      private static int age = 24;//静态变量    多线程!!
 6      private double score = 90;//非静态变量
 7  8      public void run() {
 9      }
10 11      public static void go() {
12      }
13 14      public static void main(String[] args) {
15          Student s1 = new Student();
16          System.out.println(Student.age);//类变量
17          //System.out.println(Student.score);//不行
18          System.out.println(s1.score);//对象调用方法
19          System.out.println(s1.age);//对象调用方法
20 21          new Student().run();//调用run需要new
22          go();//直接调用
23 24      }
25  }

 

代码块:

 1  package com.oop.demo06;
 2  3  public class Person {
 4      {
 5          //代码块(匿名代码块)
 6          System.out.println("匿名代码块");//2   赋初始值
 7      }
 8  9      static {
10          //静态代码块(可以加载一些初始化)
11          System.out.println("静态代码块");//1  只执行一次
12      }
13 14      public Person() {
15          System.out.println("构造方法");//3
16      }
17 18      public static void main(String[] args) {
19          Person person1 = new Person();
20          System.out.println("=======");
21          Person person2 = new Person();
22      }
23  }

静态代码块

匿名代码块

构造方法

========

匿名代码块

构造方法

 

静态导入包

Math.random()//输出随机数

 1  package com.oop.demo06;
 2  3  //静态导入包~
 4  import static java.lang.Math.random;
 5  import static java.lang.Math.PI;
 6  7  public class Test {
 8      public static void main(String[] args) {
 9          System.out.println(random());//输出随机数
10          System.out.println(PI);
11      }
12  }

final 修饰的不能被继承!!

 

2. 抽象类

abstract 修饰符可以用来修饰方法也可以修饰类

public abstract void doSomething();

 1  package com.oop.demo07;
 2  3  //abstract 抽象类:  extends:单继承   接口可以多继承!!!!
 4  public abstract class Action {
 5  6      //约束 ,有人帮我们实现
 7      //abstract  ,抽象方法,只有方法的名字,没有方法的实现
 8      public abstract void doSomething();
 9  }
10  package com.oop.demo07;
11 12  //抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非abstract 套娃
13  public class A extends Action {
14      @Override
15      public void doSomething() {
16 17      }
18  }

父债子还,子不还孙还。

特点:

  1. 不能new这个抽象类,只能靠子类去实现它:约束!

  2. 抽象类中可以写普通的方法

  3. 抽象方法必须在抽象类中

抽象的抽象:约束~

存在的意义:例如游戏中新建一些角色,抽象出来,提高开发效率,扩展性提高

 

3. 接口*

普通类:只有具体实现

抽象类:具体实现和规范(抽象方法)都有,见上

接口:只有规范!!自己无法写方法~专业的约束!约束和实现分离:以后工作都是面向接口编程

 

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。。,则必须能。。。”的思想。如果你是汽车,必须能跑。

接口的本质是契约,就像生活中的法律一样,制定好大家都遵守。

面向对象的精髓就是接口,声明接口的关键字是 interface

 1  package com.oop.demo08;
 2  3  //interface 定义的的关键字,接口都需要有实现类
 4  public interface UserService {
 5      //接口中的所有定义都是抽象的public
 6      void add(String name);
 7      void delete(String name);
 8      void update(String name);
 9      void query(String name);
10  }

 

接口都需要有实现类,后缀都有Impl,通过implements关键字,并且需要重写方法!!!!!

 1  package com.oop.demo08;
 2  3  //类可以实现接口 通过implements  必须要重写方法
 4  public class UserServiceImpl implements UserService {
 5      @Override
 6      public void add(String name) {
 7  8      }
 9 10      @Override
11      public void delete(String name) {
12 13      }
14 15      @Override
16      public void update(String name) {
17 18      }
19 20      @Override
21      public void query(String name) {
22 23      }
24  }

 

实现多继承------->>>

 1  package com.oop.demo08;
 2  3  public interface TimeService {
 4      void timer();
 5  }
 6 package com.oop.demo08;
 7 
 8 //类可以实现接口 通过implements  必须要重写方法
 9 public class UserServiceImpl implements UserService,TimeService {
10     @Override
11     public void add(String name) {
12 
13     }
14 
15     @Override
16     public void delete(String name) {
17 
18     }
19 
20     @Override
21     public void update(String name) {
22 
23     }
24 
25     @Override
26     public void query(String name) {
27 
28     }
29 
30     @Override
31     public void timer() {
32         
33     }
34 }

接口中的所有定义的:

方法其实都是抽象的 public abstract

常量都是 public static final

 

接口的作用:

  1. 约束

  2. 定义一些方法,让不同的人实现

  3. public astract

  4. public static final

  5. 接口不能被实例化,接口中没有构造方法

  6. implements 可以实现多个接口

  7. 必须要重写接口中的方法!

 

4. 内部类

内部类就是在一个类的内部在定义一个类

 1  package com.oop.demo09;
 2  3  public class Outer {
 4  5      private int id=10;
 6  7      public void out() {
 8          System.out.println("这是外部类的方法");
 9      }
10 11      public class Inner {
12          public void in() {
13              System.out.println("这是内部类的方法");
14          }
15          //获取外部类的私有属性   内鬼!!!!!!!!!!!!终止交易
16          public void getID(){
17              System.out.println(id);
18          }
19      }
20  }
 1 package com.oop;
 2  3  import com.oop.demo09.Outer;
 4  5  public class Application {
 6      public static void main(String[] args) {
 7  8          Outer outer = new Outer();
 9          //通过外部类来实例化内部类
10          Outer.Inner inner = outer.new Inner();
11 12          inner.in();
13          inner.getID();//内鬼   <----------
14      }
15  }

通过public static class禁止内部类访问

一个类中可以有多个class类,但是只能有一个public class

 

局部内部类:

 1 package com.oop.demo09;
 2  3  public class Outer {
 4  5      //局部内部类
 6      public void method(){  //在方法里
 7  8          class Inner{
 9          }
10      }
11  }

 

扩展一下,写安卓好像经常见到:。。。

 1  package com.oop.demo09;
 2  3  public class Test {
 4      public static void main(String[] args) {
 5  6          //没有名字初始化类,不用讲实例保存在变量中,节省内存!!!!
 7          new Apple().eat();
 8  9          //还可以new接口
10          UserService userService = new UserService() {
11              @Override
12              public void hello() {
13 14              }
15          };
16      }
17  }
18 19  class Apple {
20      public void eat() {
21          System.out.println("1");
22      }
23  }
24 25  interface UserService {
26      void hello();
27 28  }

 

 

posted @ 2021-03-07 20:21  825728422  阅读(82)  评论(0)    收藏  举报