java中的关键字

一、关键字:this

this是什么?
1、在Java中,this关键字比较难理解,它的作用和其词义很接近。

  • 它在方法内部使用,即这个方法所属对象的引用;
  • 它在构造器内部使用,表示该构造器正在初始化的对象。

2、 this 可以调用类的属性、方法和构造器
3、 什么时候使用this关键字呢?

  • 当在方法内需要用到调用该方法的对象时,就用this。
    具体的:我们可以用this来区分属性和局部变量。
    比如:this.name = name;

4、this的使用在这里插入图片描述
在这里插入图片描述
注意:
① 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
② 明确:构造器中不能通过"this(形参列表)“的方式调用自身构造器
③ 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)”
④ "this(形参列表)“必须声明在类的构造器的首行!
⑤ 在类的一个构造器中,最多只能声明一个"this(形参列表)”

二、关键字:super

1、在Java类中使用super来调用父类中的指定操作:

  • super可用于访问父类中定义的属性
  • super可用于调用父类中定义的成员方法
  • super可用于在子类构造器中调用父类的构造器

2、注意:

  • 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
  • super的追溯不仅限于直接父类
  • super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识

关键字super举例:

class protected Person {
	String name = "张三";
	protected int age;
	public String getInfo() {
		return "Name: " + name + "\nage: " + age; 
	} 
}
class Student extends Person {
	protected String name = "李四";
	private String school = "New Oriental";
	public String getSchool() {
		return school; 
	}
	public String getInfo() {
		return super.getInfo() + "\nschool: " + school;
	}
}
public class StudentTest {
	public static void main(String[] args) {
		Student st = new Student();
		System.out.println(st.getInfo());
	}
}

3、调用父类的构造器

  • 子类中所有的构造器默认都会访问父类中空参数的构造器
  • 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
  • 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

调用父类构造器举例

public class Person {
	private String name;
	private int age;
	private Date birthDate;
	public Person(String name, int age, Date d) {
		this.name = name;
		this.age = age;
		this.birthDate = d; 
	}
	public Person(String name, int age) {
		this(name, age, null);
	}
	public Person(String name, Date d) {
		this(name, 30, d);
	}
	public Person(String name) {
		this(name, 30);
	} 
}

public class Student extends Person {
	private String school;
	public Student(String name, int age, String s) {
		super(name, age);
		school = s; 
	}
	public Student(String name, String s) {
		super(name);
		school = s; 
	}
	// 编译出错: no super(),系统将调用父类无参数的构造器。
	public Student(String s) { 
		school = s; 
	} 
}

4、this和super的区别
在这里插入图片描述

三、子类对象实例化过程

在这里插入图片描述

class Creature {
	public Creature() {
		System.out.println("Creature无参数的构造器");
	}
}
class Animal extends Creature {
	public Animal(String name) {
		System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
	}
	public Animal(String name, int age) {
		this(name);
		System.out.println("Animal带两个参数的构造器,其age为" + age);
	}
}
public class Wolf extends Animal {
	public Wolf() {
		super("灰太狼", 3);
		System.out.println("Wolf无参数的构造器");
	}
	public static void main(String[] args) {
		new Wolf();
	}
}

四、instanceof 操作符

1、x instanceof A:检验x是否为类A的对象,返回值为boolean型。

  • 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
  • 如果x属于类A的子类B,x instanceof A值也为true。
public class Person extends Object {}
public class Student extends Person {}
public class Graduate extends Person {}

public void method1(Person e) {
if (e instanceof Person) 
// 处理Person类及其子类对象
if (e instanceof Student) 
//处理Student类及其子类对象
if (e instanceof Graduate)
//处理Graduate类及其子类对象
}

2、对象类型转换 (Casting )
①基本数据类型的Casting:

  • 自动类型转换:小的数据类型可以自动转换成大的数据类型,如long g=20; double d=12.0f
  • 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型,如 float f=(float)12.0; int a=(int)1200L

②对Java对象的强制类型转换称为造型

  • 从子类到父类的类型转换可以自动进行
  • 从父类到子类的类型转换必须通过造型(强制类型转换)实现
  • 无继承关系的引用类型间的转换是非法的
  • 在造型前可以使用instanceof操作符测试一个对象的类型
public class ConversionTest {
	public static void main(String[] args) {
		double d = 13.4;
		long l = (long) d;
		System.out.println(l);
		int in = 5;
		// boolean b = (boolean)in;
		Object obj = "Hello";
		String objStr = (String) obj;
		System.out.println(objStr);
		Object objPri = new Integer(5);
		// 所以下面代码运行时引发ClassCastException异常
		String str = (String) objPri; 
	}
}
public class Test {
		public void method(Person e) { // 设Person类中没有getschool() 方法
			// System.out.pritnln(e.getschool()); //非法,编译时错误
			if (e instanceof Student) {
				Student me = (Student) e; // 将e强制转换为Student类型
				System.out.pritnln(me.getschool());
			} 
		}
		public static void main(String[] args){
			Test t = new Test();
			Student m = new Student();
			t.method(m);
		} 
}

在这里插入图片描述

class Base {
	int count = 10;
	public void display() {
		System.out.println(this.count);
	} 
}
class Sub extends Base {
	int count = 20;
	public void display() {
		System.out.println(this.count);
	} 
}
public class FieldMethodTest {
	public static void main(String[] args){
		Sub s = new Sub();
		System.out.println(s.count);
		s.display();
		Base b = s;
		System.out.println(b == s);
		System.out.println(b.count);
		b.display();
	} 
}

打印结果:

20
20
true
10
20

3、子类继承父类

  • 若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。
  • 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量

五、关键字:static

1、如果想让一个类的所有实例共享数据,就用类变量!

class Circle{
	private double radius;
	public Circle(double radius){
		this.radius=radius;
	}
	public double findArea(){
		return Math.PI*radius*radius;
	}
}
  • 创建两个Circle对象

Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0

  • Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。
  • 上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。

2、类属性、类方法的设计思想

  • 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
  • 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

3、使用范围:

  • 在Java类中,可用static修饰属性、方法、代码块、内部类

4、被修饰后的成员具备以下特点:

  • 随着类的加载而加载
  • 优先于对象存在
  • 修饰的成员,被所有对象所共享
  • 访问权限允许时,可不创建对象,直接被类调用

5、类变量(class Variable)

  • 类变量(类属性)由该类的所有实例共享
    在这里插入图片描述

6、类变量 vs 实例变量内存解析
在这里插入图片描述
7、类方法(class method)

  • 没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。
  • 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
    在这里插入图片描述
    8、因为不需要实例就可以访问static方法,因此static方法内部不能有this。也不能有super。
    9、static修饰的方法不能被重写
class Person {
	private int id;
	private static int total = 0;
	public static void setTotalPerson(int total){
		this.total=total; //非法,在static方法中不能有this,也不能有super
	}
	public Person() {
		total++;
		id = total;
	}
}
public class PersonTest {
	public static void main(String[] args) {
		Person.setTotalPerson(3);
	} 
}

以上就是关于java中关键字的介绍,如果有不当之处或者遇到什么问题,欢迎在文章下面留言~
如果你想了解更多关于Java的内容,可以查看:Java学习之路
转载请注明:https://blog.csdn.net/weixin_44662961/article/details/105569839

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值