对属性赋值的先后顺序
对属性可以赋值的位置
1.默认初始化
2.显式初始化
3.构造器中初始化
4.有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值
5.在代码块中赋值
执行的先后顺序1-2/5-3-4
6.4关键字:final
package atguigu.com; /* * 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 { final int width = 10; //public void doWidth(){ // width = 20; //} public static void main(String[] args) { int num = 10; num = num + 5; } } final class FinalA{ }
6.5抽象类和抽象方法
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
package atguigu.com; /* * abstract关键字的使用 * 1.abstract:抽象的 * 2.abstract可以用来修饰的结构:类、方法 * 3.abstract修饰类:抽象类 * >此类不能实例化 * >抽象类中一定有构造器,便于子类对象实例化调用(涉及:子类对象实例化全过程) * >开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作 * * * 4.abstract修饰方法:抽象方法 * >抽象方法只有方法的声明,没有方法体 * >包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。 * >若子类重写了父类中的所有的抽象方法后,此子类方可实例化 * 若子类没有重写父类中的所有的抽象方法后,则此子类也是一个抽象类,需要abstract修饰 * */ public class AbstractTest { public static void main(String[] args) { //一旦Person类实例化,就不可实例化 //Person p1 = new Person(); //p1.eat(); } } abstract class Person extends Creature{ String name; int age; public Person(){ } public Person(String name,int age){ this.name = name; this.age = age; } public abstract void eat(); public void walk(){ System.out.println("人走路"); } } abstract class Student extends Person{ public Student(String name,int age){ super(name,age); } public void eat(){ System.out.println("学生吃饭"); } } abstract class Creature{ public abstract void breath(); }
- abstract使用上的注意点:
- 1.abstract不能用来修饰:属性、构造器等结构
- 2.abstract不能用来修饰私有方法、静态方法、final的类,方法
抽象类的匿名子类
package atguigu.com; /* * 抽象类的匿名子类 * * */ public class PersonTest { public static void main(String[] args) { method(new Student());//匿名对象 Worker worker = new Worker(); method1(worker);//非匿名类、对象 method1(new Worker());//非匿名的类匿名的对象 System.out.println("*********************"); //创建了一匿名子类的对象,p Person p = new Person(){ @Override public void eat() { System.out.println("吃东西"); } @Override public void breath() { System.out.println("呼吸"); } }; method1(p); //创建匿名子类的匿名对象 method1(new Person(){ @Override public void eat() { System.out.println("吃好东西"); } @Override public void breath() { System.out.println("好好呼吸新鲜空气"); } }); } public static void method1(Person p){ p.eat(); p.breath(); } public static void method(Student s){ } } class Worker extends Person{ @Override public void eat() { } @Override public void breath() { } }
多态的应用:模板方法设计模式(TemplateMethod)
package atguigu.com; /* * 抽象类的应用:模板方法的设计模式 * * */ public class TemplateTest { public static void main(String[] args) { SubTemplate t = new SubTemplate(); t.spendTime(); } } abstract class Template{ //计算某段代码执行所需要花费的时间 public void spendTime(){ long start = System.currentTimeMillis(); this.code();//不确定的部分,易变的部分 long end = System.currentTimeMillis(); System.out.println("花费的时间为: " + (end - start)); } public abstract void code(); } class SubTemplate extends Template{ @Override public void code() { for(int i = 2;i <= 1000;i++){ boolean isFlag = true; for(int j = 2;j <= Math.sqrt(i);j++){ if(i % j == 0){ isFlag = false; break; } } if(isFlag){ System.out.println(i); } } } }
6.6接口(interface)
package atguigu2.com; /* * 接口的使用 * 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 implements CC,DD,EE * * 7.接口与接口之间可以继承,而且可以多继承 * ************************************** * 8.接口的具体使用,体现多态性 * 9.接口,实际上可以看作是一种规范 * * 面试题:抽象类与接口有哪些异同? */ public class InterfaceTest { public static void main(String[] args) { System.out.println(Flyable.MAX_SPEED); Plane plane = new Plane(); plane.fly(); } } interface Flyable{ //全局常量 public static final int MAX_SPEED = 7900;//第一宇宙速度 int MIN_SPEED = 1;//省略了public static final //抽象方法 public abstract void fly(); //省略了public abstract void stop(); } interface Attackable{ void attack(); } class Plane implements Flyable{ @Override public void fly(){ System.out.println("通过引擎起飞"); } @Override public void stop() { System.out.println("驾驶员减速停止"); } } abstract class Kite implements Flyable{ @Override public void fly() { } @Override public void stop() { } } class Bullet extends Object implements Flyable,Attackable{ @Override public void attack() { } @Override public void fly() { } @Override public void stop() { } }
接口的使用与匿名实现类的对象
package atguigu2.com; /* * 接口的使用 * 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 start() { System.out.println("mp3开始工作"); } @Override public void stop() { System.out.println("mp3结束工作"); } }); } } interface USB{ //常量:定义了长、宽、最大最小传输速度等 void start(); void stop(); } class Computer{ public void transferData(USB usb){ usb.start(); System.out.println("具体的传输数据的细节"); usb.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("打印机停止工作"); } }
接口的应用:代理模式
package com.atguigu.java1; /* * 接口的应用:代理模式 * */ public class NetWorkTest { public static void main(String[] args) { Server server = new Server(); // server.browse(); ProxyServer proxyServer = new ProxyServer(server); proxyServer.browse(); } } interface NetWork{ public void browse(); } //被代理类 class Server implements NetWork{ @Override public void browse() { System.out.println("真实的服务器访问网络"); } } //代理类 class ProxyServer implements NetWork{ private NetWork work; public ProxyServer(NetWork work){ this.work = work; } public void check(){ System.out.println("联网之前的检查工作"); } @Override public void browse() { check(); work.browse(); } }