day15_构造器丶final关键字丶static关键字
作者:互联网
构造器(Constructor)
我们发现我们new完对象时,所有成员变量都是默认值,如果我们需要赋别的值,需要挨个为它们再赋值,太麻烦了。我们能不能在new对象时,直接为当前对象的某个或所有成员变量直接赋值呢。可以,Java给我们提供了构造器。
构造器概述
- 也是即成员方法和成员变量之外类中的第三个成员。构造器又称为构造方法,那是因为它长的很像方法。但是和方法还有有所区别的。主要是完成对象的创建和对象数据的初始化。构造器只为实例变量初始化,不为静态类变量初始化
构造方法的定义格式:
如何调用构造器
- 通过new来调用构造方法
代码示例:
public class Student { private String name; private int age; // 无参构造 public Student() {} // 有参构造 public Student(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
注意事项:
- 构造器名必须与它所在的类名必须相同。
- 它没有返回值,所以不需要返回值类型,甚至不需要void
- 如果你不提供构造器,系统会给出无参数构造器,并且该构造器的修饰符默认与类的修饰符相同
- 如果你提供了构造器,系统将不再提供无参数构造器,除非你自己定义。
- 构造器是可以重载的,既可以定义参数,也可以不定义参数。
- 构造器的修饰符只能是权限修饰符,不能被其他任何修饰
- 构造方法只能给属性赋值一次,而set方法可以给属性赋值无数次。因为调用构造方法,就会创建一个新的对象
final关键字
概述:final表示 不可改变。可以用于修饰类、方法和变量。
修饰类
表示这个类不能被继承,没有子类。查询API发现像 public final class String
、public final class Math
、public final class Scanner
等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
代码示例
final class Fu { } class Zi extends Fu { //错误:Fu类被final修饰了,所以不能被继承 }
修饰方法
表示这个方法不能被子类重写,重写被 final修饰的方法,编译时就会报错。
代码示例
class Fu { public final void show() { } } class Zi extends Fu { /* @Override 无法重写父类中的show方法,因为父类中的show方法被final修饰了 public void show() { } */ }
修饰变量
final修饰某个变量(成员变量或局部变量),表示它的值就不能被修改,即常量,常量名建议使用大写字母。
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下
public class FinalDemo1 { public static void main(String[] args) { // final修饰基本数据类型 final int NUM = 10; // NUM = 20;// 编译报错,final修饰的变量只能赋值一次,不能重复赋值 } }
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下
public class FinalDemo2 { public static void main(String[] args) { // 引用类型 final Student stu = new Student("张三",18); //stu = new Student("李四",19);// 编译报错 stu.setAge(19); } }
成员变量,被final修饰后。涉及到初始化的问题,初始化方式有两种,只能二选一:
显示初始化
public class FinalVariable { //推荐 final int NUM1 = 10; }
构造方法初始化,必须保证每个构造方法都能给其变量赋值。
public class FinalVariable { final int NUM2; public FinalVariable(int NUM2){ this.NUM2 = NUM2; } public FinalVariable(){ this.NUM2 = 10; } }
static关键字
概述:
static是一个静态修饰符关键字,表示静态的意思,可以修饰成员变量和成员方法以及代码块,成员内部类。static不能修饰top-level的类。static修饰类成员内部类,简称静态内部类,不需要外部类实例对象就可以使用的内部类,在静态内部类中只能使用外部类的静态成员。
static修饰成员变量
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
编辑
代码示例
class Person { // 非静态变量 String name;// 姓名 // 静态变量 static String country;// 国籍 // 构造方法 public Person() { } public Person(String name, String country) { this.name = name; this.country = country; } } public class Test { public static void main(String[] args) { // 创建Person对象 Person p1 = new Person("张三", "中国"); System.out.println(p1.name+","+p1.country);// 张三,中国 System.out.println("======================="); // 创建Person对象 Person p2 = new Person(); // 没有使用static修饰name // 使用static修饰country System.out.println(p2.name+","+p2.country);// null,中国 //推荐使用此方式,访问类变量 System.out.println(Person.country);// 中国 } }
图解分析:
static修饰成员方法
被static修饰的方法会变成静态方法,也称为类方法,该静态方法可以使用类名直接调用。以后的项目中,通常会需要一些“全局变量”或者“全局的工具方法”,这些全局变量和方法,可以单独定义在一个类中,并声明为static(静态)的,可以很方便的通过类名访问
代码示例
package demo11; class Person { // 非静态方法 public void method1(){ System.out.println("Person method1..."); } // 静态方法 public static void method2(){ System.out.println("Person method2..."); } } public class Test { public static void main(String[] args) { Person p = new Person(); //不推荐 p.method2(); // 类名.静态成员方法名(实参); Person.method2(); } }
因为被static修饰的方法,随着类的加载而加载,并且早于对象的创建,故此有下面这些注意事项。
- 静态方法中不能出现this关键字
- 静态方法中只能直接访问静态成员变量和静态成员方法
- 静态方法中不能直接访问非静态成员变量和非静态成员方法
- 非静态方法中可以直接访问一切成员变量和成员方法
- 父类的静态方法可以被继承不能被重写
- 父接口的静态方法不能被实现类继承
static修饰代码块,代码块,我们称为静态代码块,或静态初始化块,用于为静态变量初始化,每一个类的静态代码块只会执行一次,在类第一次初始化时执行。以后等到代码块在细说
标签:变量,day15,class,public,关键字,static,修饰,final 来源: https://www.cnblogs.com/wurengen/p/16423417.html