Skip to content Skip to footer

#JAVA开发# 一文搞懂什么是java中的类!!!

一、什么是Java中的类?

一、类的基本概念

在Java中,类是一种创建对象的模板,对象是类的一个实例,具有状态和行为。例如,定义一个“狗”类,狗的颜色、名字、品种等是它的状态,摇尾巴、叫、吃等是它的行为。一个Java源文件(.java文件)可以包含多个类,但只能有一个用public修饰的class。

二、类的组成要素

(一)成员变量

定义与位置

成员变量是定义在类中、方法体之外的变量。在创建对象时实例化,可被类中的方法、构造方法和特定类的语句块访问。

修饰符与类型

修饰符可以是public、protected、private三选一,还可以有static、final等。使用了static的就是静态变量,例如在学生类中,定义一个静态的学校名称变量,这个变量被所有学生类的实例共享;被final修饰的变量一旦初始化就不能修改。

(二)方法

功能与定义

方法是语句的集合,在一起执行一个功能。它包含于类或对象中,在程序中被创建,在其他地方被引用。例如,定义一个计算两个数之和的方法,包含方法名、形参列表、方法体语句和返回值类型(如果不是void类型则需要在方法体中使用return返回相应的值)。

修饰符

修饰符可以是public、protected、private三选一,还可以有static、final、synchronize、native等。使用static就是静态方法,可直接通过类名调用。

(三)构造器

格式与特点

构造器的定义格式为[修饰符]与类名相同的名(形参列表) {构造器方法体代码},名称与类名相同,没有返回值,不能写void。如果类中没有手动添加构造器,编译器会默认添加一个无参构造器,并且构造器可以重载。

三、类的修饰符

(一)访问修饰符

public

具有最大的访问权限,被public修饰的类、成员变量或方法可以被任何类访问。例如,一个公共的工具类中的方法,可在整个项目的任何地方被调用。

private

修饰成员类(内部类)表明是私有类,只能被顶层的类访问;修饰成员变量或方法时,只能在本类内部访问,外界无法访问,如一个类中的私有成员变量,只有本类的方法可以操作它。

protected

一般修饰类中的成员变量。当子类和父类在同一个包中时,被声明为protected的变量能被同一个包中的任何类访问;当子类和父类不在同一个包中时,在子类中,子类实例可以访问从父类集成的protected方法,而父类实例不能访问protected方法,就像给子类一定的访问权限而限制父类实例的访问。

default(缺省值)

对于顶级类(外部类)来说,使用缺省定义的成员类或者成员变量、成员函数,只有同一个包和本类可以访问。

(二)其他修饰符/非访问控制符

abstract

抽象类不能被实例化,抽象类中的抽象方法在子类中必须被实现,否则子类仍然是abstract的。例如定义一个抽象的图形类,里面有计算面积的抽象方法,具体的图形类(如圆形类、矩形类)继承这个抽象图形类并实现计算面积的方法。

static

静态成员变量只加载一次且只有一份,其生命周期与类的生命周期同步,位于方法区,被所有类的实例共享,可直接通过类名来访问;静态方法也是类似,不需要创建对象就可以调用。

final

final修饰的方法不能被子类所覆盖;final修饰的变量一旦初始化就不能被修改。

二、Java类的继承机制详解

Java中的继承是面向对象编程的核心特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,可以实现代码的复用和扩展,提高开发效率。以下是关于Java类继承机制的详细解释:

定义:

继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而使子类具有父类的特征和行为。在Java中,使用extends关键字来表示继承关系。

语法:

public class SubClass extends SuperClass {

// 子类的定义

}

SubClass是子类,SuperClass是父类。

继承的特点:

单继承:Java只支持单继承,即一个子类只能继承一个父类。多层继承:虽然Java不支持多继承,但支持多层继承,即子类可以继承父类,父类又可以继承它的父类。继承的传递性:如果A类继承B类,B类继承C类,那么A类也继承C类的属性和方法。

继承的内容:

子类可以继承父类的所有非私有属性和所有方法(包括构造方法)。子类不能继承父类的私有属性,但可以通过父类提供的公共方法来访问这些私有属性。

构造方法的继承:

子类不能直接继承父类的构造方法,但可以通过super关键字调用父类的构造方法。子类的构造方法中会隐式地调用父类的无参构造方法,如果父类没有无参构造方法,则需要显式地调用父类的其他构造方法。

方法重写:

子类可以重写父类的方法,以提供不同的实现。重写的方法必须与被重写的方法具有相同的方法名称、参数列表和返回类型。重写的方法不能使用比被重写的方法更严格的访问权限。

super关键字:

super关键字用于引用父类的对象。可以通过super调用父类的构造方法和方法。super必须是子类构造方法的第一条语句。

继承的优点:

代码复用:通过继承,可以复用父类的代码,减少代码冗余。可扩展性:通过继承,可以在不修改父类的情况下,扩展父类的功能。多态性:继承是实现多态的基础,通过多态可以实现更加灵活的代码设计。

继承的缺点:

侵入性:子类必须继承父类的所有属性和方法,即使有些属性和方法并不适用。紧耦合:子类和父类之间存在紧密的耦合关系,父类的变化可能会影响到子类。

示例:

// 父类

