1. 类
2. 局部变量
定义: 定义在方法中的变量成为局部变量
作用域:从定义的位置开始到整个方法结束
注意:局部变量只能在当前方法中使用,其他地方无法使用
内存存放位置:存放在栈内
默认值: 局部变量无默认值;如果木有使用当前变量时,可以不赋值
2.1成员变量
定义:定义在方法外、类内的变量叫成员变量(全局变量)
作用域:在整个类体内
注意:
内存存放位置:存放在堆内存中
默认值:成员变量有默认值;int->0 ;String->null ; boolean->false
示例:
public classStudent {public int age = 20; //成员变量
public String addr; //成员变量有默认值;存放在堆内存,对整个类生效
public voidshow(){
String name= "xiaobai"; //局部变量,必须有默认值;只对当前方法有效;存放在栈中
System.out.println("我的名字--"+name + ",年龄是--"+age);
System.out.println("addr 值是" +addr);
}public static voidmain(String[] args){
Student stu= newStudent();
stu.show();//System.out.println(age);//main函数使用成员变量需要加static关键字修饰
}
}
运行结果:
默认的无参构造函数
我的名字--xiaobai,年龄是--20addr 值是null
3.构造方法
定义:
创建对象的时候会默认调用构造方法(在堆中开辟空间),可以完成成员变量的某些初始化操作
构造方法语法:
方法名称:构造方法的方法名称必须跟类的名称保持一致
访问修饰符:待定
形参:可以用户自定义添加,跟方法的普通参数一样
方法体:完成对象的初始化功能
返回值:无返回值
注意:
1.创建类之后,若没有手动调用构造方法,会默认生成一个无参的构造方法供调用
2. 当用户自定义了构造方法之后,默认的无参构造方法就不能使用了,需要手动定义无参构造方法
3. 同一个类中可以包含多个同名的构造方法
4. 一般构造方法都会进行重载(一个类中可能包含多个属性,只需要给部分属性初始化的时候需要调用不同的构造方法)
示例:
public classTeacher {
String name;intage;publicTeacher(){
System.out.println("无参构造方法");
}publicTeacher(String name){
System.out.println("自定义构造方法,name值是:"+name);
}public Teacher(intage,String name){this.age =age;this.name =name;
System.out.println("two 构造方法,name is:" + name + "age is :"+age);
}public static voidmain(String[] args){
Teacher t1= newTeacher();
t1.name= "lian";
t1.age= 18;
System.out.println("无参构造方法..."+t1.age);
Teacher t2= new Teacher("xiaoxiao");
Teacher t3= new Teacher(29,"lisi");
System.out.println("one argument..."+t2.name);
System.out.println("two argument..." + t3.name + "---" +t3.age);
}
}
运行结果:
无参构造方法
无参构造方法...18自定义构造方法,name值是:xiaoxiao
two 构造方法,name is:lisiage is :29one argument...nulltwo argument...lisi---29
4. 重载
定义:
在一个类中可以包含多个重名的方法,但注意:方法的参数列表不能相同
三个方面的不同:
参数个数不同、参数类型不同、参数顺序不同
5. this
作用: this代表当前对象本身,指向当前对象
用处:
1. 构造方法:当构造方法中的参数名称跟类的成员变量名称一样,可以使用this代表当前对象
2. 普通方法:当多个普通方法之间进行调用,可以使用this进行调用;指的是当前对象的其他方法
3. 成员变量的使用:当方法中的参数名称跟成员变量一致时,使用this.变量名称表示的是对象的值;而使用变量名称表示形参列表的值
示例:
public classUser {intage;
String name;public User(intage){this.age = age; //局部变量的age赋值给成员变量;若不指定,则打印默认值 0
System.out.println("构造方法..." +age);
}public static voidmain(String[] args){
User user= new User(18);
System.out.println("age is :" + user.age); //调用的是成员变量age
}
}
public classUser {intage;
String name;public User(intage){this.age = age; //局部变量的age赋值给成员变量;若不指定,则打印默认值 0
System.out.println("构造方法..." +age);
}//方法1
public voidshow(){
System.out.println("show1");
}//方法2
public voidsay(){
System.out.println("say");this.show(); //也可以不使用this,调用show方法
}public static voidmain(String[] args){
User user= new User(18);
System.out.println("age is :" + user.age); //调用的是成员变量age
user.say();
}
}
public classUser {intage;
String name;public User(intage,String name){this.age = age; //局部变量的age赋值给成员变量;若不指定,则打印默认值 0
this.name =name;
System.out.println("构造方法..." +age);
}//方法1
public voidshow(){
System.out.println("show1");
}//方法2
public voidsay(String name){
System.out.println("say");this.show(); //也可以不使用this,调用show方法
System.out.println(name); //局部变量的值
System.out.println(this.name); //成员变量的值
}public static voidmain(String[] args){
User user= new User(18,"zhansan");
System.out.println("age is :" + user.age); //调用的是成员变量age
user.say("lisi");
}
}
运行结果:
构造方法...18age is :18say
show1
lisi
zhansan
6. static
定义:
修饰成员变量时,表示 静态成员变量 或者叫 类变量
普通变量在使用时,必须通过对象进行调用;
类变量 或 静态变量可以通过对象调用,也可以通过类名进行调用
注意:
静态变量在创建对象之前被初始化;或 在类被载入之前进行初始化
静态变量被所有的对象共享,属于公共变量,对象和类都可以直接调用,但是推荐使用类来调用
存储位置: static变量置于方法区。
示例:
public classStaticDemo {
String name= "zhangsan";static int age = 10;public static voidmain(String[] args){
StaticDemo sd= newStaticDemo();
System.out.println(sd.age);//对象调用
System.out.println(StaticDemo.age); //类名调用
sd.age= 20;
System.out.println(sd.age);
System.out.println(StaticDemo.age);
StaticDemo.age= 30;
System.out.println(sd.age);
System.out.println(StaticDemo.age);
StaticDemo sd1= newStaticDemo();
System.out.println(sd1.age);
System.out.println(StaticDemo.age);
}
}
运行结果: 当修改当前成员变量值时,修改的是同一空间内的值。
10
10
20
20
30
30
30
30
7. 代码块
定义:使用{}的代码叫做代码块
分类:
普通代码块:定义在方法中,使用{}括起来的代码叫普通代码块
构造代码块:定义在类中使用{}括起来的代码叫构造代码块;
注意:a. 每次代码运行时,会将 构造代码块中的代码 添加到 构造方法 前 ;
b. 优先运行构造代码块,再运行构造方法
c. 构造代码块中的代码会添加到每一个构造方法中,当使用this()时不会添加 this(age),调用带一个参数的构造方法
静态代码块: 使用static{}括起来的代码叫静态代码块,在创建对象前优先执行静态代码块
注意:静态代码块中不能访问非static成员(因为非static成员是通过对象调用的,这时对象还未创建)
同步代码块:在多线程时会使用,用来给共享空间进行加锁操作
执行顺序:静态代码>>> 构造代码块(创建对象时使用)>>>普通代码块
示例:
public classCodeBlockDemo {intage;
String name;static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块...");
}publicCodeBlockDemo(){
System.out.println("构造方法...");
}public CodeBlockDemo(intage){this.age =age;
}public CodeBlockDemo(intage, String name){this(age);this.name =name;
}public voidtest(){
System.out.println("test...");
{
System.out.println("普通代码块....");
}
}public static voidmain(String[] args){
CodeBlockDemo cbd= new CodeBlockDemo(18,"aa");
cbd.test();
System.out.println("main...");
}
}
运行结果:
静态代码块
构造代码块...
test...
普通代码块....
main...
8. 封装
概念:将类的某些信息隐藏在类内部,不运行外部程序直接访问;而是通过类提供的方法来实现对隐藏信息的操作和访问
作用:使用封装可以保证数据的规范,不符合规范的数据将无法进行操作
示例:
packagecom.xiuxianxiaoyu;public classDog {private int age; //私有属性
privateString name;privateString color;//需要通过set/get类设置、获取属性值
public void setAge(intage){if (age >0){this.age =age;
}else{
System.out.println("年龄输入不合法");
}
}public intgetAge(){return this.age;
}public voidsetName(String name){this.name =name;
}publicString getName(){return this.name;
}public voidsetColor(String color){this.color =color;
}publicString getColor(){return this.color;
}public voidshow(){
System.out.println("my dog name is :" + name + ", age is :" + age +", color is :" +color);
}
}
packagecom.xiuxianxiaoyu;public classDogDemo {public static voidmain(String[] args){
Dog dog= newDog();
dog.setAge(18);
dog.setName("xiaohei");
dog.setColor("yellow");
dog.show();
}
}
运行结果:
my dog name is :xiaohei, age is :18, color is :yellow
8.1 访问限制
限制访问,以下分类按照访问权限从大到小排列:
public: 公共的,当前项目的所有类都可以访问。protected:受保护的;可以被当前类访问、可以被当前包访问、可以被子类访问。default:默认权限;可以被当前类访问、可以被当前包访问。private:只能被当前类访问。
注意:
4种访问修饰符可以修饰 属性和方法;
类的访问修饰符只有2种 public 和 default
8.2 形参、实参
java中的参数传递都是值传递
形参: 方法中的参数列表叫形式参数,没有具体的值,只是为了方便在方法体中使用;
实参: 调用方法是实际传入的参数,代表具体的数值,用来替换在方法体中代码逻辑值的运算
注意:
1. 形式参数的变量名称也是局部变量
2. 当方法的参数值是基本数据类型时,不会改变原来的值
3. 当方法的参数值是引用类型的时候,如果改变了该引用类型的值,会改变原来对象的值
示例:
packagecom.xiuxianxiaoyu;public classArgmentDemo {public static void test(int a, intb){int tmp =a;
a=b;
b=tmp;
System.out.println("test 方法中a=" + a + ",b=" +b );
}public static voidtest2(Point p){int x =p.getX();int y =p.getY();int tmp =x;
x=y;
y=tmp;
p.setX(x);
p.setY(y);
}public static voidmain(String[] args) {int a = 10; //这个地方的赋值是局部变量的赋值
int b = 20;
test(a,b);
System.out.println("main方法中a=" + a + ",b="+b);
Point p= new Point(2,3);
test2(p);
System.out.println("改变后的值:" + p.getX() + "..." +p.getY());
}
}
Point类:
packagecom.xiuxianxiaoyu;public classPoint {private intx;private inty;public Point(int x, inty){this.x =x;this.y =y;
}public intgetX() {returnx;
}public void setX(intx) {this.x =x;
}public intgetY() {returny;
}public void setY(inty) {this.y =y;
}
}
9. 继承
定义:表示父类跟子类之间的关系;当两个类火灾多个类具备相同的属性和方法时,可以提取出来,变成父类; is a 的关系
使用:
1. 使用extends关键字进行继承
2. 使用继承关系之后,父类中的属性和方法都可以在子类中进行使用(非私有属性和私有方法)
3. java中为单继承(如果包含多个父类,同时父类中包含重名方法,无法决定调用谁)
super:
是直接父类对象的引用
supper用途:
1. 可以在子类中 调用父类中被 子类覆盖的方法
2. 当supper在普通方法中使用的话,可以任意位置编写
3. 当supper在构造方法中使用时,默认会调用父类的构造方法,一定将supper放在第一行
4. 在构造方法中supper关键字和this()关键字不能同时出现
5. 父类中私有的属性和方法都不能被调用,包括构造方法
6. 子类的构造方法中都会默认使用supper关键字调用父类的构造方法
7. 如果构造方法中显示的指定了super的构造方法,那么无参的构造方法不会被调用
总结:
1. 在创建子类的对象时一定会优先创建父类对象
示例:
packagecom.xiuxianxiaoyu.extend;public classPet {privateString name;private intage;privateString gender;publicPet(){
}public Pet(String name, intage, String gender){this.name =name;this.age =age;this.gender =gender;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}publicString getGender() {returngender;
}public voidsetGender(String gender) {this.gender =gender;
}public voidplay(){
System.out.println("play....");
}
}
子类
packagecom.xiuxianxiaoyu.extend;public class Dog extendsPet {privateString sound;publicDog(){
}publicDog(String sound){this.sound =sound;
}public Dog(String name, intage, String gender, String sound){super(name,age,gender);//this(sound);//不能跟supper同时出现
this.sound =sound;
}publicString getSound() {returnsound;
}public voidsetSound(String sound) {this.sound =sound;
}public voidplay(){super.play(); //先调用父类的play方法
System.out.println("dog is playing...");
}
}
packagecom.xiuxianxiaoyu.extend;public class Cat extendsPet{privateString color;publicCat(){
}public Cat(String name, intage, String gender, String color){super(name,age,gender);this.color =color;
}publicString getColor() {returncolor;
}public voidsetColor(String color) {this.color =color;
}
}
测试类
packagecom.xiuxianxiaoyu.extend;public classPetTest {public static voidmain(String[] args) {
Dog dog= newDog();
dog.setName("哈士奇");
System.out.println(dog.getName());
dog.play();
}
}
运行结果:
哈士奇
play....
dog is playing...
9.1 重写
定义:必须存在继承关系,当父类中的方法无法满足子类需求时,可以选择使用重写的方式
注意:
1. 重写表示的是子类覆盖父类的方法,当覆盖之后,调用同样的方法时会优先调用子类方法
2.重写的方法名称、返回值类型、参数列表必须跟父类一致
3.子类重写的方法不允许比父类的方法具备更小的访问权限
父类 public 子类 public
父类 protected 子类 public protected
父类 default 子类 public protected default
4. 父类的静态方法,子类可以进行调用;但子类不可重写
示例:
父类方法:
@OverridepublicString toString(){return "my name is " + this.name + ",my age is " + this.age+ ", my gender is " + this.gender;
}
子类重写父类方法:
publicString toString(){return super.toString()+ ", my sound is " + this.sound;
}
9.2 final用法
final 可以修饰变量: 表示变量的值不可变
final 可以修饰方法:表示方法不可以被重写
final可以修饰类:表示类不可以被继承
10. 抽象类
定义: java中的对象是对现实世界的具象化,但在现实世界中,某些类并不具备实例化的意义,因此可以定义为抽象类
使用: 1. 创建抽象类的时候需要添加 abstract 关键字
2. 不能进行实例化,也就是不能new对象
3. 抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类的方式定义为抽象方法,没有具体实现,只包含方法名称、返回值、参数列表、访问修饰符
4. 使用abstract关键字修饰的方法叫做抽象方法,可以不写方法的实现
5. 子类在继承抽象父类时,必须要将父类中的抽象方法进行实现 或者 将子类也定义为抽象类
6. 有抽象方法的一定是抽象类;但抽象类中不一定包含抽象方法
示例:
抽象类:
packagecom.xiuxianxiaoyu.abstracts;public abstract classPet {publicString name;//抽象方法
public abstract voidprint();public voidplay(){
System.out.println("play....");
}
}
子类:
packagecom.xiuxianxiaoyu.abstracts;public class Dog extendsPet {//子类实现父类的抽象方法
@Overridepublic voidprint() {
System.out.println("dog print...");
}
}
11. 多态
定义: 对应同一个指令(调用同一个名称的方法),不同的对象给予不同的反应(不同的方法实现)
规范:
1. 必须要有继承关系
2. 子类方法必须要重写父类的方法
3. 父类引用指向子类对象
目的:
为了提高代码的扩展性和维护性
方便代码逻辑的编写
表现形式:
1. 父类作为方法的参数
2. 父类作为方法的返回值类型
示例:
父类:
子类:
测试类:
packagecom.example.duotai;public classPerson {//父类作为子类的返回值
public Pet play(inttype){if (type == 1){return newDog();
}else if(type == 2){return newCat();
}else{return newPenguin();
}
}//父类作为子类的参数
public voidfeed(Pet pet){
pet.feed();
}public static voidmain(String[] args) {
Person p= newPerson();
p.feed(newDog());
Pet pet= p.play(3);if (pet instanceofDog){
System.out.println("buy dog!!");
}else if (pet instanceofCat){
System.out.println("bug cat !!");
}else{
System.out.println("buy penguin!!");
}
}
}
12. 接口
java中的继承关系是单继续,如果拥有多个父类时,可以考虑使用接口进行实现。
java中的接口具备广泛的使用:
1. 使用interface来修饰
2. 接口中可以包含多个方法,且方法跟抽象类中的抽象方法一致,可以不写实现,子类在实现时必须实现父类接口的逻辑;
3. 子类实现接口使用implements关键字
特征:
1. 接口中的所有方法都是抽象方法,不能包含实现逻辑;
2. 接口中的所有方法的访问修饰权限都是public,默认不限权限,也是public,不是default
3.接口不能实例化
4. 接口的子类必须实现接口中的所有方法;跟抽象类不同,抽象类中的抽象方法必须被子类实现
5. 子类可以实现多个接口 (A implements B,C,D)
6. 接口中的变量都是静态常量,如果变量没有使用static关键字修饰,它也表示静态常量
7. 接口中的方法和常量无论是否添加public修饰,默认的权限有且仅有一个,public
8. 接口代表一种能力,接口中仅有定义N个方法,子类在进行实现时,意味着具备了方法的能力
13. 总结
1. try-catch-finally中,finally块唯一不执行的情况是什么?
答:在try或者catch语句中调用了退出虚拟机的方法(system.exit(1))
示例:
public classTryTest{public static voidmain(String[] args){
test();
}public static voidtest(){try{
System.out.println("try");int i = 1 / 0;
System.exit(1);
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}finally{
System.out.println("finally");
}
}
}