final关键字+static关键字+匿名对象

接上文,我们学习完构造方法+this+super关键字后,发现有时在代码中出现的final和static关键字非常眼熟,但是他们是什么意思呢?

首先,我们需要从封装、继承、多态开始想起,继承的主要意义在于子类完全继承父类中的属性和方法,但有的方法或属性我们不想被继承怎么办?删除是不可能被删除的,只能靠阻止被继承来解决这个问题,那么就用到了final关键字了,它作为存在于方法中的修饰符,可以修饰类,类的成员变量,方法,局部变量,高亮,它不能修饰构造方法,为啥呢?因为构造方法没有修饰符和返回值。一旦静态修饰后,无法被调取或者继承。构造方法无法修改。

初步了解final后我们可以深入了解它。

1、final修饰的不能被继承,但能继承其他的类

public class fu()

public final class zi extends fu(){}//可继承fu,不能被下面重写

2、final修饰的方法不能被重写,但可以继承使用

class fu{

public final void cat(){}

public void dog(){}

}

//子类继承

public void eat extends fu(){

  public dog(){}//可继承普通方法

   }

3、final修饰的为常量,一次修改后面不可修改

 final int i=10;//变成了常量,后面不可修改

4、final修饰的成员变量和需要在创建对象前赋值

public class fu{

  final int a=1;//直接赋值

  final int b;//如果没有赋值怎么办?用专门用来赋值的构造方法

public zi(){

  b=5;

system.out.in(b);//5

  }

}

5.final修饰的引用数据类型不能更改地址,但可以更改地址内的属性,如

final student s=new student(); s是存储的地址

student s1=new student();

s=s1;//地址没有变化

s.name="李四";

二、static静态修饰符

它的出现是为了解决我们用对象名.方法名()调取不到类里特定的数据,用静态修饰符来实现。

它的位置尤其重要,一般的关键字都跟随方法进栈,但它却是随着main方法直接进堆,也就是说当我们程序还没有在栈运行的时候,静态修饰符已经通过构造方法赋上初值了。

下面我们举例和画一个static内存图来详细了解下它的区别。

package com.oracle.demo01;
public class Student {
    private String name;
    //static静态变成类的
    //静态不能访问非静态,因为非静态不在方法与数据共享区
    //尽量用类名方式访问
    public  static  String schoolName;
    public static final String ClASS_NAME="0611";
    //构造函数
    public Student(String name, String schoolName) {
        super();
        this.name = name;
        //本类对象不合适
        //this.schoolName = schoolName;
    }
    //封装
    public String getName() {
        return name;
    }
    /*public void setName(String name) {
        this.name = name;
    }*/
    public String getSchoolName() {
        return schoolName;
    }
    /*public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }*/
    public static void sho(){
        System.out.println("我是一个静态方法");
    }
}

 

package com.oracle.demo01;

public class Demo01 {
public static void main(String[] args) {
    //构造函数的调取
    Student.schoolName="人民大学";//直接给静态赋值人民大学,后面输出只有人民大学了。
    Student stu=new Student("张三","清华大学");
    Student stu1=new Student("李四","北京大学");
    System.out.println(stu.getName()+"..."+stu.getSchoolName());
    System.out.println(stu1.getName()+"..."+stu1.getSchoolName());
    //对象名.方法名,调取普通方法
    Student.sho();
    //打印静态常量
   //静态调取==类名.静态()
    System.out.println(Student.ClASS_NAME);后面只能输出0611
    System.out.println(Math.PI);
    }
}

静态父类
package com.oracle.demo01;
public class Fu {
    static int i=1;
    public static void show(){
        System.out.println("这是父类的方法");
    }
}
继承子类
public class Zi extends Fu{
    int i=2;
    //多态运行看右边
    public static void show(){
        System.out.println("这是子类的方法");
    }
测试类:
public static void main(String[] args) {
        Fu f=new Zi();
        System.out.println(f.i);
        //多态方法,有静态情况下,编译运行都看左边
        //成员变量,编译运行全是左边父类
        f.show();
    }

 

 

 

 

 

三、匿名对象

匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。

创建一个普通对象

Person p = new Person();

创建一个匿名对象

new Person();

匿名对象的特点:

创建匿名对象直接使用,没有变量名。

new Person().eat()  //eat方法被一个没有名字的Person对象调用了。

匿名对象在没有指定其引用变量时,只能使用一次。

 

二期项目,通过匿名方法调取菜单来连接起后续的操作流程
public class Test1 {
    public static void main(String[] args) {
        //匿名对象掉方法
    new MessAgezong().MainMenu();
        //new MainView_Boos().MainMenu();
    }

 

 

 

new Person().eat(); 创建一个匿名对象,调用eat方法

new Person().eat(); 想再次调用eat方法,重新创建了一个匿名对象

匿名对象可以作为方法接收的参数、方法返回值使用

class Demo {

public static Person getPerson(){

//普通方式

//Person p = new Person();

//return p;

//匿名对象作为方法返回值

return new Person();

}

 public static void method(Person p){}

}

class Test {

public static void main(String[] args) {

//调用getPerson方法,得到一个Person对象

Person person = Demo.getPerson();

//调用method方法

Demo.method(person);

/匿名对象作为方法接收的参数

 

Demo.method(new Person());

 

  }

 

}

 

posted @ 2019-08-07 22:57  lvyimin  阅读(210)  评论(0编辑  收藏  举报