
1.关键字:static
package atguigu.java2;import java.util.jar.Attributes.Name;/* * static 关键字的使用 * * 1.static:静态的 (或类变量) * 2.static可以用来修饰:属性、方法、代码块、内部类 * * 3.引用static修饰属性:静态变量 * 3.1属性,按是否使用static修饰,又分为:静态 vs 非静态属性(实例变量) * 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的 * 非静态属性时,不会导致其他对象中同样的属性值的修改 * 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致 * 其他对象调用此静态变量时,是修改过了的。 * 3.2 static修饰属性的其他说明: * 1.静态变量随着类的加载而加载.可以直接通过“类.静态变量”的方式进行调用 * 2.静态变量的加载要早于对象的创建 * 3.由于类只会加载一次,则静态变量在内存中也只会存在一份 * * 4. 类变量 实例变量 * 类 yes no * 对象 yes yes * * 3.3 静态属性举例:System.out; Math.PI * * * * * 4.引用static修饰方法:静态方法 * 1.随着类的加载而加载,可以通过“类.静态方法”的方式进行调用 * * 2. 静态方法 非静态方法 * 类 yes no * 对象 yes yes * * 3. 静态方法中,只能调用静态的方法或属性 * 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性 * * 5.static注意点: * 5.1在静态的方法内,不能使用this关键字、super关键字 * 5.2 关于静态属性和静态方法的使用,大家都从声明周期的角度去理解 * * 6.开发中,如何确定一个属性是否要声明为static的? * > 属性是可以被多个对象所共享的,不会随着对象的不同而不同的 * * 开发中,如何确定一个方法是否要声明为static的? * > 操作静态属性的方法,通常设置为static的 * > 工具类中的方法,习惯上声明为static的。比如:Math,Arrays,Collections */public class StaticTest { public static void main(String[] args) { Chinese.nation="中国"; System.out.println(Chinese.nation); Chinese c1=new Chinese(); c1.name ="姚明"; c1.age=40; Chinese c2=new Chinese(); c2.name ="马龙"; c2.age=30; c1.nation ="CHN"; c2.nation ="CHINA"; System.out.println(c1.nation); System.out.println(Chinese.nation); c1.eat(); Chinese.show(); System.out.println(c1.name); } } class Chinese{ String name; int age; static String nation; public void eat(){ //在非静态方法中可以随意调用 System.out.println("中国人吃中餐"); name="Tom"; System.out.println(Chinese.nation); walk(); } //在静态方法中只能调用静态方法和属性 public static void show(){ //name="Tom"; System.out.println(Chinese.nation); walk(); } public static void walk() { } }
2.理解main方法的语法
package shangguigu.java2;/* *main()方法的使用说明: * 1.main()方法作为程序的入口 * 2.main()方法也是一个普通的静态方法 * 3.mian()方法也可以作为我们与控制台交互的方式。(之前使用Scanner) * * */public class MainTest { public static void main(String[] args) {//入口 Main.main(new String[100]); MainTest test =new MainTest(); test.show(); } public void show() { }}class Main{ public static void main(String[] args) { for(int i=0;i<args.length;i++){ args[i]="args_ "+i; System.out.println(args[i]); } }}package shangguigu.java2;import java.util.Scanner;public class MainDemo { public static void main(String[] args) { for(int i=0;i<args.length;i++){ System.out.println("********"+args[i]); int num =Integer.parseInt(args[i]); System.out.println("@@@@@@@"+num); } }}
3.类的成员之四:代码块
3.1代码块的使用
package com.shangguigu.java;import org.omg.CORBA.PUBLIC_MEMBER;import atguigu.java2.StaticTest;/* *类的成员之四:代码块(或初始化块) * * 1.代码块的作用:用来初始化类或对象 * 2.代码块如果有修饰的话,只能使用static * 3.分类:静态代码块 vs 非静态代码块 * * 4.静态代码块 * >内部可以有输出语句 * >随着类的加载而执行,而且只执行一次 * >作用:初始化类的信息 * >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行 * >静态代码块的执行要优先于非静态代码块 * >静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构 * * 5.非静态代码块 * >内部可以有输出语句 * >随着对象的创建而执行 * >每创建一个对象,就执行一次 * >作用:可以在创建对象时,对对象的属性等进行初始化 * >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行 * >非静态代码块内可以调用静态的属性、静态的方法,或调用非静态的属性和方法 * * * */public class BlockTest { public static void main(String[] args) { String desc=Person.desc; System.out.println(desc); Person p1 =new Person(); Person p2 =new Person(); System.out.println(p1.age); Person.info(); }}class Person{ //属性 String name; int age; static String desc="我是一个人"; //构造器 public Person(){ } public Person(String name,int age){ this.name =name; this.age=age; } //static代码块 跟随着类的加载就自己执行了 static{ System.out.println("hello,static block-1"); desc ="我是一个爱学习的人"; } static{ System.out.println("hello,static block-2"); } //非static代码块 { System.out.println("hello,block-1"); age=1; } { System.out.println("hello,block-2"); age=1; } //方法 public void eat(){ System.out.println("吃饭"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public static void info(){ System.out.println("我是一个快乐的人!"); }}
3.2属性赋值的执行先后顺序
package com.shangguigu.java;/* * 对属性可以赋值的位置: * 1.默认初始化 * 2.显式初始化、5.在代码块中赋值 * 3.构造器中初始化 * 4.有了对象以后,可以通过“对象.属性” 或“对象.方法”的方式,进行赋值 * * * 执行的先后顺序:①--②/⑤--③---④ */public class OrderTest { public static void main(String[] args) { Order order =new Order(); System.out.println(order.orderId); }}class Order{ int orderId=3; { orderId=4; }}
4.关键字:final
package com.shangguigu.java;/* *final 最终的 * * 1.final可以用来修饰的结构:类、方法、变量 * * 2.final 用来修饰一个类:此类不能被其他类所继承 * 比如:String类、System类、StringBuffer类 * * 3.final 用来修饰方法:表明方法不可以被重写 * 比如:object类的getClass(); * * 4.final 用来修饰变量:此时的“变量”就称为是一个常量 * 4.1 final修饰属性:可以考虑赋值的位置有:显式初始化、代码块的初始化、构造器的初始化 * 4.2 final修饰局部变量: * 尤其是用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内 * 使用此形参,但不能重新赋值 * * static final 用来修饰属性:全局常量 * */public class FinalTest { //The final field FinalTest.width cannot be assigned final int width = 10;//显示赋值 final int left; final int right; //代码块的初始化 { left=1; } //构造器的初始化 public FinalTest(){ right =2; } //不可以使用对象.方法来进行调用// public void setDown (int down){// this.Down=down;// } public void doWidth(){ //width=20; } public void show(){ final int NUM=10; //The final local variable NUM cannot be assigned. It must be blank and not using a compound assignment //NUM+=20; } //将形参定义成final是可以进行输出的调用的,但是不可以进行再修改 public void show(final int num){ //num=200; //The final local variable num cannot be assigned. System.out.println(num); } public static void main(String[] args) { int num=10; num= num + 5; }}final class FinalA{}////class B extends FinalA{// //}//String类不能被继承//class c extends String{// //}class AA{ public final void show(){ }}class BB extends AA{ //show继承与final类不能被重写// public void show(){// // }}
5.抽象类与抽象方法
5.1abstract关键字的使用
package com.shangguigu.java;/* * abstract关键字的使用 * 1.abstract:抽象的 * 2.abstract可以用来修饰的结构:类、方法 * * 3.abstract修饰类:抽象类 * >此类不能实例化 * >抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程) * >开发中,都会提供抽象类的子类,让子类对象进行实例化,完成相关的操作 * * 4.abstract修饰方法:抽象方法 * >抽象方法只有方法的声明,没有方法体 * >包含抽象方法的类,一定是抽象类。反之,抽象类中是可以没有抽象方法的 * >若子类重写了父类中所有的抽象方法后,此子类方可实例化 * >若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract来进行修饰 * * * * */public class AbstractTest { public static void main(String[] args) { //Cannot instantiate the type Person //一旦Person类抽象了,就不可以实例化了// Person p1=new Person();// p1.eat(); }}abstract class Creature{ public abstract void breath();}abstract class Person extends Creature{ String name; int age; public Person(){ } public Person(String name,int age){ this.name=name; this.age=age; } //不是抽象方法// public void eat(){// // } //抽象方法 public abstract void eat(); public void walk(){ System.out.println("人走路"); }} class Student extends Person{ public Student(String name,int age){ super(name,age); } public void eat(){ System.out.println("孩子应该多吃有点营养的食物"); } @Override public void breath() { System.out.println("学生应该要呼吸新鲜的空气"); }}
5.2abstract使用上的注意点
package com.shangguigu.java;/* * abstract使用上的注意点: * 1.abstract不能用来修饰:属性、构造器等结构 * * 2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类 * * * * */public class AbatractTest1 {}
6.接口(interface)
6.1接口的定义
package com.shangguigu.java3;/* *接口的使用 *1.接口使用interface来定义 *2.Java中,接口和类是并列的两个结构 *3.如何定义接口,定义接口中的成员 * * 3.1 JDK7及以前:只能定义全局常量和抽象方法 * >全局常量:public static final的,但是书写的时候,可以省略不写 * >抽象方法:public abstract的 * * * 3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略) * * 4.接口中不能定义构造器的!意味着接口不可以实例化 * * 5.Java开发中,接口都通过让类去实现(implements)来使用 * 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化 * 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍然是一个抽象类 * * 6.Java类可以实现多个接口 ---> 弥补了java单继承性的局限性问题 * 格式:class AA extends BB implement CC,DD,EE * * 7.接口与接口之间可以继承,而且可以多继承 * * ******************************************************************* * 8.接口的具体使用,体现多态性 * 9.接口,实际上就可以看做是一种规范 * * * */public class InterfaceTest { public static void main(String[] args) { System.out.println(Flyable.MAX_SPEED); System.out.println(Flyable.MIN_SPEED); Plane p1=new Plane(); p1.fly(); }}interface Flyable{ //全局常量 public static final int MAX_SPEED =7900; //第一宇宙速度 int MIN_SPEED =1;//省略了public static final //抽象方法 public abstract void fly(); void stop();//省略了 public abstract //Interfaces cannot have constructors //public Flyable(){}}interface Attackable{ Void attack();} class Plane implements Flyable{ //implements com.shangguigu.java3.Flyable.fly @Override public void fly() { System.out.println("通过引擎起飞"); } @Override public void stop() { System.out.println("驾驶员减速停止"); }} //因为没有重写所有的方法,所以仍旧是一个抽象类 abstract class kite implements Flyable{ @Override public void fly() { } } //Bullet类可以实现等多个接口,要继承接口CC,那同时就需要满足AA和BB的父接口的方法 class Bullet extends Object implements Flyable,Attackable,CC{ @Override public Void attack() { // TODO Auto-generated method stub return null; } @Override public void fly() { // TODO Auto-generated method stub } @Override public void stop() { // TODO Auto-generated method stub } @Override public void method() { // TODO Auto-generated method stub } @Override public void method2() { // TODO Auto-generated method stub } } //************************************************* interface AA{ void method (); } interface BB{ void method2 (); } interface CC extends AA,BB{ }
6.2接口的使用方法
package com.shangguigu.java3;/* * 接口的使用 * 1.接口的使用上也满足多态性 * 2.接口实际上是定义了一种规范 * 3.开发中,体会面向接口编程 * * * * * */public class USBTest { public static void main(String[] args) { Computer com =new Computer(); //1.创建了接口的非匿名实现类的非匿名对象 Flash flash =new Flash(); com.transferData(flash); //2.创建了接口的非匿名实现类的匿名对象 com.transferData(new Printer()); //3.创建了接口的匿名实现类的非匿名对象 USB phone =new USB(){ @Override public void start() { System.out.println("手机开始工作"); } @Override public void stop() { System.out.println("手机结束工作"); } }; com.transferData(phone); //4.创建了接口的匿名实现类的匿名对象 com.transferData(new USB() { @Override public void stop() { System.out.println("MP3开始工作"); } @Override public void start() { System.out.println("MP3结束工作"); } }); }}class Computer{ public void transferData(USB usb){ usb.start(); System.out.println("具体的传输数据的细节"); usb.stop(); }}interface USB{ //定义了长、宽、最大最小的传输速度等 void start(); void stop();}class Flash implements USB{ @Override public void start() { System.out.println("U盘开始工作"); } @Override public void stop() { System.out.println("U盘结束工作"); }}class Printer implements USB{ @Override public void start() { System.out.println("打印机开始工作"); } @Override public void stop() { System.out.println("打印机结束工作"); }}
7.类的成员之五:内部类
package com.atguigu.java3;/* * * 类的内部成员之五:内部类 * 1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B就是外部类 * * 2.内部类的分类:成员内部类 (静态的和非静态的)vs 局部内部类(方法内、代码块内、构造器内) * * 3.成员内部类: * 一方面,作为外部类的成员: * >调用外部类的结构 * >可以被static修饰 * >可以被4种不同的权限修饰 * * 另一方面,作为一个类: * >类内可以定义属性、方法、构造器等 * >可以用final去修饰,表示此类不能被继承。言外之意,如果不使用final,是可以被继承的 * >可以被abstract修饰 * * * 4.关注如下3个问题 * 4.1 如何实例化成员内部类的对象 * 4.2 如何在成员内部类中区分调用外部类的结构 * 4.3 开发中局部内部类的使用 */public class InnerClassTest { public static void main(String[] args) { //创建Dog实例(静态的成员内部类): Person.Dog dog=new Person.Dog(); dog.show(); //创建一个Bird实例(非静态的成员内部类)// Person.Bird bd=new Person.Bird(); 错误的 Person p =new Person(); Person.Bird bird= p.new Bird(); bird.sing(); System.out.println(); bird.display("黄鹂"); }}class Person{ String name="杜鹃"; int age; public void eat(){ System.out.println("人吃饭"); } //静态成员内部类 static class Dog{ String name="小明"; int age; public void show(){ System.out.println("卡拉是条狗");// eat(); } } //非静态成员内部类 class Bird{ String name="小明"; public Bird(){ } public void sing(){ System.out.println("我是一只小小小鸟"); Person.this.eat();//调用外部类的属性 } public void display(String name){ System.out.println("**************************"); System.out.println(name);//方法的形参 System.out.println(this.name);//内部类的属性 System.out.println(Person.this.name);//外部类的属性 } } public void method(){ //局部内部类 class AA{ } //局部内部类 class BB{ } } public Person(){ class CC{ } }}
