this
关键字代表当前对象的引用,可以用于访问当前对象的成员变量、成员方法和构造方法。在以下情况下常用到 this
:
public class Person {
public String name;
public void setName(String name) {
// 成员变量与局部变量不同名,this 可以省略。
this.name = name;
}
}
public class Person {
public void eat() {
}
public void work() {
// this 调用成员方法时,可以省略 this
this.eat();
}
}
public class Person {
public String name;
public int age;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
// 调用重载的构造方法
this(name);
this.age = age;
}
}
因为 this 是在对象内部代表自身的引用,所有 this 只能调用实例变量、实例方法和构造方法,不能调用类方法、类变量也不能调用局部变量
包(Package)用于组织和管理 Java 程序,将相同功能或类别的类放在同一个包中。包的作用如下:
在 Java 代码文件的开头使用 package
关键字声明所属的包,通常与文件路径相对应。
例如,一个名为 “com.example” 的包,可以这样声明:
package com.example;
1. 命名包不能以 java、javax 开头。
2. 同包下或者子包下的类不需要导包,java.lang 包下的类不需要导包。
3. 使用非同包下的类需要先导包或者使用全限定类名。
Java 中有四种(三个,一个为空)访问修饰符,用于控制类、成员变量和方法的访问权限:
public
:公共访问,在所有类内可见。protected
:受保护访问,同包内和子类可见。private
:私有访问,仅在当前类内可见。package-private
或 package-access
:默认访问修饰符,仅在同一包内可见。类的访问修饰符可以是 public
或 (不写) package-private
。
public class MyClass
:该类对所有其他类都可见。class MyClass
:该类仅对同一包内的其他类可见。成员变量、方法和构造方法的访问修饰符可以是 public
、protected
、private
或 (不写) package-private
。
public int num
:该成员对所有其他类都可见。protected String name
:该成员对同一包内的其他类和子类可见。private double price
:该成员仅对当前类可见。int count
:该成员仅对同一包内的其他类可见。封装(Encapsulation)是面向对象编程中的一项重要原则,指的是将数据和对数据的操作封装在一个类中,通过公共接口控制对数据的访问。
封装有以下好处:
在类中,可以使用 private
访问修饰符来限制成员变量的直接访问。通过提供公共的 getter 和 setter 方法来间接访问和修改私有成员变量。
示例代码:
public class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
对字段值设置合法性检查,需要在 setter 方法中进一步利用条件判断语句进行赋值限制
Java 提供了包装类(Wrapper Class)来表示基本数据类型的对象形式,如下:
基本类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
包装类的默认值都是 null
。
例如,Integer
类的初始值是 null
,而不是基本类型 int
的默认值 0
。
示例代码:
Integer num = null;
System.out.println(num); // 输出为 null
Java 提供了自动装箱(Autoboxing)和自动拆箱(Unboxing)机制,使得基本类型和包装类之间的转换更加方便。
示例代码:
// 自动装箱
Integer i = 42;
// 自动拆箱
int num = i;
继承(Inheritance)是面向对象编程中的一个重要概念,允许子类继承父类的属性和方法。它提供了一种有效的方式来重用代码和组织类层次结构。但是过度使用继承可能会导致复杂的代码结构和性能问题,因此需要谨慎使用。
继承有以下好处:
在 Java 中,使用 extends
关键字实现继承。子类可以继承父类的非私有成员和方法,并可以重写父类的方法。
示例代码:
public class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat is eating.");
}
}
继承使子类获得了父类的以下内容:
示例代码:
public class Animal { }
public class Mammal extends Animal { }
public class Cat extends Mammal { }
在上述示例中,Cat
类直接继承自 Mammal
,而 Mammal
类间接继承自 Animal
。
子类可以重写父类的方法,即提供自己的实现。使用 @Override
注解可以明确表示一个方法是重写父类的方法。
示例代码:
public class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat is eating.");
}
}
+ 方法重载是在一个类中定义多个同名但参数不同的方法,而方法重写是在子类中重写父类的方法,方法名和参数都相同。
方法重载是编译时多态,方法重写是运行时的多态。
+ 重写方法必须与被重写方法同名、同参、同返回
instanceof
是 Java 中的关键字,用于判断一个对象是否是某个类的实例或子类的实例。它可以用来做类型检查和类型转换。
示例代码:
Animal cat = new Cat();
if (cat instanceof Cat) {
System.out.println("cat is an instance of Cat");
}
if (cat instanceof Animal) {
System.out.println("cat is an instance of Animal");
}
在 Java 中,Object
是所有类的直接或间接父类。它定义了一些通用方法,如 equals()
、toString()
等。
final
是 Java 中的关键字,可以修饰类、方法和变量。
final class MyClass
:该类不能被继承。final void myMethod()
:该方法不能被子类重写。final int num
:该变量是一个常量,不能再次赋值。在 Java 中,实例化一个对象的过程主要分为以下几个步骤: