一、main函数详解
1.public:公共的.权限是最大的,在任何情况都可以访问
原因:为了保证jvm在任何情况下都可以访问到main法
2.static:静态,静态可以让jvm调用更方便,不需要用对象调用
3.void:没有返回值.因为返回的数据是给jvm,而jvm使用这个数据是没有意义的,所有就不要了
4.main:函数名, 注意:main方法并不是关键字,只不过是jvm唯一识别的一个特殊函数名
5.arguments(args):担心某些程序启动时需要参数.
class Demo1 {public static void main(String[] args) {System.out.println("Hello World!");}}
二、this关键字
2.1this 的概述
this关键字代表是对象的引用。也就是this在指向一个对象,所指向的对象就是调用该函数的对象引用。(this关键字代表了所属函数的调用对象)
2.2 this关键字的作用
1.如果存在同名的局部变量和成员变量时,在方法内部默认访问的是局部变量的数据
可以通过this关键字指定访问成员变量的数据
2.this关键字在构造函数中不能出现相互调用,因为是一个死循环。
class Student{int id; //身份证 (成员变量)String name;//名字 (成员变量)//目前情况:存在同名的局部变量和成员变量,在方面内部默认使用的局部变量的.public Student(int id,String name){//局部变量this.name = name;//把局部变量name的数据传给成员变量namethis.id = id; }}class Demo8 {public static void main(String[] args) {Student s=new Student(12580,"王麻子"); System.out.println(s.id+"\t"+s.name);}}
2.3 this关键字要注意的事项
1.如果在一个方法中访问一个变量时,该变量只存在成员变量的情况下,那么java编译器会自动在该变量前添加this关键.
2.this只能在非静态(没有static修饰的)函数中使用.
3.在一个构造函数中如何调用另一个构造函数的格式: this()无参构造器,this(参数...)有参构造器......。
一个构造器调用另一个构造器(方法/函数): this()关键字必须位于第一个语句,否则编译错误
class Student{int id; String name;//目前情况:存在同名的局部变量和成员变量,在方面内部默认使用的局部变量的.public Student(int id,String name){//全参构造器 this(name);//调用的是:含有参数name的构造器this.name = name;this.id = id;}//无参构造器public Student(){} //含一个参数的构造器public Student(String name){this.name=name;//把局部变量给了成员变量name }}class Demo8 {public static void main(String[] args) {Student s=new Student(250,"王麻子"); System.out.println(s.id);}}
三、static关键字
3.1 static修饰成员变量时
static修饰成员变量时,那么该成员变量数据就是一个共享数据;
静态成员的访问方式:
方式一: 使用对象进行访问
对象.变量名
方式二: 使用类名进行访问
类名.变量名 注意:
非静态成员变量,只能使用对象进行访问,不能使用类名访问。千万不要为了方便访问变量而使用static修饰,一定要是该数据是共享的数据时才使用static修饰
3.2 static修饰方法(静态成员方法)
静态方法的访问方式:
方式一: 可以使用对象调用
对象.静态的方法名();
访问方式二: 可以使用类名调用
类名.静态方法名();
class Student{String name;static String country="中国";//静态方法(函数)public static void study(){System.out.println(country+"努力学习");}//有参构造器public Student(String name){this.name=name;}//无参构造器public Student(){}//普通方法(函数)public void eat(){System.out.println(country+name+"努力学习");}}class Demo9 {public static void main(String[] args) {Student s=new Student("铁蛋");s.eat();//用对象名调用Student.study();//用类名直接调用 s.study();Student s1=new Student();s1.name = "狗娃";//用对象名调用Student.name = "狗蛋";//用类名直接调用;此处报错,原因:成员变量name不是静态变量,静态方法不能直接用类名调用,要用对象名调用System.out.println(s1.name+"\t"+Student.country); //Student.country:不报错的原因:因为country是静态成员变量,所以可以用类名调用 }}
3.3 静态的成员变量和非静态的成员变量区别
1.作用上区别:
1.静态成员变量的作用共享一个数据给所有对象使用
2.非静态成员变量的作用是描述一类事物的公共属性
2.数量与存储的位置的区别:
1.静态成员变量存储在方法区内存中,而且只会存储一份数据
2.非静态成员变量存储在堆内存中,有n个对象就会有n份数据
3.生命周期的区别:
1.静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失
2.非静态的成员变量数据是随着对象的创建而存在,随着对象的消失而被垃圾回收器回收掉
3.4静态函数要注意的事项
1.静态函数可以通过类名或者对象进行访问,而非静态的只能通过对象进行访问.
2.静态的函数是可以直接访问静态的成员的,但是不能访问非静态的成员;
原因:静态成员可以直接使用类名调用,这个时候可能还没有存在对象,
而非静态的成员是随着对象的创建而存在的
3.非静态的函数是可以直接访问静态和非静态的成员的.
原因:非静态函数只由对象调用,当对象存在时,静态的数据老早就存在了,
而非静态的数据也随着对象的创建而存在了
4.静态函数不能出现this或者super关键字
原因:因为静态函数是可以使用类名调用的,一旦使用类名调用,这个时候可能不存在对象,而this
关键字代表了一个函数的调用者对象,这个时候就会产生冲突
3.5 静态数据生命周期
静态的成员变量数据是先于对象存在的
四、super关键字
4.1、概念:
super关键字代表了父类空间的引用
4.2、super关键字的作用
1.子父类中存在这同名的成员时,在子类中默认访问子类的成员,可以通过super关键字访问父类指定父类成员
2.创建子类对象时,默认调用父类的无参构造器,可以通过super关键字调用父类中有参构造器
4.3、super关键字调用父类的构造方法时,要注意的事项
1.在子类的构造器中没有指定调用父类的构造方法,那么编译器会在子类构造器中默认添加一个super()
2.super关键字调用父类构造函数时,该语句必须要是子类函数的第一语句
3.super关键字与this关键字不能同时出现在一个构造函数中调用其他构造函数.因为两个语句都需要是第一个语句(第一行)
五、super关键字与this关键字的区别
1.代表的事物不一致
1.super关键字代表的是父类空间的引用.
2.this关键字代表是所属函数的调用对象.
2.使用的前提不一样
1.super关键字必须要有继承关系才能使用
2.this关键字不需要存在继承关系也可以使用
3.调用构造函数的区别
1.super关键字是调用父类的构造函数
2.this关键字是调用本类的构造函数.
//例子:super和this关键字
1 class Fu{ 2int x=10; 3String name; 4 5public Fu(){ 6 System.out.println("父类无参构造器...."); 7} 8public Fu(String name){ 9 this.name=name; //把局部变量name的数据传给成员变量name10}11public void eat(){12 System.out.println("小头爸爸吃番薯......."+name);13}14 }15 16 class Zi extends Fu {17int x=20;18int num;19public Zi(){20 System.out.println("这是子类无参构造器...");21}22public Zi(String name,int num){23 super(name); //指定调用父类的一个参数的构造器24 super.eat();//调用父类中的eat() 方法2526}2728public void eat(){29 System.out.println("大头儿子吃龙虾...."+super.x+"\t"+name); //和this关键字的用法相似,这里(super.x)调用的是父类中的成员变量x,返回结果:10;去掉super关键字,返回结果:20 (就近原则)30}31 }32 class Demo7{33public static void main(String[] args) {34 Zi z=new Zi("二狗子",2);35 z.eat(); //这里调用的是子类的eat()方法36} 37 }
结果图:
解析:
第一条结果:是子类实例化对象后(Zi z = new Zi("二狗子",2);),调用了子类的有参构造器(含两个参数的构造器),有参构造器的 “super(name)”再去调用父类中的含一个参数的构造器,才返回的第一条结果。
第二条结果:是直接调用子类中的eat()方法。(super.x)调用的是父类中的成员变量x,返回结果:10;去掉super关键字,返回结果:20 (就近原则);
由于super(name)调用父类中的含一个参数的构造器,所以,相当于子类间接继承了父类中的含一个参的构造器,故name也有父类一样的值。
六、final 关键字
常量修饰符一般为:public static final
例如:public static finaldouble PI = 3.14; //圆周率
(注:常量的命名规范:
全部字母都要大写,单词与单词之间 使用下划线分割。)
final 关键字注意事项:
1.final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终值
2.final关键字修饰一个引用类型时,该变量不能重新指向新的对象.
3.final关键字修饰一个函数时,该函数不能被重写
4.final关键字修饰一个类时,该类就不能被继承
注:(基本类型包括:基本数据类型和引用数据类型,在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。)
七、instanceof 关键字
1、instanceof关键字的作用
判断一个对象是否属于指定类型
2、instanceof使用的前提
判断对象与指定的类型必须是继承或者实现关系
3、instanceof的格式
对象 instanceof 类别
4、运用场景
多态
//需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法//instanceofpublic static void print(Animal a){ //相当于:Animal a=new Fish();if(a instanceof Fish){Fish f=(Fish)a;f.bubble();}else if(a instanceof Mouse){Mouse m=(Mouse)a;m.dig();}else{System.out.println("输入错误");}}
解析:当实例化一个对象:
Animal a=new Mouse("米老鼠"); //多态,父类的引用指向子类的对象
a.run();
//a.dig(); //报错,因为是多态(父类中没有dig()方法),所以要强制转换类型
Mouse m=(Mouse)a; //强制类型转换
m.dig();
完整例子:
1 //动物类 2 abstract class Animal{ 3String name; 4public Animal(String name){ 5 this.name=name; 6} 7 8public abstract void run(); //抽象方法 9 }10 //老鼠类11 class Mouse extends Animal{12public Mouse(String name){13 super(name);14}15public void run(){16 System.out.println(name+"四条腿慢慢走");17}18 19public void dig(){20 System.out.println(name+"老打洞...");21 22}23 }24 //鱼类25 class Fish extends Animal{26public Fish(String name){27 super(name);28}29public void run(){30 System.out.println(name+"摇着尾巴游啊游...");31}32public void bubble(){33 System.out.println(name+"吹泡泡....");34}35 }36 37 class Demo6 {38public static void main(String[] args) {39 Animal a=new Mouse("米老鼠");//多态,父类的引用指向子类的对象40 a.run();41 //a.dig();报错42 //调用43 Mouse m=(Mouse)a;//强制类型转换 44 m.dig(); //如果直接用a.dig()的话,会报错,因为是多态(父类中没有dig()方法),所以要强制转换类型45 46 Animal a1=new Fish("金枪鱼");47 Fish f=(Fish)a1;48 print(f);49}50 51//需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法52//instanceof53public static void print(Animal a){ //相当于:Animal a=new Fish();54 if(a instanceof Fish){55 Fish f=(Fish)a;56 f.bubble();57 }else if(a instanceof Mouse){58 Mouse m=(Mouse)a;59 m.dig();60 }else{61 System.out.println("输入错误");62 }63}64 }
八、其他java关键字
1、super和extends关键字:/dshore123/p/8805436.html
2、break和continue关键字:/dshore123/p/8656779.html
3、abstract关键字:/dshore123/p/8867093.html
4、interface、implements关键字:/dshore123/p/8873647.html
5、throw、throws、finally关键字:/dshore123/p/8927993.html
G M T 文本转语音功能仅限200个字符