封装:
封装概述:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
通过类提供的方法来实现对隐藏信息的操作和访问
封装的两个原则:
- 把所有的属性藏起来
- 把尽可能多的东西藏起来,对外提供便捷的接口
封装的步骤:
1.修改成private
2.设置getter和setter方法
getter方法和setter方法的作用:
1. 提供公共的getter方法,允许其他类通过调用这些方法来获取属性的值,而不是直接访问属性。
2.私有属性提供公共的setter方法,允许其他类通过调用这些方法来修改属性的值,而不是直接修改属性。这样做的好处是可以在setter方法中添加一些逻辑,例如验证输入值的有效性,或者在修改属性值时触发某些事件。
3.在set中设置存储要求
包:
Java中的包机制也是封装的一种形式。
作用:
1.防止命名冲突,同样的名字可以放入不同的包内
2.包外的代码有可能不能访问该类,保护类
包的定义:
注意:package是关键字,package必须位于第一行(忽略注释行)只允许有一个package语句
package QuestionTxt04;
包的使用:
导入包用import
类的访问修饰:
修饰符:
static修饰符:
使用static关键词可以通过类名加"."直接调用类的成员,不需要创建类的对象,使用static修饰的方法属于类,不属于具体的某个对象。
1.静态变量
静态变量只在类加载的时候获取一次内存空间,这使得静态变量很节省内存空间。
- 用static关键字的属性成为静态变量或者类变量,
- static关键词修饰属性最常见的就是定义使用final关键字修饰的常量,常量要赋初始值 ,常量名一般由大写字母组成
定义静态变量:
public static int staticVar;
调用静态变量:类名.静态变量名
public class MyClass {
// 定义一个静态变量
public static int staticVar = 10;
public static void main(String[] args) {
// 通过类名访问静态变量
System.out.println("静态变量的值:" + MyClass.staticVar);
}
}
2.静态方法
方法上加了 static 关键字,那么它就是一个静态方法:
- 静态方法属于这个类而不是这个类的对象;
- 调用静态方法的时候不需要创建这个类的对象,
- 静态方法不能访问非静态变量和调用非静态方法。
定义静态方法:方法加上static
public static void staticMethod() {
}
调用静态方法:类名.方法()
public class MyClass {
// 静态方法
static void staticMethod() {
System.out.println("This is a static method.");
}
public static void main(String[] args) {
// 调用静态方法
MyClass.staticMethod();
// 直接通过类名调用静态方法
}
}
3.静态代码块
用一个 static 关键字,外加一个大括号括起来的代码被称为静态代码块。
- 静态代码先于
main()
方法执行 - 静态代码块通常用来初始化一些静态变量;
public class StaticBlock {
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
System.out.println("main 方法");
}
}
// 结果是静态代码块先输出
继承:
继承是面向对象三大特性之一,解决代码冗余问题,Java只支持单继承
1.继承语法格式:
访问修饰符 class Dog extends Animal{
}
Java中,子类可以从父类继承:
- 可以继承public 和 protected修饰的属性和方法,不论子类和父类是否在同一个包里
- 无法继承父类的构造方法和private成员
- 可以继承默认访问修饰符(就是不写public和private,直接空着),但是子类和父类要在同一个包里
2.使用super关键字调用父类成员
局部变量与成员变量重名是,成员变量会被屏蔽,若要访问成员变量要用this.成员变量名,但是this只能在构造方法中使用,所以就有了super,super关键字可以访问父类的构造方法,访问父类的属性和一般方法,super关键字用在子类当中
注意:
- super调用构造方法时,只能是第一句
- super只能出现在子类的方法和构造方法中,主方法不行
- super不能访问父类的private成员
访问父类构造函数:super(参数)
访问父类属性/方法:super.<父类属性或方法>
super(age,name,sex) 访问父类构造函数
super.age 访问父类属性
super.print() 访问父类方法
super关键字实例:
它将首先执行父类的makeSound
方法,然后执行子类特有的行为。
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // 调用父类的构造方法来初始化name字段
this.breed = breed;
}
void makeSound() {
super.makeSound(); // 调用父类的makeSound方法
System.out.println("Dog barks");
}
}
3.实例化子类对象
当在java中创造一个对象的时候,会首先执行父类的构造方法,然后才执行子类的构造方法,按照父类,子类的顺序执行构造方法
一个类的构造方法有两种情况会被执行:
1.创建该类的对象,实例化
2.创建该类的子类的对象,
子类继承父类时构造方法的调用规则:
1.子类没有用super(参数)调用构造方法,系统会默认先调用父类的无参构造方法,和super()一个意思,加不加都行
2.如果子类中使用super(参数)调用了父类的有参构造,那么将执行父类相应的构造方法,而不是父类的无参构造
4.Object类
Object类是所有类的父类,所有的java类都直接或间接继承了Object类