[关闭]
@nextleaf 2018-08-09T19:21:33.000000Z 字数 5220 阅读 675

2018-08-09 工作日志

Java 数组 访问权限修饰符 内部类 继承


1. 二维数组

1.1 初始化

  1. //静态初始化
  2. //指定了值,就不能在【】中指定大小
  3. int[][] dyadicArray2=new int[][]{{1,2,3},{3,2,1},{1}};
  4. //动态初始化
  5. int[][] dyadicArray=new int[3][4];
  6. dyadicArray[0]=generateRandomNum(0, 10, 4);
  7. dyadicArray[1]=generateRandomNum(0, 10, 4);
  8. dyadicArray[2]=generateRandomNum(0, 10, 4);
  9. String[][] dyadicStringArray=new String[3][4];
  10. dyadicStringArray[0]=generateRandomNumber(0,10,4);
  11. dyadicStringArray[1]=generateRandomNumber(0,10,4);
  12. dyadicStringArray[2]=generateRandomNumber(0,10,4);
  13. //Console.log(dyadicArray);
  14. //Console.log(dyadicStringArray);
  15. int[][] dyadicArray3=new int[3][];

1.2 遍历

  1. //遍历二维数组
  2. System.out.println("遍历二维数组");
  3. ergodic(dyadicArray);
  4. ergodic(dyadicArray2);
  5. ergodic(dyadicStringArray);
  6. 。。。。
  7. public static void ergodic(int[][] darray){
  8. for (int[] i:darray){
  9. for (int j:i){System.out.print(j);}
  10. System.out.print(",");
  11. }
  12. System.out.println();
  13. }
  14. public static void ergodic(String[][] darray){
  15. for (String[] i:darray){
  16. for (String j:i){System.out.print(j);}
  17. System.out.print(",");
  18. }
  19. System.out.println();
  20. }

1.3 数组的复制

  1. /*
  2. * @Author 黄昭鸿
  3. * @Description 使用System.arraycopy复制数组
  4. * @Date 18-8-9 上午9:54
  5. * @Param []
  6. * @Return void
  7. **/
  8. public static void copyDyadicArray(){
  9. int[] a={88,99,77,1,2,3,4,5,6,7,8,9,0,6,9};
  10. int[] b={1,1,1,1,1,1,1,1,1,1};
  11. //对于一维基本数据类型数组来说,System.arraycopy这种复制属性值传递,修改副本不会影响原来的值
  12. //源数组,源数组起始位置,目标数组,目的数组放置的起始位置,复制的长度
  13. System.arraycopy(a,1,b,1,a.length-6);
  14. //对于二维或者一维数组中存放的是对象时,System.arraycopy复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组
  15. for (int i:b){System.out.print(i+".");}
  16. }

//二维数组常用方法

2. 对象数组

kkkk

3. 内部类

  1. /*
  2. * @Description 内部类InternalClassDemo
  3. * @Date 18-8-9 上午10:24
  4. **/
  5. public class InternalClassDemo{
  6. public static void main(String[] args) {
  7. new OutterClass();
  8. //必须通过外部类对象创建成员内部类的对象
  9. OutterClass.MemberInternalClass memberInternalClass=new OutterClass().new MemberInternalClass();
  10. //方式二
  11. OutterClass.MemberInternalClass memberInternalClass1=new OutterClass().getMICInstance();
  12. memberInternalClass.showInfo();
  13. memberInternalClass1.showInfo();
  14. //静态内部类不能使用外部类的非static成员变量或者方法
  15. new OutterClass.StaticInternalClass();
  16. }
  17. }
  18. class OutterClass {
  19. //构造方法
  20. public OutterClass() {
  21. //在外部类中,如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
  22. new MemberInternalClass().showInfo();
  23. }
  24. //成员方法
  25. public void showInfo(){
  26. System.out.println("外部类");
  27. //局部内部类
  28. class LocalInternalClass{
  29. public LocalInternalClass() {
  30. }
  31. }
  32. }
  33. public static void staticMethod(){
  34. System.out.println("外部类的静态方法");
  35. }
  36. public MemberInternalClass getMICInstance(){
  37. return new MemberInternalClass();
  38. }
  39. //成员内部类
  40. class MemberInternalClass{
  41. public MemberInternalClass() {}
  42. //同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员
  43. public void showInfo(){
  44. System.out.println("成员内部类");
  45. OutterClass.this.showInfo();
  46. }
  47. }
  48. //静态内部类
  49. static class StaticInternalClass{
  50. public StaticInternalClass() {
  51. //静态内部类不能使用外部类的非static成员变量或者方法
  52. staticMethod();
  53. }
  54. }
  55. //AnonymousInnerClass匿名内部类
  56. }

