Java作为典型的面向对象编程语言,其中的重点——类和对象,当然是我们不得不知道的概念。但是其中的种种细节,你真的吃透了吗?
类的字段:也可以叫类的属性,是抽象出来的同类事物共有的描述——如狗的颜色,品种;人的年纪、职业、身高体重等,都是结合具体问题具体设计。
类的方法:也叫类的行为,同理是对同类事物可以执行的动作的描述——狗能够跑、叫…人能够工作、吃饭、玩耍等。
特殊的方法
public class Applaction{
public static void main(String[] args){
//相关语句
}
}
public class ClassName{
//构造函数和类同名,可重载(同一函数名不同参数)
ClassName(相关参数or无){
//要执行的操作,赋值初始化等
}
}
3.可变参数方法:可传入0或多个参数不固定的方法,实质上是传入数组。写法如下:
public class ClassName{
public void functionName(int... args){
//语句组
}
}
封装:类的设计,或者说面向对象设计三大重要概念之一就是封装,简单的说就是将抽象概念提取组合在一起,提供简单的接口供外部访问,实现高效简洁的运用——就好像电视机,只提供少数几个按钮进行大部分操作,而具体的实现细节(复杂的电路都被打包在机器中)
首先了解 包(package) 的概念:一般将一个文件夹内的java类打包成一个包,在java文件中声明,同一包下java类可以相互访问,而不同包直接访问有限制(在访问控制中说明)
package first.product;//声明该类属于first.product包
访问控制: 为了避免类暴露太多细节导致难读难用,同时有效的保护类不被相互影响,使用访问控制符对类之间的访问进行限制。
访问级别 | 其他包的类 | 同一包类 | 子类 | 本类 |
---|---|---|---|---|
public | yes | yes | yes | yes |
protected | yes | yes | yes | |
默认 | yes | yes | ||
private | yes |
静态的概念: 用static关键字修饰的类或者成员(static类成员也必须为static)
记住static成员是属于类的不是属于实例对象即可——在类载入过程就已经加载好了,因此无需实例成对象就可以使用,比如:
Math.pow(2.0,10.0)//通过类名使用类静态方法
变量:基本类型如int,byte,boolean等,直接在栈中分配内存,变量就是值;但是对于类的实例——对象,声明的变量同样也是在栈中分配好空间,但是保存的是对象在堆中的地址。
对象:对象的创建需要new调用构造函数,或者通过一些特殊构造方法,复制or反射等,然后在堆中开辟空间保存对象。
赋值:对象的赋值操作实际是将堆中的对象的地址交给栈中的变量。
我们常用的==比较方法只是比较两个变量的引用地址是否相同,如下:
String s1=new String();
String s2=new String();
if(s1==s2)
System.out.println("s1==s2");
else
System.out.println("s1!=s2");
尽管s1和s2都是空字符串,但是你会发现他们不相等,这是由于他们引用的对象地址不同。
StringBuilder s1=new StringBuilder();
s1.append("Hi");
StringBuilder s2=s1;
System.out.println(s2.toString());//Hi
s1.append(" world");
System.out.println(s2.toString());//Hi world
你会发现对s1 的修改影响到了s2,这是由于s1和s2都指向一个对象地址,这属于浅拷贝——关于拷贝可以参考这篇文章_原型模式的深浅拷贝
但是所有的类都继承自Object类,都包含了一个equals方法,Java标准库提供的类比如String等都实例化了该方法,equals能够比较对象的内容是否相同
String s1=new String();
String s2=new String();
if(s1.equals(s2))
System.out.println("s1==s2");
else
System.out.println("s1!=s2");
现在他们就相同了
自己编写的类如果需要比较,也需要实现这样一个方法
按值传递和按引用传递一直是编程语言中的重要概念,也是非常难以区分的概念,如果不能较好的理解该概念,将会造成很多莫名其妙的逻辑错误,严重影响数据结构和算法相关实现的理解。
值传递——将内容复制一份传入方法中,方法中的任何修改都不影响原对象
引用传递——将对象的地址传入,方法中的修改可能影响原对象
Java中的基本类型属于值传递,将值复制一份给方法参数传入,不影响原变量的内容。
而Java的对象则更加复杂一些,属于将地址复制给方法参数,归属于引用传递——具体案例见下(下面实现一个交换方法 swap() ):
/**
public void swap(Book a,Book b){
Book mid;
mid=a;a=b;b=mid;
System.out.println("After Swap a: "a.getName()+" b: "+b.getName());
}
**/
Book book1=new Book("A Java入门基础");
Book book2=new Book("B Java进阶知识");
swap(book1,book2);
System.out.println("Real a: "book1.getName()+" b: "+book2.getName());
//After Swap a: B Java进阶知识 b: A Java入门基础
//Real a: A Java入门基础 b: B Java进阶知识
可以看到,尽管在swap方法中,a和b完成了交换,但是方法外的book1和book2指向的对象还是没有改变。
这是由于方法中,改变的是a、b指向的地址,但是对book1、book2的地址没有影响,但是如果在方法中修改a指向对象的Name,对对象内部的修改会同步到外部。
以上就是对Java核心知识点类和对象的简单理解,如有缺漏欢迎指正
有不清楚的同学,也请不耻下问,欢迎私信