oop回顾 final

来源:互联网 发布:模拟和网络监控的区别 编辑:程序博客网 时间:2024/06/05 19:48

构造函数 没有返回值 如果有返回值的构造函数 就是假的 其实不是构造函数 而是普通成员函数 

public void  Car(){

}

从命名中 函数一般小写字母开头 变量大写字母开头 这里的命名不符合规划

public Car car(){A

  Car c = new Car();

  return c;

}

//返回值 Car是引用类型 从 Car c=new Car() 可以看出

--------------------------------------------------------------------------------------------------------

return; 没有返回值的返回 不是返回null

---------------------------------------------------------------------

public Car(){

  new Car();

}

//递归了,因为 创建对象 new Car(); 然后一直调用自己 递归

---------------------------------------------------------------------------

构造函数只能通过new 来调

Car c = new Car("white"):

不可以是先创建一个对象 c 然后 c.Car("white")  // 编译不通过 

除非 定义了 一个 

public Car Car(String color){

  this.color = color;

  Car c = new Car();

  return c;

}

//以上用法很奇怪 只是讲解用的

---------------------------------------------

构造函数之间相互访问 this

---------------------------------------------------

win文件不区分命名大小写

而java里面区分大小写

class car extends Car{


}

//编译可以通过 但是 文件没有找到小写的car.class

------------------------------------------------------ 

main:

 getBrand()

class Benz extends Car{

  private static String BRAND = "BENZ";

  public static String getBrand(){

   return Brand;  //静态方法里面不能this, this是指向对象自己的指针,前提得是个对象 而静态方法没有对象,它在方法区里面

  }

}

-----------------------------------------------------------------------------------------

overwrite 覆盖 复写

class ClassDemo2{

  public static void main(String[] args){

    Son s1 = new Son();

    s1.eat();

    s1.asset = 1000 ; //私有就会报错 

    s1.setAsset(1000);

  }

}

class Father{

  String name;

  private int asset;

  public void eat(){

    print("wash hand");

 }

public void walk(){

   print("walk");

  }

public void getAsset(){

   return this.asset;

  }

public void setAsset(){

   this.asset = asset;

  }


}

class Son extends Father{


  public void eat(){

    super.eat();

    print("dusche");

  }  

  public void run(){

    //this.walk(); 没问题

    super.walk(); 也没问题 调用 this 或者 super 没区别

  }  

}

-----------------------------------------------------------

super常用来方法overwrite

如果父类方法是private  子类不能继承

但是如果子类出现同名的 只能说明是另一个函数 不是继承

---------------------------------------------------------

overwrite 子类方法权限 一定要大于等于父类方法权限 (我猜 比如 父是public 子类不能private 儿子把权限缩小了)

静态只能覆盖静态 比如父 public static void walk 那么子类 也只能 public staic void walk(父类非静态 子类同样也无法覆盖)

overwrite:

1.静态覆盖静态 非静态覆盖非静态  静态性约束一致

2.权限放大 不能缩小

----------------------------------------------------------------

class ClassDemo3{

  main:

        Jing8 d = new Jing8();

        d.run();

}

class Animal{

  String category;

  public Animal(){

    System.out.println("new Animal()");

  }

 public void run(){

    print("run()");

}

}

class Dog extends Animal{

  String color;

  public Dog(){

    System.out.println("new Dog()");

  }

}

class Jing8 extends Dog{

  String blood;

  public Jing8(){

      System.out.println("new Jing8()");

  }

}

result: new Animal() 

new Dog()

new Jing8()

run...

构造函数 一层一层super上去

子构造函数会默认访问父的构造函数

每个构造函数都有一条默认的语句super()

如果父有参数的构造函数,那么一定要父写空的构造函数 不然子类是空的调用就会有问题  或者子类显式调用 super("kkk") 非空

因为 子类中 

public Dog(){

  //super(); //省略不写 调用父空构造 或者是this();

  println("Dog()");

}

-----------------------------------------------------------


-------------------------------------------------------------------

jing8 内部可以访问 继承的对象 dog animal 

但是外部不能访问继承的对象

----------------------------------------------------------------

static Jing8 d=new Jing8();

d 在method area 里面

d是一个引用 指针

静态这个东西跟对象无关 只跟类有关 周期很长

对象在heap

-------------------------------------------------------------



-----------------------------------------------------------------------

final

1.最终的

2.修饰类,不能被继承(final Dog  那么Jing8 就不能继承)

3.修饰方法就不能覆盖(public final void run() Animal d.run(); Jing8可以调run方法的  只是jing8不能复写而已)

4.修饰变量不能修改,只能赋值,常量(final String blood='A')

--------------------------------------------------------

类的成员

1.成员变量

2.成员函数

3.构造代码块

4.静态代码块

------------------------------------------------

class InnerClassDemo1{

  public static void main(String[] args){

    Benz benz = new Benz();

    benz.run();

  }

}

class Benz{

  String color;

  int tires;

  

  public void run(){

    Engine e = new Engine();;

    e.fire("key001");

    System.out.prinln("run...");

  }

 //

  class Engine{

    public void fire(String key){

        print(key);

        System.out.println("fire...");

    }

  }

}

-------------------------------------------------

内部类

1.定义在类内部的类,称为内部类

2.内部类可以在类成员里头

  编译时产生的类: 外部类$内部类名 如 Benz$Engine.class

3.还可以定义在方法里头,Benz$1Engine

4.内部访问局部变量,不能局部变量进行重新复制(如下例子解释)

Benz:

public void run(){

  int key; //系统自动加final 给 inner class 用

  class Engine{

    public void fire(){

    // key=888; 编译通不过

        print(key);

        System.out.println("fire...");

    }


    Engine e = new Engine();;

    e.fire();

    System.out.prinln("run...");

  }

内部类只能访问外部 被final修饰的局部变量(java8好像不满足了)

这里的key 在java8一下版本 要用final修饰 否则错误 java8 中默认已经加了final

可以通过 在inner class里面 改变key的值 可以发现 编译错误


---------------------------------------------------------