4. 四种访问权限修饰符

private、default(缺省不写)、protectedpublic
private和protected不能修饰接口

4.1 对类属性和方法的访问:

修饰符同一类内同一包内 子类其他包
privateyes
缺省yesyes
protectedyesyesyes
publicyesyesyesyes

注意:
在同包内,类中 protected 或 default 修饰的属性或方法可以被其对象外部访问,可以被子类继承。protected 或 default 的访问级别与 public 相同。
在异包内,,类中 protected 修饰的属性或方法不可以被其对象外部访问,可以被子类继承(同其他语言相同)。类中 default 修饰的属性或方法不可以被其对象外部访问,不可以被子类继承,此时 default 如同 private。

4.2 方法的继承规则:

父类中声明为 public 的方法在子类中也必须为 public。
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
父类中声明为 private 的方法,不能够被继承。

4.3 对于类:

public 或default(缺省不写),内部类可以private、protected

5. 封装Encapsulation

一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

5.1 封装的优点

  1. 良好的封装能够减少耦合。
  2. 类内部的结构可以自由修改。
  3. 可以对成员变量进行更精确的控制。
  4. 隐藏信息,实现细节。

5.2 实现Java封装的步骤

  1. 修改属性的可见性来限制对属性的访问(一般限制为private)
  2. 对每个值属性提供对外的公共方法访问(通常为getter和setter)

Kingdom.java

  1. package com.nl.sx809.JavaAccessModifiers;
  2. /*域(Domain)、界(Kingdom)、门(Phylum)、纲(Class)、目(Order)、科(Family)、属(Genus)、种(Species)*/
  3. interface Domain {
  4. public String vitalsigns();
  5. public void showInfo();
  6. }
  7. class Phylum extends Kingdom {
  8. protected String name="门";
  9. }
  10. class ClassT extends Phylum {
  11. public void changeName(){
  12. //此处将覆盖父类的name属性
  13. this.name="而非国际化女同胞拍马屁年龄在客户处副本";
  14. }
  15. }
  16. class Order extends ClassT {}
  17. class Family extends Order {}
  18. class Genus extends Family {}
  19. class Species extends Genus {}
  20. public class Kingdom implements Domain {
  21. /*
  22. * 方法的继承规则:
  23. * 父类中声明为 public 的方法在子类中也必须为 public。
  24. * 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
  25. * 父类中声明为 private 的方法,不能够被继承。
  26. * */
  27. protected String name="界";
  28. protected String signs="activity";
  29. public Kingdom() {}
  30. @Override
  31. public String vitalsigns() {
  32. return signs;
  33. }
  34. @Override
  35. public void showInfo() {
  36. System.out.println("I am "+vitalsigns()+",my name is "+name);
  37. }
  38. //getter、setter
  39. public void setSigns(String signs) {
  40. this.signs = signs;
  41. }
  42. public String getName() {
  43. return name;
  44. }
  45. public void setName(String name) {
  46. this.name = name;
  47. }
  48. }

AccessModifiersDemo.java

  1. package com.nl.sx809.JavaAccessModifiers;
  2. /*
  3. * Description:四种访问权限修饰符
  4. * `private`、default(缺省不写)、`protected`、`public`
  5. * private和protected不能修饰接口
  6. * 详见笔记https://www.zybuluo.com/nextleaf/note/1243720
  7. * @author 黄昭鸿
  8. * @date 2018/8/9 17:50
  9. * @param
  10. * @return
  11. */
  12. public class AccessModifiersDemo {
  13. public static void main(String[] args){
  14. Domain kingdom=new Kingdom();
  15. Kingdom phylum1=new Phylum();
  16. Kingdom phylum2=new Phylum2();
  17. Phylum classT1=new ClassT();
  18. ClassT order1=new Order();
  19. Order family1=new Family();
  20. Family genus1=new Genus();
  21. Genus species1=new Species();
  22. kingdom.showInfo();
  23. //属性没有多态性,其值取决于引用值
  24. //此处仍打印"界"
  25. System.out.println(phylum1.name);
  26. //通过构造方法覆盖属性值
  27. phylum2.showInfo();
  28. //方法具有多态性,可以借助继承的方法覆盖属性值
  29. classT1.setName("ClassTdemo");
  30. classT1.showInfo();
  31. order1.setName("OrderDemo");
  32. order1.showInfo();
  33. family1.setName("FamilyDemo");
  34. family1.showInfo();
  35. genus1.setName("GenusDemo");
  36. genus1.showInfo();
  37. species1.setName("SpeciesDemo");
  38. species1.showInfo();
  39. }
  40. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注