面向对象.png

1.关键字:static

  1. package atguigu.java2;
  2. import java.util.jar.Attributes.Name;
  3. /*
  4. * static 关键字的使用
  5. *
  6. * 1.static:静态的 (或类变量)
  7. * 2.static可以用来修饰:属性、方法、代码块、内部类
  8. *
  9. * 3.引用static修饰属性:静态变量
  10. * 3.1属性,按是否使用static修饰,又分为:静态 vs 非静态属性(实例变量)
  11. * 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的
  12. * 非静态属性时,不会导致其他对象中同样的属性值的修改
  13. * 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致
  14. * 其他对象调用此静态变量时,是修改过了的。
  15. * 3.2 static修饰属性的其他说明:
  16. * 1.静态变量随着类的加载而加载.可以直接通过“类.静态变量”的方式进行调用
  17. * 2.静态变量的加载要早于对象的创建
  18. * 3.由于类只会加载一次,则静态变量在内存中也只会存在一份
  19. *
  20. * 4. 类变量 实例变量
  21. * 类 yes no
  22. * 对象 yes yes
  23. *
  24. * 3.3 静态属性举例:System.out; Math.PI
  25. *
  26. *
  27. *
  28. *
  29. * 4.引用static修饰方法:静态方法
  30. * 1.随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
  31. *
  32. * 2. 静态方法 非静态方法
  33. * 类 yes no
  34. * 对象 yes yes
  35. *
  36. * 3. 静态方法中,只能调用静态的方法或属性
  37. * 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
  38. *
  39. * 5.static注意点:
  40. * 5.1在静态的方法内,不能使用this关键字、super关键字
  41. * 5.2 关于静态属性和静态方法的使用,大家都从声明周期的角度去理解
  42. *
  43. * 6.开发中,如何确定一个属性是否要声明为static的?
  44. * > 属性是可以被多个对象所共享的,不会随着对象的不同而不同的
  45. *
  46. * 开发中,如何确定一个方法是否要声明为static的?
  47. * > 操作静态属性的方法,通常设置为static的
  48. * > 工具类中的方法,习惯上声明为static的。比如:Math,Arrays,Collections
  49. */
  50. public class StaticTest {
  51. public static void main(String[] args) {
  52. Chinese.nation="中国";
  53. System.out.println(Chinese.nation);
  54. Chinese c1=new Chinese();
  55. c1.name ="姚明";
  56. c1.age=40;
  57. Chinese c2=new Chinese();
  58. c2.name ="马龙";
  59. c2.age=30;
  60. c1.nation ="CHN";
  61. c2.nation ="CHINA";
  62. System.out.println(c1.nation);
  63. System.out.println(Chinese.nation);
  64. c1.eat();
  65. Chinese.show();
  66. System.out.println(c1.name);
  67. }
  68. }
  69. class Chinese{
  70. String name;
  71. int age;
  72. static String nation;
  73. public void eat(){
  74. //在非静态方法中可以随意调用
  75. System.out.println("中国人吃中餐");
  76. name="Tom";
  77. System.out.println(Chinese.nation);
  78. walk();
  79. }
  80. //在静态方法中只能调用静态方法和属性
  81. public static void show(){
  82. //name="Tom";
  83. System.out.println(Chinese.nation);
  84. walk();
  85. }
  86. public static void walk() {
  87. }
  88. }

2.理解main方法的语法

  1. package shangguigu.java2;
  2. /*
  3. *main()方法的使用说明:
  4. * 1.main()方法作为程序的入口
  5. * 2.main()方法也是一个普通的静态方法
  6. * 3.mian()方法也可以作为我们与控制台交互的方式。(之前使用Scanner)
  7. *
  8. *
  9. */
  10. public class MainTest {
  11. public static void main(String[] args) {//入口
  12. Main.main(new String[100]);
  13. MainTest test =new MainTest();
  14. test.show();
  15. }
  16. public void show() {
  17. }
  18. }
  19. class Main{
  20. public static void main(String[] args) {
  21. for(int i=0;i<args.length;i++){
  22. args[i]="args_ "+i;
  23. System.out.println(args[i]);
  24. }
  25. }
  26. }
  27. package shangguigu.java2;
  28. import java.util.Scanner;
  29. public class MainDemo {
  30. public static void main(String[] args) {
  31. for(int i=0;i<args.length;i++){
  32. System.out.println("********"+args[i]);
  33. int num =Integer.parseInt(args[i]);
  34. System.out.println("@@@@@@@"+num);
  35. }
  36. }
  37. }

