JAVA-(代码块、内部类、继承、多态)


心得体会

  • 风平浪静、晴空万里的一天。一个人想要认真的学习,学习氛围很重要。我比较习惯一个人学习,有时候遇到问题就自己冥思苦想,可很多时候都花费了很多时间,但还是想不出。有时候真的要多问,这样会让自己的效率变高一点。

技术

  • 1.代码块
  • 2.内部类
  • 3.继承
  • 4.多态
  • 5.练习小demo

具体操作

1.代码块

  • 在java中用{}括起来的称为代码块,代码块在对象创建之前就优先被调用
修饰符{
      预先执行的内容
  }
class Person{
    int age;
    {
        age=30;
        System.out.println("代码块 age="+age);
    }
    //静态代码块
    static{
      //  age=20;静态代码块里面不能调用成员变量和实例方法
        System.out.println("静态代码块");
    }


    public Person(){
        System.out.println("无参构造方法 age"+age);

    }
    public Person(int age){
        this.age=age;
        System.out.println("有参的构造方法");
    }
}
JAVA-(代码块、内部类、继承、多态)_第1张图片
image.png
  • a.类里面可以有多个代码块。例如:在下图代码中,一个Person类里面有两个代码块
//下面有两个代码块
   {
        age=30;
        System.out.println("代码块 age="+age);
    }
 static{
      //  age=20;静态代码块里面不能调用成员变量和实例方法
        System.out.println("静态代码块");
    }
  • b.代码块的执行顺序和出现的先后顺序相同。例如:下面代码中,上面的代码块会优先被执行,因为上面的代码先出现
 {
        age=30;
        System.out.println("代码块 age="+age);
    }
{
       age=20;
        System.out.println("静态代码块");
    }
  • c.尽量不要在类里面写多个代码块
  • d.代码块前面加static,称为静态代码块静态代码块里面不能调用成员变量和实例方法
 static{
        age=20;//错误!!!静态代码块里面不能调用成员变量和实例方法
        System.out.println("静态代码块");
    }

2.内部类

定义一个类 可以在多个地方定义

  • 1、单独创建一个文件管理一个类
  • 2、直接在文件里面 类A的上面和下面创建
  • 3、直接在某个类A内部创建一个类( 一个类A依附于另一个类B)
  • 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
 class RelativeLayout  {
    String view;
    LayoutParams  layoutParams  ;
    //在显示一个视图前 必须告诉系统这个视图的具体位置
    public void show( float left, float top,float right, float bottom){
        LayoutParams layoutParams=new LayoutParams(left,right,top,bottom) ;
        System.out.println("视图:"+view+"显示出来了");
        System.out.println("left"+left+"right"+right+"top"+top+"bottom"+bottom);

    }
    //定义一个内部类 用于管理相对布局的具体布局属性相对布局的具体布局属性
   public  static class LayoutParams{
        float leftMergin;
        float topMergin;
        float rightMergin;
        float bottomMergin;

       public  LayoutParams(float leftMergin, float topMergin,
                            float rightMergin, float bottomMergin){
            this.leftMergin = leftMergin;
            this.topMergin = topMergin;
            this.rightMergin = rightMergin;
            this.bottomMergin = bottomMergin;
        }
    }
}

上图中
public class LayoutParams{//内容}
class RelativeLayout的内部类


静态内部类的使用

class testLayout{
        public static void main(String[] args){
            RelativeLayout rl=new RelativeLayout();
            rl.view="分享按钮";
            //显示这个视图
            //准备好这个视图的布局属性
           //RelativeLayout.LayoutParams params= rl.new LayoutParams(20,20,20,20);
            //rl.show(params);
            rl.show(20,20,20,20);
            TestInner ti=new  TestInner();
            ti.test();
        }
}
class TestInner{
        int a;
        static int b;
        Inner inner;
        class Inner{
            //非静态的内部类 可以访问外部类的属性和方法
            public Inner(){
                a=20;
                b=30;
                show();
            }
        }
        public void test(){
            inner=new Inner();
        }
        public void show(){
                System.out.print("a="+a+"  b="+b);
        }
}
JAVA-(代码块、内部类、继承、多态)_第2张图片
image.png

非静态的内部类 可以访问外部类的属性和方法。

  • 如下图class Inner{}是一个非静态的内部类,a,b是外部类class TestInner{}定义的属性,内部类class Inner{}可以访问外部类class TestInner{}的属性
class TestInner{
        int a;
        static int b;
        Inner inner;
        class Inner{
            //非静态的内部类 可以访问外部类的属性和方法
            public Inner(){
                a=20;
                b=30;
                show();
            }
        }
        public void test(){
            inner=new Inner();
        }
        public void show(){
                System.out.print("a="+a+"  b="+b);
        }
}

3.继承

a.继承 : A extends B (A继承于B,A就是B的子类,B就是A的父类)

  • 子类获得父类的方法和属性 并且需要添加自己的方法和属性(为甚么需要继承)
  • Java里面只能单继承,变相多继承
  • 所有的类都直接或间接继承于Object类
  • 当调用子类的一个方法时,如果没有就会在父类里面去查找

b.如果在子类里面需要调用父类的方法或者显示调用父类的属性,就 使用super

