一,面向对象基本概念
面向对象有三个基本特性:封装性,继承性,多态性
JAVA不支持多继承
所有对象名称都被保存在栈内存中,而对象的具体内容都被保存在堆内存之中
如果一个对象要被使用,则必须被实例化
类属于应用数据类型,而引用数据类型就是指一段堆内存空间可以同时被多个栈内存所指向。
下面看具体例子:
class Person{
private int age;
Person(int age){
this.setage(age);
}
public void setage(int age)
{
this.age=age;
}
public int getage(){
return this.age;
}
}
public class one1 {
public static void main(String[] args) {
Person per=null;
per=new Person(30);
Person per1=per;
per1.setage(20);
System.out.print("per的年龄为:"+per.getage());
System.out.print("\nper1的年龄为:"+per1.getage());
}
//运行结果为:
per的年龄为:20
per1的年龄为:20
一个栈内存空间只能指向一个堆内存空间如果要想指向其他的堆内存空间,则必须断开已有的指向才能分配新的指向
只要是被封装的属性,则必须通过setter和getter方法设置和取得
class Person{
private String name;
void setName(String name){ //setter方法
this.name=name;}
String getName(){ //getter方法
return this.name;}
构造方法:
1,构造方法的名称必须与类名一直
2,构造方法的声明处不能有任何返回值类型的声明
3,不能在构造方法中只用return返回一个值
只要是类就必须存在构造方法,若没有声明,则在编译的时候会自动生成一个无参数的,什么都不做的构造方法。
与普通方法一样构造方法是可以重载的
匿名对象:
没有明确给出名字的对象是匿名对象,一般匿名对象只能使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
匿名对象在实例化时:new 构造方法()
例如:new Person("张三“,20).调用的方法
二,String 类
String本身是一个类定义,字符串与基本数据类型连接时,若第一个是字符串,则后面的都按照字符串处理;若前n个都是基本数据类型,而最后一个是字符串,则前面的按照基本数据类型样式处理后之后,再变为String类型的。
int a=2,b=3;
String s="你好";
System.out.print(a+b+s);
System.out.print("\n");
System.out.print(s+a+b);
//运行结果:
5你好
你好23
String对象的内容比较
每个String 对象的内容实际上都是保存在堆内存之中的
“==”是用来进行地址的比较
equals()是进行内容的比较
String str1="HELLO";
String str2=new String("HELLO");
String str3=str2;
System.out.print("str1==str2 "+(str1==str2));
System.out.print("\nstr2==str3 "+(str2==str3));
System.out.print("\nstr1.equals(str2) "+(str1.equals(str2)));
System.out.print("\nstr2 equals str2 "+(str2.equals(str3)));
//运行结果:
str1==str2 false
str2==str3 true
str1.equals(str2) true
str2 equals str2 true
一个字符串就是一个String类的匿名对象,如果使用new关键字,则不管如何都会再开辟一个新空间。
字符串的内容一旦声明则不可变,若改变了,实际上是通过内存地址的“断开 连接”变化完成的,而本身字符串的内容并没有发生改变。
String str1="HELLO";
System.out.print("字符串长度为:"+str1.length());
System.out.print("\n将字符串转换为字符数组:");
char c[]=str1.toCharArray();
for(int i=0;i<c.length;i++){
System.out.print(c[i]);
}
System.out.print("\n将字符数组转换为字符串:");
String str2=new String(c);
System.out.print(str2);
System.out.print("\n将字符串转换为byte数组:");
byte b[]=str1.getBytes();
System.out.print("\n查找指定字符串是否存在:");
System.out.print(str1.indexOf("H"));
System.out.print("\n直接查找字符串是否存在: "+str1.contains("O"));
String str3=" HELLO ";
System.out.print("\n去掉左右空格:"+str3.trim());
System.out.print("\n截取字符串的一部分: "+str1.substring(0, 2));
String str4="H,E,L,L,O";
System.out.print("\n进行字符串的拆分: "+str4.split(","));
System.out.print("\n进行字符串的大小写转换: "+str1.toLowerCase());
System.out.print("\n将字符串转换为大写的: "+str1.toUpperCase());
String str5="hello";
System.out.print("\n将字符串进行不区分大小写的比较:"+str1.equalsIgnoreCase(str5));
System.out.print("\n替换指定字符串: "+str5.replaceAll("l", "x"));
//运行结果:
字符串长度为:5
将字符串转换为字符数组:HELLO
将字符数组转换为字符串:HELLO
将字符串转换为byte数组:
查找指定字符串是否存在:0
直接查找字符串是否存在: true
去掉左右空格:HELLO
截取字符串的一部分: HE
进行字符串的拆分: [Ljava.lang.String;@7852e922
进行字符串的大小写转换: hello
将字符串转换为大写的: HELLO
将字符串进行不区分大小写的比较:true
替换指定字符串: hexxo
``
**三,引用传递**
所谓引用,就是将堆内存空间的使用权交给多个栈内存空间
```java
String str1="HELLO";
System.out.print("调用fun()方法之前:"+str1);
fun(str1);
System.out.print("\n调用fun();方法之后:"+str1);
}
public static void fun(String s)
{
s="WORD";
}
//运行结果为:
调用fun()方法之前:HELLO
调用fun();方法之后:HELLO
class Demo{
String temp="HELLO";
}
public class one1 {
public static void main(String[] args) {
Demo de=new Demo();
de.temp="WORD";
System.out.print("调用fun()方法之前:"+de.temp);
fun(de);
System.out.print("\n调用fun();方法之后:"+de.temp);
}
public static void fun(Demo s)
{
s.temp="你好";
}
}
//运行结果:
调用fun()方法之前:WORD
调用fun();方法之后:你好
//内容改变了,因为这里的String是作为Demo类的一个属性存在的,改变的是属性的内容
三,this关键字
this的作用
1,表示类中的属性
2,可以使用this调用本类的构造方法
3,this表示当前对象
使用this调用构造方法只能放在第一行无参构造方法最好不要去调用别的构造方法
程序中至少存在一个构造方法是不适用this调用其他构造方法的
四,static关键字
如果一个类中的方法不想由对象,而是由类名直接调用,则该方法可以声明为static方法
ststic声明的属性为全局属性,即是该属性是所有对象所共享的
class Person{
static String Country="A城";
String name;
public Person(String name){
this.name=name;
}
public void info(){
System.out.print("姓名:"+this.name+"城市"+Country+"\n");
}
}
public class one1 {
public static void main(String[] args) {
Person per1=new Person("王三");
Person per2=new Person("李四");
Person per3=new Person("赵茜");
System.out.print("修改之前:\n");
per1.info();
per2.info();
per3.info();
per1.Country="B城";//这里最好写成Person.Counrty="B城";
System.out.print("修改之后:");
per1.info();
per2.info();
per3.info();
}
}
//运行结果:
修改之前:
姓名:王三城市A城
姓名:李四城市A城
姓名:赵茜城市A城
修改之后:姓名:王三城市B城
姓名:李四城市B城
姓名:赵茜城市B城
注意:非static方法可以调用static的属性或方法,但是,static方法不能调用非static方法或属性
同时注意:静态代码块优先于主方法执行,而在类中的静态代码块会优先于构造方法执行,不管产生多少个对象,静态代码块只执行一次