3.类的成员之四:代码块

3.1代码块的使用

  1. package com.shangguigu.java;
  2. import org.omg.CORBA.PUBLIC_MEMBER;
  3. import atguigu.java2.StaticTest;
  4. /*
  5. *类的成员之四:代码块(或初始化块)
  6. *
  7. * 1.代码块的作用:用来初始化类或对象
  8. * 2.代码块如果有修饰的话,只能使用static
  9. * 3.分类:静态代码块 vs 非静态代码块
  10. *
  11. * 4.静态代码块
  12. * >内部可以有输出语句
  13. * >随着类的加载而执行,而且只执行一次
  14. * >作用:初始化类的信息
  15. * >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
  16. * >静态代码块的执行要优先于非静态代码块
  17. * >静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
  18. *
  19. * 5.非静态代码块
  20. * >内部可以有输出语句
  21. * >随着对象的创建而执行
  22. * >每创建一个对象,就执行一次
  23. * >作用:可以在创建对象时,对对象的属性等进行初始化
  24. * >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
  25. * >非静态代码块内可以调用静态的属性、静态的方法,或调用非静态的属性和方法
  26. *
  27. *
  28. *
  29. */
  30. public class BlockTest {
  31. public static void main(String[] args) {
  32. String desc=Person.desc;
  33. System.out.println(desc);
  34. Person p1 =new Person();
  35. Person p2 =new Person();
  36. System.out.println(p1.age);
  37. Person.info();
  38. }
  39. }
  40. class Person{
  41. //属性
  42. String name;
  43. int age;
  44. static String desc="我是一个人";
  45. //构造器
  46. public Person(){
  47. }
  48. public Person(String name,int age){
  49. this.name =name;
  50. this.age=age;
  51. }
  52. //static代码块 跟随着类的加载就自己执行了
  53. static{
  54. System.out.println("hello,static block-1");
  55. desc ="我是一个爱学习的人";
  56. }
  57. static{
  58. System.out.println("hello,static block-2");
  59. }
  60. //非static代码块
  61. {
  62. System.out.println("hello,block-1");
  63. age=1;
  64. }
  65. {
  66. System.out.println("hello,block-2");
  67. age=1;
  68. }
  69. //方法
  70. public void eat(){
  71. System.out.println("吃饭");
  72. }
  73. @Override
  74. public String toString() {
  75. return "Person [name=" + name + ", age=" + age + "]";
  76. }
  77. public static void info(){
  78. System.out.println("我是一个快乐的人!");
  79. }
  80. }

3.2属性赋值的执行先后顺序

  1. package com.shangguigu.java;
  2. /*
  3. * 对属性可以赋值的位置:
  4. * 1.默认初始化
  5. * 2.显式初始化、5.在代码块中赋值
  6. * 3.构造器中初始化
  7. * 4.有了对象以后,可以通过“对象.属性” 或“对象.方法”的方式,进行赋值
  8. *
  9. *
  10. * 执行的先后顺序:①--②/⑤--③---④
  11. */
  12. public class OrderTest {
  13. public static void main(String[] args) {
  14. Order order =new Order();
  15. System.out.println(order.orderId);
  16. }
  17. }
  18. class Order{
  19. int orderId=3;
  20. {
  21. orderId=4;
  22. }
  23. }