 public void walk() {
          super.walk();
      }
  • 什么情况下需要在一个方法里面调用super的对应方法?
  • 当一个方法需要完成一个功能,又不能单独完成,必须要父类
    做相应的工作时,需要调用super的对应方法
  • 1.父类做完之后 子类再操作
    onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
  • 2.子类做点事情之后 在调用父类去完成
    protected void onDestroy() {
    super.onDestroy();
    }

c.如果子类里面需要重新实现父类的方法,就需要重写
@Override

  //方法的重写
      @Override
      public void walk(){
         super.walk();
         System.out.println("学生优雅的走");
      }

d.如果父类有自定义构造方法,子类的构造方法也必须显示调用父类的构造方法

  • 如果子类中的构造方法没有显示调用父类的构造方法,可以为父类加一个默认的构造方法

1.父类中自定义的构造方法,如下图

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

2.子类的构造方法也必须显示调用父类的构造方法

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

e. 如果父类有内部类,子类中有同名的内部类,那么父类中的内部类就被屏蔽了

  • 此时如果非要使用父类中的内部类,只能使用全类名

4.多态

  • 1.同一种方法多种实现=在不同的类中有不同的实现
    2.如果有继承关系:子类的对象可以使用父类变量接收,类型自动向上转换
class a{
    public void info(){
         System.out.println("int A");

        }
    }
class b extends a{
     @Override
        public void info(){
         System.out.println("int B");
     }
    }
class c extends a{
    @Override
    public void info(){
        System.out.println("int C");
    }
}
       //c继承于a
       c textc= new c();//新建子类c的对象 textc
       a textc2=new c() ;//新建子类c的对象 textc2,类型向父类a转换
       textc2.info();
       Object textc3=new c();//新建子类c的对象 textc3,类型向 Object类转换
     }
JAVA-(代码块、内部类、继承、多态)_第3张图片
image.png

上面输出结果之所以是int c,因为多态只是类型的转换,创建的对象还是子类c的对象

5.练习小demo

JAVA-(代码块、内部类、继承、多态)_第4张图片
image.png

分析:将多个公务员和公司职员放在一个数组里面,数组里面只能放一种类型,从而想到用继承和多态,将公务员和公司职员转化为同一种类型

1.定义一个Person类

class Person3 {
    String name;
    int age;

     public Person3(String name, int age) {//提供有参数的构造方法
         this.name = name;
         this.age = age;
     }

    public void walk() {//walk方法
        System.out.println("走路");
    }

    public void eat() {//eat方法
        System.out.println("吃饭");
    }
}

2.定义Person3的一个子类管理公务员相关信息

class Servant extends Person3{
     int Salary;
     int count;//看杂志的数量

   public Servant(String name, int age, int Salary, int count){
       super(name,age);
       this.Salary=Salary;
       this.count=count;
        }
        @Override//子类里面需要重新实现父类的方法,需要重写
        public void walk() {
            super.walk();
        }

        @Override
        public void eat() {
            super.eat();
        }

        @Override
        public String toString() {
            return "Servant{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", Salary=" + Salary +
                    ", count=" + count +
                    '}';
        }
   }

3.定义Person3的一个子类管理公司职员相关信息

class worker extends Person3{
    int Salary;
    int tech;
    public worker(String name, int age,int Salary,int tech){
        super(name,age);
        this.Salary=Salary;
        this.tech=tech;

    }
  @Override
        public void walk() {
            super.walk();
        }

        @Override
        public void eat() {
            super.eat();
        }

    @Override
    public String toString() {
        return "worker{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", Salary=" + Salary +
                ", tech=" + tech +
                '}';
    }
}

4.创建main函数,将公务员和职员放到数组,打印数组全部信息

class Test{
     public static void main(String[] args){
         ArrayList peoples=new ArrayList<>();
         Person3 c1=new Servant("小王",20,10000,520);
         Person3 c2=new Servant("小明",20,10000,250);
         Person3 c3=new Servant("小李",20,10000,250);
         Person3 c4=new Servant("小红",20,10000,250);
         peoples.add(c1);
         peoples.add(c2);
         peoples.add(c3);
         peoples.add(c4);



         Person3 w1=new worker("小丽",18,10000,"ios");
         Person3 w2=new worker("小芳",20,10000,"Android");
         Person3 w3=new worker("小蒋",20,10000,"Web");
         Person3 w4=new worker("小华",20,10000,"ios");
         peoples.add(w1);
         peoples.add(w2);
         peoples.add(w3);
         peoples.add(w4);

          for(Person3 p:peoples){
              //找到p到底是哪个类型的对象
              if(p instanceof Servant){
                  //公务员
                  Servant c=(Servant )p;
                  c.cShow();
                  c.walk();
                  c.eat();
              }else{
                  //员工
                  worker w=(worker)p;
                  w.wShow();
                  w.walk();
                  w.eat();
              }
          }
     }
}
JAVA-(代码块、内部类、继承、多态)_第5张图片
image.png

你可能感兴趣的:(JAVA-(代码块、内部类、继承、多态))