Loading

package-内部类-四种权限修饰符


返回 我的技术栈(Technology Stack)



包的定义及注意事项


  • 定义包的格式

    • package 包名
    • 多级包用.分开即可
  • 定义包的注意事项

    • package语句必须是程序的第一条可执行的代码

    • package语句在一个Java文件中只能有一个

    • 如果没有package,默认表示无包名

      	package com.heima;
      	class Demo_package {
      		public static void main(String[] args) {
      			System.out.println("hahaha");
      		}
      	}
      
  • 如何编译运行带包的类?

    • 1、Javac编译的时候带上-d即可:javac -d . HelloWord.Java

    • 2、通过Java命令执行:Java 包名.HelloWord

      	package com.heima;
      	import com.baidu.Person;   //在开发中都是导入具体的类
      	class Demo_package {
      		public static void main(String[] args) {
      			Person p = new Person("张三",23);
      			System.out.println(p.getName() + "------" + p.getAge());
      		}
      	}
      
      	另一个.class文件
      	package com.baidu;
      	public class Person {
      		private String name;
      		private int age;
      
      		public Person() {}
      		public Person(String name,int age) {
      			this.name = name;
      			this.age = age;
      		}
      
      		public void setName(String name) {
      			this.name = name;
      		}
      		public String getName() {
      			return name;
      		}
      
      		public void setAge(int age) {
      			this.age = age;
      		}
      		public int getAge() {
      			return age;
      		}
      	}
      

四种权限修饰符的测试


   四种访问修饰符的权限:
                         本类       同一个包下(子类和无关类)  不同包下(子类)   不同包下(无关类)     
        private            Y      
        默认               Y            Y
        protected          Y            Y                          Y
        public             Y            Y                          Y                  Y

类及其组成所使用的常见修饰符


	       类及其组成所使用的常见修饰符
        1、修饰符:
              (1)权限修饰符:private,默认的,protected,public
              (2)状态修饰符:static,final
              (3)抽象修饰符:abstract

        2、类:
              (1)权限修饰符:默认的,public
              (2)状态修饰符:final
              (3)抽象修饰符:abstract

               *用的最多的是:public

        3、成员变量:
              (1)权限修饰符:private,默认的,protected,public
              (2)状态修饰符:static,final

               *用的最多的是:private

        4、构造方法:
              (1)权限修饰符:private,默认的,protected,public

               *用的最多的是:public

        5、成员方法:
              (1)权限修饰符:private,默认的,protected,public
              (2)状态修饰符:static,final
              (3)抽象修饰符:abstract

               *用的最多的是:public

        6、除此以外的组合规则:
              (1)成员变量:public static final
              (2)成员方法:public static
                             public abstract
                             public final

内部类概述及访问特点


  • 内部类与外部类的访问

      class InnerClass {
      	public static void mian(String [] agrs) {
      		 
      	 //外部类名.内部类名 = 外部类对象.内部类对象
      		 Outer.Inner oi = new Outer().new Inner();//创建内部类对象
      		 oi.method();
      }
    
      }
      class Outer {   //外部类
      	private int num = 10;   //内部类      可以直接访问外部类的成员,包括私有
      		class Inner {             //内部类
      		   public void method() {
      		         System.out.println(num);
      		   }
      	}
      }
    
      输出结果:10
    
  • 成员内部类私有使用

      class InnerClass {
      	public static void main(String [] agrs) {
      		Outer o = new outer();
      		o.print();
      	}
      }
      class Outer {
      	private int num = 10;
      	private class Inner {        //私有化
      		 public void method() {
      		      System.out.println(num);
      		 }
      	}
      	
      	public void print() {       //内部类私有的访问方法   通过创建外部类里的访问方法
      		 Inner i = new Inner();
      		 i.method();
      	}
      }
      
      输出结果:10
    
  • 静态成员内部类

              class InnerClass {
                 public static void mian(String [] agrs) {
                  //外部类名.内部类名 对象名 = 外部类名.内部类对象
                    // Outer.Inner oi = outer.new Inner();  一般会把new提前
                       Outer.Inner oi = new Outer.Inner();//创建内部类对象
                       oi.method();
    
                       Outer.Inner2.print();
                 }
              }
               class Outer {               //外部类
                    static class Inner {             //静态内部类 非静态方法
                         public void method() {
                               System.out.println("method");
                         }
                    }
    
                    static class Inner2 {           //静态内部类 静态方法
                         public static void print() {
                               System.out.println("print");
                         }
                    }
              }
    