4.关键字:final

  1. package com.shangguigu.java;
  2. /*
  3. *final 最终的
  4. *
  5. * 1.final可以用来修饰的结构:类、方法、变量
  6. *
  7. * 2.final 用来修饰一个类:此类不能被其他类所继承
  8. * 比如:String类、System类、StringBuffer类
  9. *
  10. * 3.final 用来修饰方法:表明方法不可以被重写
  11. * 比如:object类的getClass();
  12. *
  13. * 4.final 用来修饰变量:此时的“变量”就称为是一个常量
  14. * 4.1 final修饰属性:可以考虑赋值的位置有:显式初始化、代码块的初始化、构造器的初始化
  15. * 4.2 final修饰局部变量:
  16. * 尤其是用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内
  17. * 使用此形参,但不能重新赋值
  18. *
  19. * static final 用来修饰属性:全局常量
  20. *
  21. */
  22. public class FinalTest {
  23. //The final field FinalTest.width cannot be assigned
  24. final int width = 10;//显示赋值
  25. final int left;
  26. final int right;
  27. //代码块的初始化
  28. {
  29. left=1;
  30. }
  31. //构造器的初始化
  32. public FinalTest(){
  33. right =2;
  34. }
  35. //不可以使用对象.方法来进行调用
  36. // public void setDown (int down){
  37. // this.Down=down;
  38. // }
  39. public void doWidth(){
  40. //width=20;
  41. }
  42. public void show(){
  43. final int NUM=10;
  44. //The final local variable NUM cannot be assigned. It must be blank and not using a compound assignment
  45. //NUM+=20;
  46. }
  47. //将形参定义成final是可以进行输出的调用的,但是不可以进行再修改
  48. public void show(final int num){
  49. //num=200; //The final local variable num cannot be assigned.
  50. System.out.println(num);
  51. }
  52. public static void main(String[] args) {
  53. int num=10;
  54. num= num + 5;
  55. }
  56. }
  57. final class FinalA{
  58. }
  59. //
  60. //class B extends FinalA{
  61. //
  62. //}
  63. //String类不能被继承
  64. //class c extends String{
  65. //
  66. //}
  67. class AA{
  68. public final void show(){
  69. }
  70. }
  71. class BB extends AA{
  72. //show继承与final类不能被重写
  73. // public void show(){
  74. //
  75. // }
  76. }

5.抽象类与抽象方法

5.1abstract关键字的使用

  1. package com.shangguigu.java;
  2. /*
  3. * abstract关键字的使用
  4. * 1.abstract:抽象的
  5. * 2.abstract可以用来修饰的结构:类、方法
  6. *
  7. * 3.abstract修饰类:抽象类
  8. * >此类不能实例化
  9. * >抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
  10. * >开发中,都会提供抽象类的子类,让子类对象进行实例化,完成相关的操作
  11. *
  12. * 4.abstract修饰方法:抽象方法
  13. * >抽象方法只有方法的声明,没有方法体
  14. * >包含抽象方法的类,一定是抽象类。反之,抽象类中是可以没有抽象方法的
  15. * >若子类重写了父类中所有的抽象方法后,此子类方可实例化
  16. * >若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract来进行修饰
  17. *
  18. *
  19. *
  20. *
  21. */
  22. public class AbstractTest {
  23. public static void main(String[] args) {
  24. //Cannot instantiate the type Person
  25. //一旦Person类抽象了,就不可以实例化了
  26. // Person p1=new Person();
  27. // p1.eat();
  28. }
  29. }
  30. abstract class Creature{
  31. public abstract void breath();
  32. }
  33. abstract class Person extends Creature{
  34. String name;
  35. int age;
  36. public Person(){
  37. }
  38. public Person(String name,int age){
  39. this.name=name;
  40. this.age=age;
  41. }
  42. //不是抽象方法
  43. // public void eat(){
  44. //
  45. // }
  46. //抽象方法
  47. public abstract void eat();
  48. public void walk(){
  49. System.out.println("人走路");
  50. }
  51. }
  52. class Student extends Person{
  53. public Student(String name,int age){
  54. super(name,age);
  55. }
  56. public void eat(){
  57. System.out.println("孩子应该多吃有点营养的食物");
  58. }
  59. @Override
  60. public void breath() {
  61. System.out.println("学生应该要呼吸新鲜的空气");
  62. }
  63. }

5.2abstract使用上的注意点

  1. package com.shangguigu.java;
  2. /*
  3. * abstract使用上的注意点:
  4. * 1.abstract不能用来修饰:属性、构造器等结构
  5. *
  6. * 2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类
  7. *
  8. *
  9. *
  10. *
  11. */
  12. public class AbatractTest1 {
  13. }

