1 this关键字
1.1 this调用本类属性
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age=age;
}
public String getInfo(){
return "姓名"+name+"年龄"+age;
}
}
public class Test{
public static void main(String[] args) {
Person per = new Person("张三",20);
System.out.println(per.getInfo());
}
}
通过以上代码我们发现,当参数与类中属性同名时,类中的属性无法被正确赋值,此时我们加上this关键字就可以正确赋值。
只要在类中方法访问类中属性,一定要加this关键字。
1.2 this调用本类方法
1.2.1 调用普通方法
this.方法名称(参数)
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age=age;
this.print();
}
public String getInfo(){
return "姓名:"+name+",年龄:"+age;
}
public void print(){
System.out.println("-------------");
}
}
public class Test{
public static void main(String[] args) {
Person per = new Person("张三",20);
System.out.println(per.getInfo());
}
}
1.2.2 调用构造方法
this(参数)
class Person{
private String name;
private int age;
public Person(){
System.out.println("----产生一个新的Person对象");
}
public Person(String name){
System.out.println("----产生一个新的Person对象");
this.name=name;
}
public Person(String name,int age) {
System.out.println("----产生一个新的Person对象");
this.name = name;
this.age=age;
}
public String getInfo(){
return "姓名:"+name+",年龄:"+age;
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person();
Person per2 = new Person("李四");
Person per3 = new Person("张三",20);
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
}
}
在java中,支持代码的互相调用。
修改代码如下:
public Person(){
System.out.println("----产生一个新的Person对象");
}
public Person(String name){
this();
this.name=name;
}
public Person(String name,int age) {
this(name);
this.age=age;
}
使用this调用构造方法时应注意:
- this调用构造方法的语句必须在构造方法首行
- 使用this调用构造方法时,请留有出口(不能成“环”)
1.3 this表示当前对象
class Person{
public void print(){
System.out.println("print方法"+this);
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person();
System.out.println("main方法"+per1);
per1.print();
System.out.println("-------------------");
Person per2 = new Person();
System.out.println("main方法"+per2);
per2.print();
}
}
上述代码的执行结果是:
main方法com.bittech.Person@1540e19d
print方法com.bittech.Person@1540e19d
-------------------
main方法com.bittech.Person@677327b6
print方法com.bittech.Person@677327b6
只要对象调用了本类中的方法,这个this就表示当前执行的对象。
2 static关键字(与对象无关!!!)
2.1 static类属性
class Person{
String Country = "中国";
String name;
int age;
public void getInfo(){
System.out.println("姓名:"+this.name+",年龄:"+this.age+",国家:"+this.Country);
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person();
per1.name="张三";
per1.age=20;
Person per2 = new Person();
per2.name="李四";
per2.age=18;
per1.getInfo();
per2.getInfo();
}
}
内存分析图如下:
传统属性所具备的特征:保存在堆内存中,且每个对象独享属性。
static属性:共享属性,保存在全局数据区的内存中,所有对象都可以进行该数据区的访问。
修改上述代码:
static Country = "中国";
此时内存分析图如下:
结论:
- 访问static属性(类属性)应使用类名称.属性名
- 所有非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制
若我们修改Country属性,所有的对象都同步共享此属性值。
Person country = "中华人民共和国";
如何选择实例变量和类属性呢?
非static属性称为成员变量或对象属性,每个对象都有此属性且值不一样。
要描述类似国家这种共享属性,可使用static修饰属性。
2.2 static类方法
直接使用static修饰方法,称为类方法,直接通过类名称调用,与对象实例化无关。
class Person{
private static String country = "中国";
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public static void setCountry(String c){
country = c;
}
public void getInfo(){
System.out.println("姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country);
}
}
public class Test{
public static void main(String[] args) {
Person.setCountry("中国");
Person per = new Person("张三",20);
per.getInfo();
}
}
- 静态方法不能访问类中普通属性(静态方法与对象无关,普通属性必须要有对象)
- 静态方法可以访问类中静态属性
- 普通方法可以访问类中静态属性(所有对象共享静态属性)
使用static定义方法只有一个目的:某些方法不希望受对象的控制。
3 super关键字
子类调用父类构造方法时才使用。
例:使用super调用父类的同名方法。
class Father{
public void print(){
System.out.println("I am a father");
}
}
class Child extends Father{
public void print(){
super.print();
System.out.println("I am child");
}
}
public class Test{
public static void main(String[] args) {
new Child().print();
}
}
例:使用super调用父类属性
class Father{
public String msg = "father!";
}
class Child extends Father{
public String msg = "son!";
public void print(){
//不找本类的属性
System.out.println(super.msg);
System.out.println(this.msg);
}
}
public class Test{
public static void main(String[] args) {
new Child().print();
}
}
super和this的区别
方法覆写时使用的就是public权限。
4 final关键字
在java中final被称为终结器。
- 使用final修饰类、方法、属性
- final成员变量必须在声明的时候初始化,否则就会报编译错误
- 使用final定义的类不能有子类(String类便是final定义)
- final一旦修饰一个类之后,该类的所有方法默认都会加上final修饰。(不包含成员变量)
- 使用final定义的方法不能被子类所覆写。
- 使用final定义的变量就成为了常量,常量必须在声明时赋值,并且不能被修改。
public final int a=10;
数据类型转换
当使用+、-、*、/、%等数学运算时,遵循以下原则:
1.只要两个操作数中有一个是double/float/long类型,另外一个自动转为double/float/long类型,
结果也是double/float/long
2.操作数为byte、short、int、char时,两个操作数均会转为int类型,结果也是int
3.但是被final修饰的变量,数据类型不会发生上述变化!!!