public class Animal {

private String name;

private int age;

public Animal(String name, int age) {

this.name = name;

this.age = age;

}

public void eat() {

System.out.println("This animal is eating.");

}

public void sleep() {

System.out.println("This animal is sleeping.");

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

// 子类

public class Dog extends Animal {

public Dog(String name, int age) {

super(name, age);

}

@Override

public void eat() {

System.out.println("The dog is eating.");

}

public void bark() {

System.out.println("The dog is barking.");

}

}

// 测试

public class Test {

public static void main(String[] args) {

Dog dog = new Dog("Buddy", 3);

dog.eat(); // 输出: The dog is eating.

dog.sleep(); // 输出: This animal is sleeping.

dog.bark(); // 输出: The dog is barking.

}

}

在这个示例中,Dog类继承了Animal类,并重写了eat方法,同时添加了新的方法bark。通过super关键字,Dog类的构造方法调用了Animal类的构造方法。

通过以上内容,可以全面了解Java类的继承机制及其应用。

三、Java接口与抽象类区别

Java接口和抽象类的区别主要体现在以下几个方面:

一、语法层面上的区别

特性抽象类接口成员方法实现可以提供成员方法的实现细节只能存在public abstract(隐式声明)方法,JDK1.8开始可以有默认方法和静态方法成员变量类型可以是各种类型的只能是public static final(隐式声明)类型的,即常量静态代码块和静态方法可以有不能含有类的继承与实现一个类只能继承一个抽象类一个类可以实现多个接口构造方法可以有无构造方法,不能被实例化

二、设计层面上的区别

抽象类:

是对一种事务的抽象,是对整个类进行抽象,包括属性、行为(方法)。作为很多子类的父类,是一种模板设计。如果需要添加新的方法,可以直接在抽象类中添加实现,子类可以不用变更。

接口:

是对行为(行为)的抽象。是一种规范,是一种辐射式设计。如果接口进行了变更,那么实现它的类都需要做变更。

三、使用场景

抽象类:适用于有共同属性和方法的类,适合提供部分实现,规范方法协调。接口:常用于类间的协调,实现多重继承,适用于实现多种功能或行为的类。

四、其他注意事项

如果拥有一些方法,并想让他们中的一些有默认的具体实现,请选择抽象类。如果想实现多重继承,那么请使用接口,由于Java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口。如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。

四、Java中代码类的示例

[简单的Hello World类]

在Java中,一个简单的Hello World类示例如下:

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello, World!");

}

}

这个类包含一个main方法,它是Java程序的入口点。在main方法中,使用System.out.println 输出了"Hello, World!"。

[包含成员变量和方法的类]

class Rectangle {

// 成员变量

private double length;

private double width;

// 构造方法

public Rectangle(double length, double width) {

this.length = length;

this.width = width;

}

// 计算面积的方法

public double calculateArea() {

return length * width;

}

// 获取长度的方法

public double getLength() {

return length;

}

// 设置长度的方法

public void setLength(double length) {

this.length = length;

}

// 获取宽度的方法

public double getWidth() {

return width;

}

// 设置宽度的方法

public void setWidth(double width) {

this.width = width;

}

}

这个Rectangle类有两个成员变量length和width,构造方法用于初始化对象,还有计算面积、获取和设置长度与宽度的方法。

[继承关系中的类示例]

class Animal {

public void eat() {

System.out.println("Animal is eating.");

}

}

class Dog extends Animal {

public void bark() {

System.out.println("Dog is barking.");

}

}

这里Dog类继承自Animal类。Animal类有eat方法,Dog类除了继承eat方法外,还有自己的bark方法。

五、Java类的封装特性介绍

Java类的封装性是Java面向对象编程的三大特性之一(另外两个是继承和多态)。封装性主要是指将类的内部数据和操作这些数据的方法绑定在一起,并对外部隐藏类的内部实现细节,只暴露必要的接口供外部使用。这种机制有助于提高代码的安全性和可维护性。

以下是关于Java类封装特性的详细介绍:

定义:

封装性是指将对象的属性和方法结合在一起,形成一个独立的单元。通过封装,可以保护对象的内部状态,防止外部直接访问和修改。在Java中,封装主要通过访问修饰符(如private、default、protected、public)来实现,控制类、变量和方法的访问权限。

实现:

私有化属性:使用private关键字将类的属性声明为私有,这样外部就不能直接访问这些属性。提供公共方法:通过提供公共的getter和setter方法,允许外部以受控的方式访问和修改私有属性。

优点:

减少耦合:良好的封装能够减少类之间的耦合度,使类的内部结构可以自由修改,而不影响外部代码。提高安全性:通过封装,可以防止外部代码对类的内部数据进行非法操作,从而提高代码的安全性。增强可维护性:封装使得类的内部实现细节对外部透明,便于维护和扩展。

示例:

在这个示例中,Person类的name和age属性被声明为私有,外部不能直接访问。通过getName、setName、getAge和setAge方法,可以以受控的方式访问和修改这些属性。

总结:

封装是Java面向对象编程的重要特性之一,通过封装可以提高代码的安全性和可维护性。封装主要通过访问修饰符来实现,控制类、变量和方法的访问权限。提供公共的getter和setter方法,允许外部以受控的方式访问和修改私有属性。

通过以上介绍,希望你对Java类的封装特性有了更深入的理解。如果你有任何疑问或需要进一步的解释,请随时提问。