public void setName(String name)
{
this.name = name;
}
或者写
public void setname(String s){
name = s;
}
哪个更好?第一个好。
在 Java 中,通常推荐使用第一种方式,即遵循标准的 JavaBean 命名规范,使用 setName
方法。以下是详细对比和建议:
setName(String name)
java
public void setName(String name) {
this.name = name;
}
set
开头,后跟首字母大写的属性名(如 name
→ setName
)。这是 Java 社区广泛接受的做法,提高了代码的可读性和可维护性。setname(String s)
java
public void setname(String s) {
name = s;
}
setname
中的 n
小写,违反了 JavaBean 的命名约定(属性名 name
对应的 setter 应为 setName
)。setname
为 name
的 setter,导致代码补全、序列化等功能异常。使用 this
关键字:
第一种方式中使用 this.name = name
更清晰地表明是将参数赋值给当前对象的属性,避免变量名冲突。
参数名与属性名一致:
推荐参数名与属性名保持一致(如 setName(String name)
),这样代码更直观,也符合 Java 社区的习惯。
IDE 自动生成:
大多数 IDE 可以自动生成符合规范的 getter/setter,避免手动编写时出错。例如在 IntelliJ 中,右键点击类 → Generate
→ Getter and Setter
。
推荐使用第一种方式(setName(String name)
),因为它符合 Java 标准,提高了代码的可读性和兼容性。第二种方式虽然在语法上正确,但会给代码维护带来不必要的麻烦。
在 Java 里,构造方法是一种特殊的方法,其主要作用是在创建对象时对对象的属性进行初始化。构造方法的名字必须和类名一样,而且没有返回类型(连 void
也不用写)。
我想要输入:
3
-5
但实际的代码运行里面输入了3 换行以后代码就跑了
package PTA_training.Demo3_2;
import java.util.Scanner;
/*
/*
7-2 正方形类
定义一个正方形类square,在次类中包括写内容:
定义成员变量边长private int edge;
定义方法:包括构造方法,setter getter方法,求面积方法等,要求如下所示:
定义正方形类的构造方法:在构造方法中给edge赋值为2,并添加System.out.println("this is constructor method");
为成员变量edge设置set方法,用来接收用户给edge的值,如果用户给的值<=0,则设置edge值为1
为成员变量edge设置get方法,用来返回edge的值
完成求面积方法,得到正方形的面积:public int getArea()
定义类Main,并在main方法中, 1.首先创建正方形对象s1,然后通过getEdge()方法输出edge的值,然后调用getArea方法求出s1的面积并输出
2.创建正方形对象s2,并通过键盘输入s2对象的边的值,然后通过getEdge()方法输出edge的值,然后调用getArea方法求出s1的面积并输出
输入格式:
输入在一行中给出边的值。
输出格式:
输出s1对象的边、输出s1对象的面积
输出s2对象的边、s2对象的面积
输入样例:
在这里给出一组输入。例如:
3
-5
输出样例:
在这里给出相应的输出。例如:
this is constructor method
s1:edge=2
s1:area=4
this is constructor method
s2:edge=3
s2:area=9
this is constructor method
s1:edge=2
s1:area=4
this is constructor method
s2:edge=1
s2:area=1
*/
public class Main {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
while (scanner.hasNext()){
int inputEdge = scanner.nextInt();
Square s1 = new Square();
System.out.printf("s1:edge=%d%n",s1.getEdge());
System.out.printf("s1:area=%d%n",s1.getArea());
Square s2 = new Square();
s2.setEdge(inputEdge);
System.out.printf("s2:edge=%d%n",s2.getEdge());
System.out.printf("s2:area=%d%n",s2.getArea());
} scanner.close();
}
}
给出的改进
package PTA_training.Demo3_2;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int inputEdge = scanner.nextInt();
Square s1 = new Square();
System.out.printf("s1:edge=%d%n", s1.getEdge());
System.out.printf("s1:area=%d%n", s1.getArea());
Square s2 = new Square();
s2.setEdge(inputEdge);
System.out.printf("s2:edge=%d%n", s2.getEdge());
System.out.printf("s2:area=%d%n", s2.getArea());
}
scanner.close();
}
}
在 Java 里,抽象类是一种无法被实例化的类,其存在意义在于为子类提供共同的属性与方法定义。下面为你详细介绍抽象类的关键特性和使用场景。
下面是抽象类的基本语法示例:
java
public abstract class Animal {
// 普通字段
protected String name;
// 构造函数
public Animal(String name) {
this.name = name;
}
// 普通方法
public void eat() {
System.out.println(name + "正在吃东西");
}
// 抽象方法
public abstract void sound();
}
// 子类实现抽象方法
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void sound() {
System.out.println(name + "汪汪叫");
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
// Animal animal = new Animal("动物"); // 错误,无法实例化抽象类
Dog dog = new Dog("小狗");
dog.eat(); // 输出: 小狗正在吃东西
dog.sound(); // 输出: 小狗汪汪叫
}
}
public
的,也可以显式声明为protected
,但不能是private
。在 Java 中,super
关键字主要用于引用父类的成员(包括构造方法、字段和方法)。它在继承关系中起着重要作用,能够帮助子类访问和调用父类的相关内容。下面详细介绍super
关键字的用法和注意事项。
子类调用父类。
super([参数列表])
super()
调用父类的构造方法,必须放在子类构造方法的第一行。java
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name); // 调用父类的构造方法
this.breed = breed;
}
}
super.字段名
super
来引用父类的字段。java
class Parent {
protected int value = 10;
}
class Child extends Parent {
private int value = 20;
public void printValues() {
System.out.println("子类的值:" + value); // 20
System.out.println("父类的值:" + super.value); // 10
}
}
super.方法名([参数列表])
super
调用父类的原始方法。java
class Shape {
public void draw() {
System.out.println("绘制形状");
}
}
class Circle extends Shape {
@Override
public void draw() {
super.draw(); // 调用父类的方法
System.out.println("绘制圆形");
}
}
super()
,编译器会自动添加一个无参的super()
。super
不能用于静态方法,因为静态方法属于类,不存在继承关系。super
只能访问父类中public
和protected
修饰的成员。super
关键字是 Java 中处理继承关系的重要工具,它使得子类能够灵活地访问和使用父类的成员,增强了代码的可维护性和扩展性。通过合理使用super
,可以避免代码重复,构建更清晰的类层次结构。
抽象类必须通过子类继承并实现其所有抽象方法后才能使用。下面通过一个完整的例子帮你理解抽象类的用法:
假设我们有一个抽象类 Shape
,包含抽象方法 calculateArea()
和普通方法 display()
:
java
// 抽象类:形状
public abstract class Shape {
protected String color;
// 构造方法
public Shape(String color) {
this.color = color;
}
// 抽象方法:计算面积(必须由子类实现)
public abstract double calculateArea();
// 普通方法:显示信息
public void display() {
System.out.println("颜色:" + color + ",面积:" + calculateArea());
}
}
创建具体子类(如 Circle
和 Rectangle
),继承 Shape
并实现抽象方法:
java
// 子类:圆形
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color); // 调用父类构造方法
this.radius = radius;
}
// 实现抽象方法:计算圆的面积
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
// 子类:矩形
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(String color, double width, double height) {
super(color); // 调用父类构造方法
this.width = width;
this.height = height;
}
// 实现抽象方法:计算矩形的面积
@Override
public double calculateArea() {
return width * height;
}
}
通过子类实例化对象,并调用父类的方法(包括抽象方法的实现):
java
public class Main {
public static void main(String[] args) {
// 错误:无法直接实例化抽象类
// Shape shape = new Shape("红色");
// 正确:通过子类创建对象
Shape circle = new Circle("红色", 5.0);
Shape rectangle = new Rectangle("蓝色", 4.0, 6.0);
// 调用父类的方法(自动使用子类的实现)
circle.display(); // 输出:颜色:红色,面积:78.5398...
rectangle.display(); // 输出:颜色:蓝色,面积:24.0
}
}
Shape circle = new Circle()
),可以实现多态调用。Q:如果子类只实现了部分抽象方法会怎样?
A: 子类必须被声明为 abstract
,否则会编译错误。
Q:抽象类可以有构造方法吗?
A: 可以,但构造方法只能被子类调用(通过 super()
),不能直接创建对象。
Q:抽象类和接口的区别是什么?
A: 抽象类可以包含普通方法和字段,而接口中的方法默认是抽象的(Java 8+ 支持默认方法)。
通过这种方式,抽象类可以作为 “模板”,强制子类实现特定行为,同时共享通用逻辑。
在 Java 中,实现抽象方法和重写(Override)方法本质上是同一个操作。当子类继承抽象类时,必须重写(实现)抽象类中的所有抽象方法,否则子类也会被视为抽象类。
抽象方法:
abstract
关键字声明,例如: java
public abstract void calculateArea(); // 没有方法体
实现抽象方法:
java
@Override
public double calculateArea() {
return Math.PI * radius * radius; // 具体实现
}
@Override 注解:
java
// 抽象类
abstract class Animal {
public abstract void sound(); // 抽象方法
}
// 子类必须实现抽象方法
class Dog extends Animal {
@Override
public void sound() {
System.out.println("汪汪叫");
}
}
// 如果子类不实现抽象方法,则子类也必须声明为抽象类
abstract class Bird extends Animal {
// 未实现 sound() 方法,Bird 必须是抽象类
}
重写 vs 重载:
抽象方法只能在抽象类中声明,但抽象类中可以有普通方法(不需要子类重写)。
通过重写抽象方法,子类能够遵循抽象类定义的 “契约”,同时实现自己的独特逻辑。