zoukankan      html  css  js  c++  java
  • 0125 匿名对象 内部类 包 代码块

    1、匿名对象

    概念:是指只有创建对象语句,但是没有把对象赋值给某个变量

    例:创建一个匿名对象

    new Person();

    特点:

    (1)、创建对象可以直接用,没有变量名

    (2)、匿名对象没有指定变量名的时候,只能使用一次

    (3)、匿名对象可以作为方法接受参数、方法返回值使用

    例:创建一个Person类

    public class Person {
    	private String name;
    	private int age;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	public Person() {
    		super();
    	}
    	
    
    }
    

      创建一个测试类

    public class Demo01 {
    
    	public static void main(String[] args) {
    		new Person().getName();
    		get(new Person());
    	}
    	public static Person get(Person P){
    		return new Person();
    	}
    }
    

     2、内部类

    概念:写在其他类的内部,写在类内部的类叫做内部类,其他的可以叫做外部类。可以写在其他类的成员位置和局部位置,这些局部位置叫局部内部类,成员位置叫成员内部类(其实就是一个正常定义类的过程,包括修饰符继承实现的关系等,在内部类中可以直接访问外部类所有成员)

    (1)成员内部类

    类似类中的成员变量。

    创建格式:

    class 外部类 {

        修饰符 class 内部类 {

            //其他代码

    }

    }

    访问格式:

    外部类.内部类 变量名=new 外部类().new 内部类();

    例:创建一个Outer类,内写一个内部类Inner

    //外部类
    public class Outer {
    
    	int a=1;
    	//内部类
    	class Inner{
    		int a=2;
    		public void in(){
    			int a=3;
    			System.out.println(a);//3局部变量
    			System.out.println(this.a);//2内部类变量
    			System.out.println(Outer.this.a);//1外部类成员变量
    		}
    	}
    }
    

      创建一个测试类

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

    (2)局部内部类

    局部内部类定义在类中的方法中的类,类似方法中的局部变量

    定义格式:

    class 外部类 {

        修饰符 返回值类型 方法名(参数) {

    class 内部类 {

    //其他代码

    }

    }

    }

    例:创建一个outer类写一个局部内部类

    public class Outer {
    	public void out(){
    		class Inner{
    			public void in(){
    				System.out.println("这是内部类方法");
    			}
    		}
    		Inner i=new Inner();
    		i.in();
    	}
    
    }
    

      注:上述中的Inner写在了out方法内,所以是个局部内部类,此时只能在这个方法中才能够访问到这个局部内部类,测试时,可以通过创建Outer对象来调用这个out方法 达到访问的目的

    3、内部类的实际应用--匿名内部类

    概念:定义某一指定类型的子类,定义后即可创建这一子类对象

    作用:匿名内部类是创建某个子类对象的快捷方式

    格式:

    new 父类或接口{

      重写的方法

    };

    例:创建一个接口

    public interface Smoking {
    
    	public abstract void smoke();
    }
    

      创建一个测试类,创建这个接口的子类对象,并且调用方法

    public class Demo02 {
    
    	public static void main(String[] args) {
    		new Smoking(){
    			public void smoke() {
    				System.out.println("学生抽烟");
    			}		
    		}.smoke();
    	}
    
    }
    

      注:既然他是个子类对象,就可以通过.方法名来调用这个方法。

    如果这个smoking接口中有两个方法,那我创建子类的时候重写两个方法,怎样实现这两个方法 的调用呢

    代码演示

    public interface Smoking {
    
    	public abstract void smoke();
    	public abstract void drink();
    }
    

      注:此刻这个接口中我创建了两个方法

    public class Demo02 {
    
    	public static void main(String[] args) {
                    //多态
    		Smoking s=new Smoking(){
    			public void smoke() {
    
    				System.out.println("学生抽烟");
    			}
    
    			public void drink() {
    
    				System.out.println("学生喝酒");
    			}
    			
    		};
    		s.smoke();
    		s.drink();
    	}
    
    }            
    

      注:我创建的是一个子类对象,我将这个子类对象赋值给父类引用的变量名s,(即,父类引用变量,指向子类对象)这就是运动了多态

    4、包

    概念,包其实就是文件夹,包里存放的是类文件夹

    类中包的声明格式:

    package 包名.包名.包名;例:package com.orcale.demo02;

    包的反问格式

    包名.包名...类名 例:java.util.Scanner;

    导包格式:

    import 包名.包名..类名 例:import java.util.Scanner;

    5、访问修饰符

    java中右四大访问修饰符:public protected default(这个是默认的不写)private;

    public :在同一类中,同一包中(包含子类,无关类),不同包的子类,不同包的无关类 都可以访问到

    protected:在同一类中,同一包中(包含子类,无关类),不同包的子类。可以访问

    default:这个是不写的修饰符。只能在同一类中,在同一包中(包含子类,无关类)可以访问

    private :只能在本类中才能访问

    例:创建一个A类

    public class A {
    
    	private int a=1;
    	protected int b=2;
    	int c=3;
    	public int d=4;
    	public void a(){
    		System.out.println(a);
    		System.out.println(b);
    		System.out.println(c);
    		System.out.println(d);
    	}
    }
    

      注:这四种类型,在本类中都可以被访问到

    创建一个B类与A在同一个包下,继承A类,再分别访问一下这四个类型

    public class B extends A {
    
    	public void get(){
    		//System.out.println(a);a是私有权限 只能在本类中访问
    		System.out.println(b);
    		System.out.println(c);
    		System.out.println(d);
    	}
    }
    

      注:只有a被private修饰,所以在同一包中(包含子类,无关类)除了私有权限不能被访问外,其他都能访问到

    创建一个C类,与A,B 不同包,再来访问一下这四个类型

    import com.orcale.demo03.A;
    
    public class C extends A {
    
    	public void get(){
    		//System.out.println(a);a是私有权限 只能在本类中访问
    		System.out.println(b);
    		//System.out.println(c);默认权限只能在本包中访问
    		System.out.println(d);
    	}
    }
    

      注:首先a有私有权限不能被访问,c是默认的default权限,其不能被不同包访问

    创建一个D类与C同包,但与C,A B都没有关系

    import com.orcale.demo03.A;
    
    public class D {
    
    	public void get(){
    		//System.out.println(a);a是私有权限 只能在本类中访问
    		//System.out.println(new A().b);//受保护权限
    		//System.out.println(c);默认权限只能在本包中访问
    		System.out.println(new A().d);
    	}
    }
    

      注:首先a有私有权限不能被访问,b,是受保护权限,不能被不同包的无关类访问c是默认的default权限,其不能被不同包访问

    6、代码块

    (1)局部代码块

    局部代码块时定义在方法或者语句中的,以{}划定的代码区域,只需要关注作用域不同即可,方法和类都是利用代码块来划分界限的

    例:

    public class Demo01 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		int a=1;
    		{
    			int b=2;
    			System.out.println(a);
    			System.out.println(b);
    		}
    		System.out.println(a);
    		//访问不到里边的System.out.println(b);
    	}
    
    }
    

      注:在大括号外边访问不到大括号内部的b变量

    (2)构造代码块

    构造代码块定义在类的成员变量位置的代码块

    优先于构造方法执行,用于执行所有对象均需要初始化的操作,每创建一个对象就会执行一次构造代码块

    例:

    public class Person {
    //构造代码块
    	{
    		System.out.println("这是构造代码块");
    	}
    	public Person(){
    		System.out.println("这是构造方法");
    	}
    }
    

      

    public class Demo02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		Person p=new Person();
    		Person p2=new Person();
    	}
    
    }
    

      运行结果为:

    这是构造代码块
    这是构造方法
    这是构造代码块
    这是构造方法

    (3)静态代码块

    写在类中成员变量的位置,用static关键字修饰

    优先于构造方法试行,当以任意形式使用到该类时使用,无论创建多少个类对象,静态代码块只执行一次

    public class Person {
    //构造代码块
    	{
    		System.out.println("这是构造代码块");
    	}
    	public Person(){
    		System.out.println("这是构造方法");
    	}
    	//静态代码块 优先于构造代码块,以任意形式第一次使用到该类的时候执行
    	static{
    		System.out.println("这是静态代码块");
    	}
    }
    

      还是上方的测试类运行

    这是静态代码块
    这是构造代码块
    这是构造方法
    这是构造代码块
    这是构造方法

  • 相关阅读:
    【Luogu】P3381最小费用最大流模板(SPFA找增广路)
    【Luogu】P1393动态逆序对(树套树)
    【Luogu】P2617Dynamic Ranking(树状数组套主席树)
    【Luogu】P2953牛的数字游戏(博弈论)
    【Luogu】P2530化工厂装箱员(DP)
    【Luogu】P3856公共子串(DP)
    【Luogu】P3847调整队形(DP)
    【Luogu】P3567Kur-Couriers(主席树)
    【Luogu】P3758可乐(矩阵优化DP)
    【Luogu】P1131时态同步(树形DP)
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14325856.html
Copyright © 2011-2022 走看看