Java 之类与对象

  1. 构造方法如果不写,系统仍然会自动添加无参的构造方法;

  2. 构造方法如果是有参的,那么在对象的实例化,需要提供对应的参数;

  3. 构造方法如果是多个,调用时会自动根据不同的参数选择相应的方法。

1.2 成员变量和局部变量


在这里插入图片描述

其中,成员变量作用域还需要通过下面的访问修饰符来决定。

1.3 访问修饰符


Java 一共有四种修饰符,它们的作用域分别如下:在这里插入图片描述

  • private:表示除类的内部方法之外的任何人都不能访问的元素,它就像一堵墙,当有人试图访问它时,就会在编译时得到错误信息;

  • 默认访问权限:这种权限通过被称为包访问权限,因为在这种权限下,类可以访问在同一个包中的其他类的成员,但是在包之外,这些成员如同指定了private一样;

  • protected:除了默认访问权限之外还有子类的访问;

  • public:表示紧随其后的元素既可以在同一个包内的不同类访问,又可以在不同包内的类访问。

1.4 静态域


  • 实例域:只有当创建实例(对象)之后才被激活使用,这个域是属于实例化对象的;

  • 静态域:这个域是属于类的,不需要类的实例化就可以使用。

1.4.1 为什么使用静态域

我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了。

Java 中被 static 修饰的成员称为静态成员或类成员,它被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。

1.4.2 静态方法

从本质上来说,静态方法与静态域相同,唯一要注意的就是静态方法与非静态方法之间的调用。

  1. 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果想要在静态方法中调用非静态变量,可以通过在静态方法创建类的对象,然后通过对象来访问非静态变量;

  2. 在非静态方法中,则可以直接访问同类的非静态变量和静态变量;

  3. 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。

1.4.3 静态初始化块

在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块,此时如果使用 static 修饰初始化块,就称为静态初始化块。

静态初始化块只会执行一次,即在该类第一次实例化的时候执行一次。同时静态初始化块只能给静态变量赋值,不能给普通的成员变量赋值。

示例

在这里插入图片描述

通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。

2 封装性

========================================================================

2.1 定义


封装是面向对象语言的三大特性之一,另外两个特性是继承和多态。

封装指的是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的 setter/getter 方法来实现对隐藏信息的操作和访问。

2.2 封装的实现步骤


封装的实现步骤为

  1. 修改属性的可见性为 private;

  2. 创建 getter/setter方法用于属性的读写;

  3. 在 getter/setter 方法中加入属性控制语句。

1)不加封装的代码

public class Move {

public static void main(String[] args) {

Hero sharm = new Hero();

System.out.println(“该人物的生命值为”+sharm.lifeValue);

//如果类中的属性不是私有域,就可以通过如下的方式直接修改对象的域,这就破坏了封装性。

sharm.lifeValue = 4000;

System.out.println(“该人物的生命值为”+sharm.lifeValue);

//新建一个对象时,类中的属性还是原来的值

Hero zhao = new Hero();

System.out.println(“该人物的生命值为”+sharm.lifeValue);

}

}

class Hero {

int lifeValue = 5000;

}

2)加入封装的代码

public class Move {

public static void main(String[] args) {

Hero sharm = new Hero();

//3.1 只有通过getter方法来显示属性的值

System.out.println(“该人物的生命值为”+sharm.getLifeValue());

//3.2 这个时候只能通过setter方法来修改属性的值

sharm.setLifeValue(4000);

System.out.println(“该人物的生命值为”+sharm.getLifeValue());

//新建一个对象时,类中的域还是原来的值

Hero zhao = new Hero();

System.out.println(“该人物的生命值为”+sharm.getLifeValue());

}

}

class Hero {

//1 修改属性的可见性,即作用域为private

private int lifeValue = 5000;

/**

  • 2 创建getter/setter方法

  • @return

*/

public int getLifeValue() {

return lifeValue;

}

public void setLifeValue(int lifeValue) {

this.lifeValue = lifeValue;

}

}

2.3 内部类


2.3.1 内部类的定义

内部类(Inner Class)是在另一个类里面的一个类,包含内部类的类称为外部类。

内部类的作用如下

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其它类访问该类;

  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。

2.3.2 内部类的种类

1)成员内部类

  1. Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等;

  2. Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响;

  3. 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:

外部类 外部对象名 = new 外部类;

内部类 内部对象名 =外部对象名.new 内部类( );

在这里插入图片描述

2)静态内部类

静态内部类是 static 修饰的内部类,这种内部类的特点是:

4. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 ;

5. 如果外部类的静态成员与内部类的成员名称相同,可通类名.静态成员访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名直接调用外部类的静态成员;

6. 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类()

3)方法内部类

4)匿名内部类

3 继承性

========================================================================

关键字extends表示继承。如:public class Manager extends Employee{ }; 其中Manager表示子类,Employee表示父类。

一个子类只能有一个父类。

在 IDEA 中,把光标放在父类名称上按 Alt+Enter 可以生成子类。

3.1 super 和 this 的区别


this:this 相当于 Python 的 self,this 关键字表示当前对象的。常用于封装的 setter 方法,如this.property 表示对象的属性,this.method 表示对象的方法。This 表示在同一个类里引用类的属性和方法。

super:当父类的属性和方法是私有时,super 表示子类在继承父类时引用父类的属性和方法。公有的话可以直接引用。

3.2 继承时构造方法的区别


  1. 子类的构造方法中必须调用其父类的构造方法。如果子类的构造方法中没有显式地调用超类的构造方法,则系统就会默认调用父类无参的构造方法;

  2. 如果子类需要显式地调用构造方法,则 super(); 必须在子类的构造方法的第一行;

  3. 利用 super 关键字调用父类对象,子类和父类对象的属性是两个不同的属性。

3.3 继承的初始化顺序


  1. 先初始化父类再初始化子类。

  2. 先执行属性的初始化,再执行构造方法中的初始化。

综合来说:父类属性的初始化 → 父类构造方法的初始化 → 子类属性的初始化 → 子类构造方法的初始化。

3.4 final 关键字


final 表示 “最终的、不可更改的” ,final 可以用来修饰类、方法、属性和变量。

  • 当 final 修饰,代表类不允许被继承;

  • 当 final 修饰方法,则该方法不允许被覆盖(重写);

  • 当 final 修饰属性,则该属性必须赋值,否则系统会报错。当没有 final 关键字时,系统会帮我们为属性赋予默认的值,如int类型的“0”,String 类型的"null";有public关键字的称之为属性,其他称之为变量。

  • 当 final 修饰变量,则该变量只能赋一次值,即变为常量。

3.5 Object 类


Object 类是 Java 世界中所有类最终的父类。

在 Object 类中定义的 toString() 方法的作用是返回对象的哈希码,即对象地址字符串。 实际代码中,语句System.out.println(Class);输出包名.类名@哈希码。这不是重要的。重要的是,我们可以通过重写toString()方法来获得对象的全部属性值。

4 多态性

========================================================================

1)抽象类

若一个类使用 abstract 关键字修饰,则该类为抽象类。其限制并规定子类必须实现某些方法,但是其并不关注子类的实现细节。

2)接口

接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类必须提供某些方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值