Java中this、static、super、final

this

class Person
{
    public String _name;
    public int _age;
    public Person()  //无参构造
    {
        System.out.println("Person()");
    }
    public Person(String name)                          
    {
        this._name=name;
        System.out.println("Person(String name)");
    }
    public Person(String name,int age)
    {
        this(name); //调Peson(String name)构造方法
        //this._name=name;
        this._age=age;
        System.out.println("Person(String name,int age)");
    }
}
 
public class Construtor
{
    public static void main(String[] args)
    {
        //Person p1=new Person();  //当没有写构造函数时,系统会自动生成一个无参构造,当写了构造函数,系统不会自动生成无参构造
        //Person p2=new Person("pick");
        Person p3=new Person("pick",11);  //Person(String name) Person(String name,int age)
    }
}

表示调用本类属性:只要在类中访问类的属性一定要加上this关键字
表示调用本类方法
调用普通方法
this.方法名(参数)
当有类的继承关系时,表示本类方法一定要加上this关键字;
调用构造方法

  • this调用构造方法必须放在构造方法首行,this(参数)
  • this调用构造方法不允许成环;
    this表示当前对象,并不是当前对象的地址
    super
    super用于方法
    super用于构造方法
class Person
{
    private String name;
    public Person(String name)
    {
        this.name=name;
    }
    
}
class Student extends Person
{
    private int num;
    public Student(String name,int num)
    {
        super(name); //调父类有参构造,必须写super(参数)
        this.num=num;
    }
    // public Student(int num)  //调父类无参构造,可以不写super
    // {
    //     this.num=num;
    // }
}
public class Final
{
    public static void main(String[] args)
    {
        Student s1=new Student(1);
    }
}
  • 当子类调用父类无参构造时,super可写可不写,表示调用父类无参构造;
    当子类调用父类有参构造时,super(参数列表),必须写,要告诉编译器当前调用的是哪个有参构造;
  • 子类构造方法中调用父类构造必须放在第一行
  • this与super不能同时使用(因为两者在构造函数中都必须放第一行)
    super用于普通方法
    super.方法名(参数)
    用于在子类中明确调用父类被覆写的方法,这时super.方法名(参数)可以不放在第一行
class Student extends Person
{
    private int num;
    public void func()
    {
        super.func();
        System.out.println("Student::func()");
    }
}
public class Final
{
    public static void main(String[] args)
    {
        Student s=new Student(); //person::func()  Student::func()
        s.func();
    }
}

super用于属性:
super.属性名 表示调用父类中被覆写的属性(权限不能是private,private属性变量在子类中不可见,但是子类继承了父类的私有属性和私有方法)

class Person
{
    public String name="dad";
}
class Student extends Person
{
    private String name="son";
    public void show()
    {
        System.out.println(super.name);  //父类属性
        System.out.println(this.name); //子类的属性
    }
}

this和super区别:
在这里插入图片描述
static

  • static属性称为类属性,保存在全局数据区中(方法区-所有对象共享区域),用类名来调用,与类实例化对象无关。
  • static方法 ---- 类方法(静态方法)
    通过类名调用,与对象实例化无关
  • 局部变量不能用static修饰,即在方法中变量(不论是主方法,还是普通方法)
    private/static不能用于外部类,即 static class Perosn{},错误

final
在java中,final被称为终结器。

final修饰类

  • 当一个类被final 关键字修饰,表示该类不能拥有子类(该类不允许被继承);
  • 一旦一个类被final修饰,该类的所有方法都会被默认加上final.(成员变量不会被加上final)。

final修饰方法

  • 当一个方法被final修饰,明确表示该方法不能被覆写;
  • 当一个方法被private修饰后,相当于加了一个final关键字。

final修饰属性

  • final可以用于成员变量、本地变量,被final修饰的变量变成常量,即值不可以改,类型也不可以改;
  • 被final修饰的成员变量必须在声明时初始化(也可以在构造块或者构造方法中初始化,即final修饰的变量是在对象产生时初始化),否则编译器会报错,并且初始化后无法被修改。而普通类型的成员变量可在构造方法中,也可以在getseter中初始化。
public final int a=100;  //在声明时初始化
public static final int a=5;// 在编译器加载类时初始化
 static final 是全局变量,所有对象共享此变量,并且在类加载时(编译时)初始化,效率较高,通过类名调用
  • final修饰引用数据类型的变量(值不能被改)
    在这里插入图片描述
    数据类型转换
    当使用 +、-、*、/、%、运算操作时,遵循如下规则:
    只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型,如果两个操作数中有一个是float类型的,另一个将会被转换为float类型,并且结果也是float类型,如果两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型,否则(操作数为:byte、
    short、int 、char),两个数都会被转换成int类型,并且结果也是int类型。但是final修饰的域类型不会发生变化。
    请判断下列语句的正确性:
public class Final
{
    public static void main(String[] args)
    {
        byte b1=1,b2=2,b3,b6,b8;
        final byte b4=4,b5=6,b7=9;  //final定义变量值和类型都不能变
        b3=b1+b2; // byte 和byte类型相加,两个数类型都转为int,且结果也是int,从int到byte需要强转,所以该语句错误
        b6=b4+b5; // final byte 和final byte相加类型不会变,结果也是byte,所以该语句正确
        b8=b1+b4; //  byte 和final byte相加,结果是 int ,从int到byte需要强转,所以该语句错误
        b7=b2+b5;  // b7是final修饰,只不可以改,所以该语句错误
        System.out.println(b6); //10
    }
}

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/83241908