类的概念:
在Java编程语言中,类(Class)是一个用户定义的数据类型,用于创建对象。类是对象的蓝图或模板,它定义了对象的属性(即变量或数据成员)和方法(即函数或操作)。通过类,我们可以创建具有相同属性和方法的多个对象。
//类(设计图):是对象共同特征的描述
//对象:是真实存在的具体东西
//在Java中必须先设计类,才能获取对象
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)
3.构造器
4.代码块
5.内部类
}
如何得到类的对象
类名 对象名 = new 类名();
例子:创建的都是Class。
public class Dog {
// 属性
String name;
int age;
String breed;
// 方法
void bark() {
System.out.println("Woof woof!");
}
void setName(String name) {
this.name = name;
}
String getName() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog(); // 创建一个Dog对象
myDog.setName("Buddy"); // 使用setName方法设置名字
myDog.bark(); // 调用bark方法,使狗叫
System.out.println("My dog's name is " + myDog.getName()); // 获取并打印狗的名字
}
}
封装:
封装是面向对象编程(OOP)中的一个核心概念,指的是将对象的状态(数据)和行为(方法)包装成一个独立的单元,并对外部隐藏其内部的实现细节。这种封装的方式将数据和方法捆绑在一起,形成一个称为类的单元,从而提高了代码的可维护性、可重用性和安全性。
封装的主要目标包括数据隐藏和接口抽象。数据隐藏意味着对象的内部状态(成员变量)被隐藏,只有通过对象的方法才能访问或修改这些数据。这可以防止外部直接修改对象的内部状态,从而确保了数据的安全性。接口抽象则是只暴露对象的有限接口(方法),隐藏了实现细节,使得代码更容易理解、扩展和维护。
在Java中,封装通常通过以下方式实现:
- 将类的属性(成员变量)声明为私有的(private),这样外部类就不能直接访问或修改这些属性的值。
- 提供公共的(public)方法(如
set
和get
方法)来访问和修改私有的属性。这些方法允许外部类以受控的方式与类的内部状态进行交互。
封装的好处在于:
它将变化隔离,使得代码更易于维护和修改。
它提高了代码的重用性,因为类可以作为一个独立的单元在不同的地方重复使用。
它提高了代码的安全性,因为通过封装,可以限制对对象内部状态的直接访问,从而防止潜在的错误或不当操作。
set和get
在Java中,set
和get
方法是用于实现类的封装访问的重要工具。它们通常与类的属性(即成员变量)一起使用,以提供对这些属性的安全访问和修改。
set
方法用于给类的属性赋值。当你有一个私有的成员变量,并且希望从类的外部修改其值时,你会使用set
方法。这样,你可以通过这个方法来控制对属性的访问,并进行必要的验证或处理。set
方法的命名通常以其所设置的属性名开始,并以set
为前缀,例如setName()
。
get
方法用于获取类的属性值。与set
方法类似,当你有一个私有的成员变量,并且希望从类的外部获取其值时,你会使用get
方法。通过get
方法,你可以返回属性的当前值,同时确保外部代码不能直接修改它。get
方法的命名通常以其所获取的属性名开始,并以get
为前缀,例如getName()
。
public class GirlFriend {
private String name;
private int age;
private String gender;
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
public void setName(String n){
name=n;
}
public String getName (){
return name;
}
public void setAge(int a){
if(a>=18&&a<=50){
age=a;
}
else System.out.println("非法参数");
}
public int getAge(){
return age;
}
public void setGender(String g){
gender=g;
}
public String getGender(){
return gender;
}
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
public class GirlFriendTest {
public static void main(String[] args) {
GirlFriend gf1=new GirlFriend();
gf1.setName("小卡") ;
gf1.setAge(27) ;
gf1.setGender("fgh") ;
System .out.println(gf1.getName() );
System .out.println(gf1.getGender() );
System .out.println(gf1.getAge() );
}
}
就近原则:
Java中的“就近原则”主要指的是在变量或方法名称解析时,编译器会优先选择离当前代码块最近(逻辑上最近)的变量或方法。这个原则在Java编程中尤为重要,特别是在处理变量作用域和名称冲突时。
具体来说,当在一个代码块(如方法、循环或条件语句)内部声明了一个变量,并且这个变量与外部作用域中的某个变量同名时,Java编译器会根据“就近原则”来解析这个变量的引用。它会首先在当前代码块中查找该变量的声明,如果找到了,就使用这个变量;如果没有找到,编译器会继续向外层作用域查找,直到找到匹配的变量声明或者达到最外层作用域为止。
这个原则在处理局部变量和成员变量(包括实例变量和静态变量)之间的冲突时特别有用。例如,如果在一个方法中声明了一个局部变量,它的名字与类的成员变量相同,那么在方法内部引用这个变量时,Java编译器会优先使用局部变量,因为它在逻辑上离当前的代码块更近。
此外,“就近原则”也适用于方法重载的解析。当调用一个方法时,Java编译器会根据参数列表和当前作用域内可见的方法定义来匹配最合适的方法。如果有多个方法具有相同的名字但参数列表不同(即方法重载),编译器会根据传递的参数类型和数量来选择最合适的方法。
this关键字:
在Java中,this
是一个特殊的关键字,它用于引用当前对象实例。this
关键字在多种情况下都非常有用,查找了一下主要有以下几个用途:
引用当前对象的属性:当方法的参数名或局部变量名与类的成员变量名相同时,
this
用于区分它们。通过this
关键字,你可以明确指定你要访问的是成员变量而不是局部变量或方法参数。在构造器中调用另一个构造器:你可以使用
this()
来调用当前类的另一个构造器。这种调用必须作为构造器的第一条语句,并且不能在一个构造器中同时调用两个构造器。在方法中引用当前对象本身:当需要将当前对象传递给其他方法或者从方法中返回当前对象时,可以使用
this
。在事件监听器或其他回调方法中:当需要在匿名内部类或lambda表达式中引用外部类的当前对象时,
this
非常有用。
this使用示例:
public class GirlFriend {
private String name;
private int age;
private String gender;
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
public void setName(String name){
this.name=name;//<--
}
public String getName (){
return name;
}
public void setAge(int age){
if(age>=18&&age<=50){
this.age=age;//<--
}
else System.out.println("非法参数");
}
public int getAge(){
return age;
}
public void setGender(String gender){
this.gender=gender;//<--
}
public String getGender(){
return gender;
}
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
public class GirlFriendTest {
public static void main(String[] args) {
GirlFriend gf1=new GirlFriend();
gf1.setName("小卡") ;
gf1.setAge(27) ;
gf1.setGender("小可爱") ;
System .out.println(gf1.getName() );
System .out.println(gf1.getGender() );
System .out.println(gf1.getAge() );
}
}