1.对象的创建(实例化)
Cat cat; //声明
cat = new Cat(); //开辟空间,把地址赋值给cat;
public class Cat {String name=null;int age=0;String color=null;/*public Cat(String name, int age, String color) {//构造函数this.name = name;this.age = age;this.color = color;}*/}//======================cat.java=======================================public class Hello {public static void main(String[] args){//Cat A=new Cat("小黑",5,"白色");//调用的构造函数Cat B;B=new Cat();B.color="白色";B.age=55;B.name="小花";//普通调用cat对象,注意,当cat.java创建了构造函数时。就不能用此种方法了}}//======================Hello.java=======================================
注意:对象也是引用类型,和数组一样,两个数组相等,改变其一,另外一个的内容也会随之改变。
2.方法的封装与调用
类内部调用:
public class Hello {public static void main(String[] args){System.out.println(DecToHex(31));}static String DecToHex(int num){StringBuffer stringBuffer = new StringBuffer();char []chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};while (num>0){int index= num % 16;//取余char tmp = chars[index];//取出对应的十六进制的数值stringBuffer.append(tmp);num=num/16;}return stringBuffer.reverse().toString();};}
外部调用:
public class Cat {static void test(){System.out.println("123");}}//=====================Cat.java========================public class Hello {public static void main(String[] args){Cat cat1 = new Cat();Cat.test();}}//=====================Hello.java========================
3.static
- 静态属性(类属性)
静态属性可以通过 类名.属性名/对象.属性名 来赋值和访问
静态属性只有一份
静态属性生命周期与类相同,存储于堆中class实例的尾部(JDK7以上) - 实例属性(对象属性)
实例属性每个对象都有一份
实例属性只能通过 对象.属性名 来赋值和访问
实例属性生命周期与对象相同,存储于堆中 - 静态方法与实例方法(对象方法)
静态方法和实例方法都随着类一起加载,存储与方法区
静态方法可以通过 类名.方法名/对象.方法名 来访问
静态方法中只能调用静态方法,只能访问静态属性
实例方法中可以调用静态方法和实例方法,也可以访问静态属性和实例属性 - main方法
main方法可以直接调用所在类的静态方法或静态属性
main方法不能直接访问所在类中的实例成员,必须创建对象后,才能通过对象去访问 ```java public class Cat { static String color=null; } //=====================Cat.java======================== public class Hello { public static void main(String[] args){
}} //=====================Hello.java======================== //结论,用static修饰过后的变量,就像是个一辆共享单车,只有一辆,但是谁都可以使用,谁都可以改变他的值; //静态方法中,不能直接使用实例方法(先new一下);Cat cat1 = new Cat();cat1.color ="白色" ;System.out.println(cat1.color);//"白色"Cat.color="黑色";System.out.println(Cat.color);//"黑色"
<a name="CvN3l"></a>#### 4.重载概念:<br />同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同或者参数顺序不同即可; <br />与返回值类型无关,只看参数列表;```javapublic class Hello {public static void main(String[] args){}static int test(int a){return 1;};static int test(double a){return 1;};static int test(String a){return 1;};}
5.可变参数
public class Hello {public static void main(String[] args){System.out.println(test(1,2,3,4,5));//传入参数可以为一个数组,传入数组的时候,就只能传入一个参数了}static int test(int ...a){//三个点代表可变参数 ,传入的a本质上是个数组int result =0;for (int i = 0; i < a.length; i++) {result=result+a[i];}return result;};}
6.构造器/构造方法/构造函数
构造器名和类名一致,没有返回值
当对象创建的时候,会自动调用对应的构造器如果没有定义构造器,会自动生成默认的无参构造器(也叫默认构造器)
一个类可以定义多个不同的构造器,即构造器重载
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非自己显式的定义一下
7.this
public class Cat {String color=null;public Cat(String color) {this.color = color;System.out.println(this.hashCode());}}//=====================Cat.java========================public class Hello {public static void main(String[] args){Cat cat1 = new Cat("白色");System.out.println(cat1.hashCode());System.out.println("==================");Cat cat2 = new Cat("黑色");System.out.println(cat2.hashCode());}}//=====================Hello.java========================/*356573597 指向cat1356573597==================1735600054 指向cat21735600054*///说明谁调用,这个this就指向谁。
this用于区分当前对象的属性和局部变量
this不能在类外部使用,只能在类内部实例方法中使用;
this不能在静态代码块里面使用,因为静态代码块会随着对象的创建而加载,这是this并没有被谁指向;
this(实参列表):用于构造方法之间的访问,必须是构造器中的第一个语句,如一下代码:
public class Cat {int num=0;String color=null;public Cat(String color) {this(5,6);//调用点this.color = color;}public Cat(int num,int num1) {this.num=num;System.out.println(1111);}}//=====================Cat.java========================public class Hello {public static void main(String[] args){Cat cat1 = new Cat("白色");}}//=====================Hello.java========================
8.包
- 包的三大作用:
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
- 建包
- 包,实际上就是创建不同的文件夹/目录来保存类文件
package com.dudu.app;public class people {String name=null;public people(String name) {this.name = name;System.out.println(this.name );}}//===============================package com.dudu.app;=======================import com.dudu.app.people;public class Hello {public static void main(String[] args){people people1 = new people("aaa");}}//===============================Hello.java;=======================
9.访问修饰符

- 隐藏实现细节,使用的人只需知道传入什么参数,会产生什么效果,返回什么数据对属性进行操作时,可以验证传入数据的合理性把属性私有,定义公开的get、set方法来验证数据合理性;
封装例子: ```java package com.dudu.app; public class people { private String name=null; private int age =0;
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()!=0){ this.name = name;System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");}else {}
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");this.age = age;
} } //===============================package com.dudu.app;======================= import com.dudu.app.people; public class Hello { public static void main(String[] args){
people people1 = new people();people1.setName("你好");people1.setAge(55);
} } //===============================Hello.java;=======================
<a name="IVJvH"></a>#### 11.继承1. 作用- 提高代码复用性- 继承是多态的前提2. 继承的语法- class 子类 extends 父类{ }- 例子```javapackage com.dudu.app;public class people {private String name=null;public String getName() {return name;}public void setName(String name) {this.name = name;}}//===============================people.java;=======================package com.dudu.app;public class students extends people{private boolean learn;public boolean isLearn() {return learn;}public void setLearn(boolean learn) {this.learn = learn;}}//===============================students.java;=======================import com.dudu.app.students;public class Hello {public static void main(String[] args){students students1 = new students();students1.setName("实例化的是students,通关students继承people访问people里面的属性");System.out.println(students1.getName());}}//===============================Hello.java;=======================
12.父类构造器
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器(注:不用super的话,父类必定有无参构造器,不然报错)
- super();如果父类没有提供无参构造器,则须在子类构造器中用super去指定使用父类的哪个构造器 super(参数列表); super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- 父类构造器的调用不限于直接父类,一直往上追溯到Object类(顶级父类)
- 访问父类的属性(受访问修饰符影响) super.属性名;
- 访问父类的方法(受访问修饰符影响) super.方法名(参数列表);
- 如果父类没有,super会向上找爷爷类,以此类推
- 如果父类和爷爷类都有,但是父类是private,那么也会报错
java: 无法从静态上下文中引用非静态 变量 super(),即无法从带有static的类里面调用父类或者爷爷类的属性或者方法; ```java package com.dudu.app; public class test { public String tttt=”ttttpppppppppp”; } //===============================test.java;======================= package com.dudu.app; public class people extends test{ public String TEST=”TEST_people”; private String name=null; public people() {
System.out.println("父类无参构造器");
} public people(String name) {
this.name = name;System.out.println("父类有参数构造器"+this.name);
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
//===============================people.java;======================= package com.dudu.app; public class students extends people{ private boolean learn;
public students(boolean learn) {super(" dudu");//指定调用父类有参数的构造器this.learn = learn;}public boolean isLearn() {return learn;}public void setLearn(boolean learn) {this.learn = learn;}public void call() {System.out.println(super.tttt);//ttttpppppppppp}//这个就是,父类继承了爷爷类的属性,父类没有,也可以直接调用的;
} //===============================students.java;=======================
<a name="fb3hD"></a>#### 13.方法重写a) 方法重写也叫方法覆盖;<br />b) 子类方法的名称、参数,与父类完全相同;<br />c) 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类 ;比如父类返回类型是Object,子类方法返回类型是String <br />d) 子类方法不能缩小父类方法的访问权限,即访问修饰符;```javapackage com.dudu.app;public class test {public String tttt="tttt";public String rename(){return "方法重写_父类";}}//===============================test.java;=======================package com.dudu.app;public class people extends test{public String rename(){return "方法重写_子类";}}//===============================people.java;=======================
14.代码块
- 创建对象时的调用顺序
① 父类的静态代码块和静态属性初始化
② 子类的静态代码块和静态属性初始化
③ 父类的普通代码块和普通属性初始化
④ 父类的构造方法
⑤ 子类的普通代码块和普通属性初始化
⑥ 子类的构造方法