6.接口(interface)

6.1接口的定义

  1. package com.shangguigu.java3;
  2. /*
  3. *接口的使用
  4. *1.接口使用interface来定义
  5. *2.Java中,接口和类是并列的两个结构
  6. *3.如何定义接口,定义接口中的成员
  7. *
  8. * 3.1 JDK7及以前:只能定义全局常量和抽象方法
  9. * >全局常量:public static final的,但是书写的时候,可以省略不写
  10. * >抽象方法:public abstract的
  11. *
  12. *
  13. * 3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
  14. *
  15. * 4.接口中不能定义构造器的!意味着接口不可以实例化
  16. *
  17. * 5.Java开发中,接口都通过让类去实现(implements)来使用
  18. * 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
  19. * 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍然是一个抽象类
  20. *
  21. * 6.Java类可以实现多个接口 ---> 弥补了java单继承性的局限性问题
  22. * 格式:class AA extends BB implement CC,DD,EE
  23. *
  24. * 7.接口与接口之间可以继承,而且可以多继承
  25. *
  26. * *******************************************************************
  27. * 8.接口的具体使用,体现多态性
  28. * 9.接口,实际上就可以看做是一种规范
  29. *
  30. *
  31. *
  32. */
  33. public class InterfaceTest {
  34. public static void main(String[] args) {
  35. System.out.println(Flyable.MAX_SPEED);
  36. System.out.println(Flyable.MIN_SPEED);
  37. Plane p1=new Plane();
  38. p1.fly();
  39. }
  40. }
  41. interface Flyable{
  42. //全局常量
  43. public static final int MAX_SPEED =7900; //第一宇宙速度
  44. int MIN_SPEED =1;//省略了public static final
  45. //抽象方法
  46. public abstract void fly();
  47. void stop();//省略了 public abstract
  48. //Interfaces cannot have constructors
  49. //public Flyable(){}
  50. }
  51. interface Attackable{
  52. Void attack();
  53. }
  54. class Plane implements Flyable{
  55. //implements com.shangguigu.java3.Flyable.fly
  56. @Override
  57. public void fly() {
  58. System.out.println("通过引擎起飞");
  59. }
  60. @Override
  61. public void stop() {
  62. System.out.println("驾驶员减速停止");
  63. }
  64. }
  65. //因为没有重写所有的方法,所以仍旧是一个抽象类
  66. abstract class kite implements Flyable{
  67. @Override
  68. public void fly() {
  69. }
  70. }
  71. //Bullet类可以实现等多个接口,要继承接口CC,那同时就需要满足AA和BB的父接口的方法
  72. class Bullet extends Object implements Flyable,Attackable,CC{
  73. @Override
  74. public Void attack() {
  75. // TODO Auto-generated method stub
  76. return null;
  77. }
  78. @Override
  79. public void fly() {
  80. // TODO Auto-generated method stub
  81. }
  82. @Override
  83. public void stop() {
  84. // TODO Auto-generated method stub
  85. }
  86. @Override
  87. public void method() {
  88. // TODO Auto-generated method stub
  89. }
  90. @Override
  91. public void method2() {
  92. // TODO Auto-generated method stub
  93. }
  94. }
  95. //*************************************************
  96. interface AA{
  97. void method ();
  98. }
  99. interface BB{
  100. void method2 ();
  101. }
  102. interface CC extends AA,BB{
  103. }