成员内部类的面试题


要求在填空输出语句,在控制台输出30, 20, 10

	class Test_Innerclass {
		public static void main(String[] args) {
			Outer.Inner oi = new Outer().new Inner();
			oi.show();
		}
	}

	class Outer {
		public int num = 10;
		class Inner {
			public int num = 20;
			public void show() {
				int num = 30;
				System.out.println(num);
				System.out.println(this.num);
				System.out.println(outer.this.num);
			}
		}
	}

局部内部类访问局部变量的问题(很少出现)


         Class InnerClass {
              public static void main(String [] agrs) {
                  Outer o = new Outer();
                  o.method();
              }
         }
        //局部内部类
         class Outer {
              public void method() {
				  final int num = 10;
                  class Inner {
                      public void print() {
                          System.out.println(num);
                      }
                  }

                  Inner i = new Inner();
                  i.print();   //局部内部类只能在其所在的方法中访问
              }
         }

		 输出结果:10

		1、局部内部类访问局部变量必须用final修饰
		2、局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
		答:因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用         但是JDK1.8取消了这个事情,所以我觉得这是个bug

匿名内部类


  • 匿名内部类的格式和理解

      class Outer {
      	class Inner implements Inter {
      		public void print() {
      			System.out.println("print");
      		}
      	}
    
      	public void method() {
      		new Inter() {         //实现Inter接口
      			public void print() {     //重写抽象方法
      				System.out.println("print");
      			}
      		}.print();
      	}
      }
    
  • 匿名内部类重写多个方法调用

    • 匿名内部类只针对重写一个方法时候使用
    • 如果重写多个方法,子类要重写多次
  • 匿名内部类在开发中的应用

       有名字的来做
    
      	class Test {
      		public static void main(String[] args) {
      			PersonDemo pd = new PersonDemo();
      			pd.method(new Student());
      		}
      	}
    
      	//这里写抽象类,接口都行
      	abstract class Person {
      		public abstract void show();
      	}
    
      	class PersonDemo {
      		public void method(Person p) {   //Person p = new Student();
      			p.show();
      		}
      	}
    
      	class Student extends Person {
      		public void show() {
      			System.out.println("show");
      		}
      	}
    
    
      用匿名来做
      	class Test {
      		public static void main(String[] args) {
      			PersonDemo pd = new PersonDemo();
      			pd.method(new Person() {   //匿名内部类当作参数传递(本质把匿名内部类看做一个对象)
      				public void show() {
      					System.out.println("show");
      				}
      			});
      		}
      	}
    
      	//这里写抽象类,接口都行
      	abstract class Person {
      		public abstract void show();
      	}
    
      	class PersonDemo {
      		/*Person p = new Person() {   //父类引用指向子类对象
      			public void show() {
      				System.out.println("show");
      			}
      		}*/
      		public void method(Person p) {    
      			p.show();
      		}
      	}
    
      	class Student extends Person {
      		public void show() {
      			System.out.println("show");
      		}
      	}
    

匿名内部类的面试题


按要求补全代码,在控制台输出HelloWord!

	class Test {
		public static void main(String[] args) {
			Outer.method().show();
			//链式编程,每次调用方法后还能继续调用方法,证明调用方法返回的是对象
			//这里可以写成:Inter i = Outer.method();
							i.show();
		}
	}

	interface Inter {
		void show();
	}

	class Outer {//补全代码
		public static Inter method() {
			return new Inter() {
						public void show() {
							System.out.println("Helloword!");
						}	
					}
		}
	}

posted @ 2021-03-27 23:25  言非  阅读(115)  评论(0编辑  收藏  举报