6.2接口的使用方法

  1. package com.shangguigu.java3;
  2. /*
  3. * 接口的使用
  4. * 1.接口的使用上也满足多态性
  5. * 2.接口实际上是定义了一种规范
  6. * 3.开发中,体会面向接口编程
  7. *
  8. *
  9. *
  10. *
  11. *
  12. */
  13. public class USBTest {
  14. public static void main(String[] args) {
  15. Computer com =new Computer();
  16. //1.创建了接口的非匿名实现类的非匿名对象
  17. Flash flash =new Flash();
  18. com.transferData(flash);
  19. //2.创建了接口的非匿名实现类的匿名对象
  20. com.transferData(new Printer());
  21. //3.创建了接口的匿名实现类的非匿名对象
  22. USB phone =new USB(){
  23. @Override
  24. public void start() {
  25. System.out.println("手机开始工作");
  26. }
  27. @Override
  28. public void stop() {
  29. System.out.println("手机结束工作");
  30. }
  31. };
  32. com.transferData(phone);
  33. //4.创建了接口的匿名实现类的匿名对象
  34. com.transferData(new USB() {
  35. @Override
  36. public void stop() {
  37. System.out.println("MP3开始工作");
  38. }
  39. @Override
  40. public void start() {
  41. System.out.println("MP3结束工作");
  42. }
  43. });
  44. }
  45. }
  46. class Computer{
  47. public void transferData(USB usb){
  48. usb.start();
  49. System.out.println("具体的传输数据的细节");
  50. usb.stop();
  51. }
  52. }
  53. interface USB{
  54. //定义了长、宽、最大最小的传输速度等
  55. void start();
  56. void stop();
  57. }
  58. class Flash implements USB{
  59. @Override
  60. public void start() {
  61. System.out.println("U盘开始工作");
  62. }
  63. @Override
  64. public void stop() {
  65. System.out.println("U盘结束工作");
  66. }
  67. }
  68. class Printer implements USB{
  69. @Override
  70. public void start() {
  71. System.out.println("打印机开始工作");
  72. }
  73. @Override
  74. public void stop() {
  75. System.out.println("打印机结束工作");
  76. }
  77. }

7.类的成员之五:内部类

  1. package com.atguigu.java3;
  2. /*
  3. *
  4. * 类的内部成员之五:内部类
  5. * 1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B就是外部类
  6. *
  7. * 2.内部类的分类:成员内部类 (静态的和非静态的)vs 局部内部类(方法内、代码块内、构造器内)
  8. *
  9. * 3.成员内部类:
  10. * 一方面,作为外部类的成员:
  11. * >调用外部类的结构
  12. * >可以被static修饰
  13. * >可以被4种不同的权限修饰
  14. *
  15. * 另一方面,作为一个类:
  16. * >类内可以定义属性、方法、构造器等
  17. * >可以用final去修饰,表示此类不能被继承。言外之意,如果不使用final,是可以被继承的
  18. * >可以被abstract修饰
  19. *
  20. *
  21. * 4.关注如下3个问题
  22. * 4.1 如何实例化成员内部类的对象
  23. * 4.2 如何在成员内部类中区分调用外部类的结构
  24. * 4.3 开发中局部内部类的使用
  25. */
  26. public class InnerClassTest {
  27. public static void main(String[] args) {
  28. //创建Dog实例(静态的成员内部类):
  29. Person.Dog dog=new Person.Dog();
  30. dog.show();
  31. //创建一个Bird实例(非静态的成员内部类)
  32. // Person.Bird bd=new Person.Bird(); 错误的
  33. Person p =new Person();
  34. Person.Bird bird= p.new Bird();
  35. bird.sing();
  36. System.out.println();
  37. bird.display("黄鹂");
  38. }
  39. }
  40. class Person{
  41. String name="杜鹃";
  42. int age;
  43. public void eat(){
  44. System.out.println("人吃饭");
  45. }
  46. //静态成员内部类
  47. static class Dog{
  48. String name="小明";
  49. int age;
  50. public void show(){
  51. System.out.println("卡拉是条狗");
  52. // eat();
  53. }
  54. }
  55. //非静态成员内部类
  56. class Bird{
  57. String name="小明";
  58. public Bird(){
  59. }
  60. public void sing(){
  61. System.out.println("我是一只小小小鸟");
  62. Person.this.eat();//调用外部类的属性
  63. }
  64. public void display(String name){
  65. System.out.println("**************************");
  66. System.out.println(name);//方法的形参
  67. System.out.println(this.name);//内部类的属性
  68. System.out.println(Person.this.name);//外部类的属性
  69. }
  70. }
  71. public void method(){
  72. //局部内部类
  73. class AA{
  74. }
  75. //局部内部类
  76. class BB{
  77. }
  78. }
  79. public Person(){
  80. class CC{
  81. }
  82. }
  83. }

image.png